网站建设专题页,那个做网站好,wordpress首页表单,广州 网站建设网络推广网页设计1. 意外的发现 在学习使用grun命令时#xff0c;从未遇到过错误 最近使用grun命令#xff0c;却遇到了NoClassDefFoundError的错误#xff0c;使得grun测试工具无法成功启动 错误复现#xff1a; 使用antlr4命令编译Hello.g4文件#xff0c;并为指定package#xff08;…1. 意外的发现 在学习使用grun命令时从未遇到过错误 最近使用grun命令却遇到了NoClassDefFoundError的错误使得grun测试工具无法成功启动 错误复现 使用antlr4命令编译Hello.g4文件并为指定packagecom.sunrise.helloantlr4 Hello.g4 -o ../java/com/sunrise/hello -package com.sunrise.hello最终生成的Java代码如下 使用mvn clean compile命令编译整个project在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