使用输出目录 -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/&ltversion&gt/antlr-&ltversion&gt-complete.jar:$CLASSPATH" antlr &ltgrammarName&gt.g4 -o &ltsomeFolder&gt/ javac &ltsomeFolder&gt/&ltgrammarName&gt*.java

但是当我使用指令here:

grun <someFolder>/<grammarName> tokens -tokens < <inputFile>

我收到以下错误消息:

线程“main”中的异常 java.lang.NoClassDefFoundError: IllegalName: &ltsomeFolder&gt/&ltgrammarName&gtLexer 在 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 类位于 中。请务必在该文件夹中编译它们。

然后您需要将该文件夹添加到您的类路径(可能而不是“.”)

尝试将 添加到您要导出的 CLASSPATH 中。然后把它从你的 grun 命令行中去掉。

Java 只会从 Classpath 加载类(这是一个安全问题)。当 TestRig 运行时,它会尝试通过构建它为 Parser 生成的 Java 类名来加载您的类(Java 必须在类路径中的某处找到该类)。

您的可以修改grun 别名以允许您指定一个目录来搜索您的类,并在Java 命令上使用-cp 选项,但这可能比只需将其添加到您用于此测试的类路径中即可。

【讨论】:

所以应该像export CLASSPATH="./&lt;someFolder&gt;:/usr/local... 您的 中有 *.class 文件吗?它们应该在编译 ANTLR 放在那里的 *.java 文件时出现。此外,运行 grun 时不应指定该文件夹。

以上是关于使用输出目录 -o 选项时,TestRig/grun 会丢弃 java.lang.NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

使用nohup在后台执行python程序时需要增加-u选项才能马上通过print()输出日志

Linux下编译软件时指定安装目录

将“复制到输出目录”的默认选项设置为“始终复制”

pwd 显示当前所在的工作路径

关于pwd命令小技巧-确认当前工作目录的绝对路径中是否包含软链接目录名

linux_目录基本操作