首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR4 TestRig (grun)引发java.lang.NoClassDefFoundError异常

ANTLR4 TestRig (grun)引发java.lang.NoClassDefFoundError异常
EN

Stack Overflow用户
提问于 2017-11-05 12:27:17
回答 3查看 1.4K关注 0票数 3

我正在努力学习ANTLR 4,并且我正在遵循ANTLR 4参考中给出的例子。遗憾的是,我被第一个例子困住了。

系统:

Windows 10 (1703)

Java 8,更新151

ANTLR 4,v4.7

我的%CLASSPATH%被设置为一个系统变量(.;"D:\Program Files\Java\libs\antlr-4.7-complete.jar";)。

我的antlr4.batgrun.bat在我的%PATH%中可用,并且能够从命令行运行antlr4

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

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

我使用-cp %CLASSPATH%是显式的,因为我看到其他一些人在不使用-cp选项时出现了问题。

我的问题是:

当我在示例语法grun (grun Hello r -tokens)上运行时,我会得到以下错误消息

代码语言:javascript
复制
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 ),我成功地完成了这个示例。

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

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

有人知道这是为什么吗?

EN

回答 3

Stack Overflow用户

发布于 2020-01-20 06:59:28

我正面临着和你一样的问题。

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

希望这能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2019-04-08 09:40:00

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

票数 0
EN

Stack Overflow用户

发布于 2021-04-08 09:49:09

我使用的是ANTLR 4.9.1,我也有同样的问题。我的项目布局有一个独特和独立的位置:

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

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

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

下面的Bash/Batch/PowerShell脚本展示了我是如何做到这一点的(请记住,您的路径可能不同),在我的示例中,语言和项目被称为Nameless,我使用.g4test扩展来测试脚本(因此相应地调整您的.g4test脚本)

代码语言:javascript
复制
# 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47121549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档