Antlr4:使用grun命令,触发NoClassDefFoundError
创始人
2024-05-29 15:23:44
0

1. 意外的发现

  • 在学习使用grun命令时,从未遇到过错误

  • 最近使用grun命令,却遇到了NoClassDefFoundError的错误,使得grun测试工具无法成功启动

  • 错误复现:

    1. 使用antlr4命令编译Hello.g4文件,并为指定package(com.sunrise.hello
      antlr4 Hello.g4 -o ../java/com/sunrise/hello -package com.sunrise.hello
      
      最终生成的Java代码如下:
    2. 使用mvn clean compile命令编译整个project
    3. target/classes/com/sunrise/hello目录下执行grun命令解析token,出现NoClassDefFoundError的错误
  • 详细的错误日志如下:

    Exception in thread "main" java.lang.NoClassDefFoundError: HelloLexer (wrong name: com/sunrise/hello/HelloLexer)at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:763)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)at java.net.URLClassLoader.access$100(URLClassLoader.java:74)at java.net.URLClassLoader$1.run(URLClassLoader.java:369)at java.net.URLClassLoader$1.run(URLClassLoader.java:363)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:362)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)at org.antlr.v4.gui.TestRig.process(TestRig.java:129)at org.antlr.v4.gui.TestRig.main(TestRig.java:119)
    

2. 错误原因

  • 从报错信息看,貌似是HelloLexer有错误的包名,导致运行时JVM无法找到HelloLexer

  • 上网查阅NoClassDefFoundError的原因如下:

    NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误

  • 有一大堆文字,但是没看懂 😂 😂

  • 但是,对错误原因的简单描述跟当前情况十分吻合:生成的package为com.sunrise.hello的Java代码已经编译成功,但运行时却提示not found

  • 猜测:执行grun命令的路径不对,且作为GrammerName的Hello应该带包名

  • 验证猜测:回到target/classes目录,执行grun命令

    grun com.sunrise.hello.Hello r -tokens
    
  • 成功使用grun命令解析出tokens

3. 正确的解决办法

  • 使用grun测试lexer或parser时,如果生成的Java代码有设置package,需要到target/classes目录,并在GrammerName中使用类的完全限定名
  • 也就是需要带上package信息,就像下面的命令一样
    grun com.sunrise.hello.Hello r -tokens
    

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...