使用输出目录 -o 选项时,TestRig/grun 会丢弃 java.lang.NoClassDefFoundError
Posted
技术标签:
【中文标题】使用输出目录 -o 选项时,TestRig/grun 会丢弃 java.lang.NoClassDefFoundError【英文标题】:TestRig / grun drops java.lang.NoClassDefFoundError when using the output directory -o option 【发布时间】:2021-07-01 17:10:54 【问题描述】:按照this post,我正在使用以下步骤从this repository 编译解析器/词法分析器:
export CLASSPATH=".:/usr/local/Cellar/antlr/<version>/antlr-<version>-complete.jar:$CLASSPATH" antlr <grammarName>.g4 -o <someFolder>/ javac <someFolder>/<grammarName>*.java但是当我使用指令here:
grun <someFolder>/<grammarName> tokens -tokens < <inputFile>
我收到以下错误消息:
线程“main”中的异常 java.lang.NoClassDefFoundError: IllegalName: <someFolder>/<grammarName>Lexer 在 java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:889) 在 java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1014) 在 java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151) 在 java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:825) 在 java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:723) 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:646) 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:604) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) 在 org.antlr.v4.gui.TestRig.process(TestRig.java:129) 在 org.antlr.v4.gui.TestRig.main(TestRig.java:119)如果您能帮助我了解问题所在以及如何解决,我将不胜感激。
【问题讨论】:
【参考方案1】:我没有看到你在哪里指定了包名,所以现在你的 Java 类位于
然后您需要将该文件夹添加到您的类路径(可能而不是“.”)
尝试将
Java 只会从 Classpath 加载类(这是一个安全问题)。当 TestRig 运行时,它会尝试通过构建它为 Parser 生成的 Java 类名来加载您的类(Java 必须在类路径中的某处找到该类)。
您的可以修改grun
别名以允许您指定一个目录来搜索您的类,并在Java 命令上使用-cp
选项,但这可能比只需将其添加到您用于此测试的类路径中即可。
【讨论】:
所以应该像export CLASSPATH="./<someFolder>:/usr/local...
您的 以上是关于使用输出目录 -o 选项时,TestRig/grun 会丢弃 java.lang.NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章
使用nohup在后台执行python程序时需要增加-u选项才能马上通过print()输出日志