ANTLR4 TestRig(grun)抛出java.lang.NoClassDefFoundError异常

时间:2017-11-05 12:27:18

标签: java antlr4 grun

我正在尝试学习ANTLR 4,并且我按照 The Definitive ANTLR 4 Reference 中给出的示例进行操作。可悲的是,我坚持第一个例子。

系统:
Windows 10(1703)
Java 8,更新151
ANTLR 4,v4.7

我的%CLASSPATH%被设置为系统变量(.;"D:\Program Files\Java\libs\antlr-4.7-complete.jar";) 我的antlr4.bat中提供了grun.bat%PATH%,我可以从命令行运行antlr4

antlr4.batjava -cp %CLASSPATH% org.antlr.v4.Tool %*
grun.batjava -cp %CLASSPATH% org.antlr.v4.gui.TestRig %*

我明确使用-cp %CLASSPATH%因为我在未使用-cp选项时看到其他一些人遇到问题。

我的问题是:
当我在示例语法grunHello)上运行grun Hello r -tokens时,我收到此错误消息

Exception in thread "main" java.lang.NoClassDefFoundError: HelloLexer (wrong name: main/resource/hello/HelloLexer)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.antlr.v4.gui.TestRig.process(TestRig.java:129)
        at org.antlr.v4.gui.TestRig.main(TestRig.java:119)

对我做错的任何想法?
非常感谢提前!

修改
我以为我找到了答案。通过cd - 进入编译文件所在的文件夹(而不是从根项目文件夹中调用grun),我设法了解了相关示例。

但是当我尝试设置自己的项目时,我遇到了同样的问题,并带有与上面相同的错误消息。

这一次,在我使用grun选项运行antlr4之后似乎-package抱怨了。

有谁知道这是为什么?

3 个答案:

答案 0 :(得分:0)

尝试使用其所属的包对语法名称进行完全限定,例如 com.demo.pl.Grammar。似乎可以与ANTLR 4.7.2一起使用

答案 1 :(得分:0)

我使用的是 ANTLR 4.9.1,我遇到了完全相同的问题。我的项目布局有一个独特且独立的位置:

  • 语法
  • 生成的源文件(在语法中由 @header 块指定的位置)

这使得 grun 总是失败(因为一切都必须在同一个文件夹中)。解决方法是制作另一个脚本来修复这两个 grun 错误:

  1. 将所有内容移至 1 个文件夹 (修复第一个错误)
  2. 从语法中删除 @header{...} (修复第二个错误)
  3. (可选)如果类路径中没有 antlr,则添加它
  4. 编译所有 .java 文件
  5. 运行 antlr4(或手动 org.antlr.v4.Tool)生成解析器 .java 文件
  6. 编译所有解析器 .java 文件
  7. 使用您想要的任何选项运行 grun(或手动 org.antlr.v4.gui.TestRig

以下 PowerShell 脚本显示了我是如何做到的(请记住,您的路径可能不同),在我的情况下,语言和项目称为 Nameless,我使用了 {{1 }} 测试脚本的扩展(因此相应地调整您的 .g4test/Bash/Batch 脚本)

PowerShell

答案 2 :(得分:-1)

哇...当然,解决方案是一个简单的解决方案......我的问题是我已经cd到了我的测试项目的根文件夹,而我只需要cd来(并从中调用grun)编译文件所在的目录。

<德尔>编辑:
好像我仍然遇到grun的问题。见编辑问题。

EDIT2:
据我所知,grunantlr4的{​​{1}}选项不能很好地合作。
所以我的解决方案是我必须将我的项目设置为Gradle项目,因为显然效果更好。