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

ANTLR4 TestRig(grun)抛出java.lang.NoClassDefFoundError异常,java,antlr4,grun,Java,Antlr4,Grun,我正在尝试学习AntlR4,我正在遵循权威的AntlR4参考中给出的示例。遗憾的是,我被第一个例子困住了 系统: Windows 10(1703) Java 8,更新151 ANTLR 4,v4.7 我的%CLASSPATH%设置为系统变量(;“D:\Program Files\Java\libs\antlr-4.7-complete.jar”)。 我的%PATH%中有antlr4.bat和grun.bat,我可以从命令行运行antl4 antlr4.bat:java-cp%CLASSPATH

我正在尝试学习AntlR4,我正在遵循权威的AntlR4参考中给出的示例。遗憾的是,我被第一个例子困住了


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

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

antlr4.bat
java-cp%CLASSPATH%org.antlr.v4.Tool%*

grun.bat
java-cp%CLASSPATH%org.antlr.v4.gui.TestRig%*

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


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

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
-ing进入编译文件所在的文件夹(而不是从根项目文件夹调用
grun
),我成功地完成了所讨论的示例

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

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

有人知道为什么吗?

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

编辑:
似乎我仍然对
grun
有问题。见编辑后的问题

编辑2:
据我所知,
grun
antlr4
-package
选项配合不太好。

因此,我的解决方案是,我必须将我的项目设置为Gradle项目,因为这显然效果更好。

尝试用它所属的包完全限定语法名称,例如。
com.demo.pl.Grammar。似乎与ANTLR 4.7.2一起工作

我遇到了与您相同的问题
@DoTheGenes提醒我这可能是由.g4文件中的
@header{package com.blahblah.antlr4.hello;}
引起的。Grun使用包重定位命令有一些未修复的错误。当我用@header删除这一行时,问题解决了,我可以用生成和编译的文件运行grun gui、tree和任何其他命令。

希望这能有所帮助

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

  • 语法
  • 生成的源文件(语法中由
    @header
    块指定的位置)
这使得
grun
总是失败(因为所有内容都必须在同一个文件夹中)。解决方法是制作另一个脚本,修复以下2个
grun
错误:

  • 将所有内容移动到1个文件夹(修复第一个错误)
  • 从语法中删除
    @header{…}
    (修复第二个错误)
  • (可选)如果类路径中没有antlr,则添加它
  • 编译所有
    .java
    文件
  • 手动运行
    antl4
    (或
    org.antlr.v4.Tool
    )生成解析器
    .java
    文件
  • 编译所有解析器
    .java
    文件
  • 使用所需的任何选项手动运行
    grun
    (或
    org.antlr.v4.gui.TestRig
  • 下面的
    PowerShell
    脚本显示了我是如何做到这一点的(请记住,您的路径可能不同),在我的例子中,该语言和项目被称为
    Nameless
    ,我对测试脚本使用了
    .g4test
    扩展(因此相应地调整
    Bash
    /
    批处理
    /
    PowerShell
    脚本)


    你能详细说明你把它设置为gradle项目是什么意思吗?请更具体地回答。嗯。。我认为这绝对不是解决方案/答案lol。问题与@Yifeng所描述的完全一样,应该是实际的标记答案。这正是我遇到的问题,无论我做了什么,它都不会使用
    grun
    ,只通过代码运行(事后看来,这正是因为语法中的
    @头
    块). 据我所知,
    grun
    设计用于处理同一文件夹中的所有内容,而无需单独的软件包文件夹,请检查我的答案,以找到一个烦人但简单的解决方法(直到grun得到修复/更新)。
    # Script name : run.ps1
    # Script arguments
    param ($Target="-tokens")
    # Options
    $lang = "Nameless"
    $startRule = "file"
    
    # Paths
    $antlr = "D:\Desktop\Workspaces\Java\ANTLRv4\antlr-4.9.1-complete.jar"
    $project = "D:\Desktop\Workspaces\Java\Eclipse Workspace 2020\Nameless"
    $javas = "$project\target\generated-sources\antlr4\generated"
    $script = "$project\scripts\LiteralsTest.g4test"
    $classes = "$project\build\classes\generated"
    
    # Fix weird bug of TestRig needing all in 1 folder lol
    Write-Host "Moving project files.." -NoNewLine
    Copy-Item "$project\$lang.g4" -Destination $classes
    Copy-Item -Path "$javas\*" -Destination $classes
    cd $classes
    Write-Host " done."
    
    # Fix other framework bug that makes '@header' lines not run lol..
    Write-Host "Removing package header line from grammar.." -NoNewline
    (Get-Content -Path "$lang.g4" -Raw) -replace "(?sm)^@header`{.*?`}$" | Out-File -FilePath ".\$lang.g4" -Encoding ASCII
    Write-Host " done."
    
    # All should be good now, do the usual
    Write-Host "Adding to classpath temporarily.." -NoNewLine
    $env:CLASSPATH = ".;$antlr;$env:CLASSPATH"
    Write-Host " done."
    
    Write-Host "Generating Java files from grammar.." -NoNewLine
    java -cp ".;$antlr" org.antlr.v4.Tool "$lang.g4" -listener -visitor
    Write-Host " done."
    
    Write-Host "Compiling java files.." -NoNewLine
    javac -cp ".;$antlr" *.java
    Write-Host " done."
    
    Write-Host "Running.."
    java -Xmx500M -cp ".:$env:CLASSPATH" org.antlr.v4.gui.TestRig $lang $startRule $Target $script