ANTLR4 TestRig (grun) генерирует исключение java.lang.NoClassDefFoundError

Я пытаюсь выучить ANTLR 4, и я следую примерам, приведенным в The Definitive ANTLR 4 Reference. К сожалению, я застрял на первом примере.


система:
Windows 10 (1703)
Java 8, обновление 151
АНТЛР 4, v4.7

мой %CLASSPATH% устанавливается как системная переменная (.;"D:\Program Files\Java\libs\antlr-4.7-complete.jar";).
я имею antlr4.bat а также grun.bat доступно в моем %PATH%и я могу бежать antlr4 из командной строки.

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

я использую -cp %CLASSPATH% явно, потому что я видел несколько других, имеющих проблемы, когда не используют -cp вариант.


Моя проблема заключается в следующем:
Когда я бегу grun на примере грамматики Hello (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 вариант.

Кто-нибудь знает почему это?

4 ответа

Решение

Вау... Решение было, конечно, простым решением... Моя проблема была в том, что у меня было cdв корневую папку моего тестового проекта, и мне просто нужно было cd к (и позвонить grun from) каталог, в котором находятся скомпилированные файлы.

Редактировать:
Кажется, у меня все еще есть проблема с grun, Смотрите отредактированный вопрос.

Edit2:
Из того, что я могу сказать, grun не очень хорошо сотрудничает с antlr4"s -package вариант.
Поэтому мое решение состояло в том, что я должен был настроить свой проект как проект Gradle, потому что, очевидно, это работает лучше.

Я столкнулся с той же проблемой, что и вы.
@DoTheGenes напомнил мне, что это может быть вызвано@header {package com.blahblah.antlr4.hello;}в вашем файле.g4. У Grun есть несколько не исправленных ошибок с командой перемещения пакета. Когда я удалил эту строку с помощью @header, проблема решилась, и я мог запускать grun gui, tree и любые другие команды с сгенерированными и скомпилированными файлами.
Надеюсь, это поможет.

Попробуйте полностью указать название грамматики для пакета, частью которого он является, например com.demo.pl.Grammar. Кажется, для работы с ANTLR 4.7.2

Я использую ANTLR 4.9.1, и у меня была такая же проблема. У моего макета проекта было уникальное и отдельное место для:

  • грамматика
  • сгенерированные исходные файлы (расположение, указанное в грамматике @header блокировать)

что всегда приводило к сбою (поскольку все должно быть в одной папке). Обходной путь заключался в создании другого скрипта, который исправляет эти 2 ошибки как таковые:

  1. Переместите все в 1 папку (исправьте первую ошибку)
  2. Удалять @header{...}из грамматики (исправить вторую ошибку)
  3. (Необязательно) Если у вас нет antlr в пути к классам, добавьте его
  4. Скомпилировать все файлы
  5. Запустить antlr4 (или же org.antlr.v4.Tool вручную) для создания файлов парсера
  6. Скомпилировать весь парсер .java файлы
  7. Запустить grun (или же org.antlr.v4.gui.TestRig вручную) с любым вариантом, который вы хотите

Следующий сценарий показывает, как я это сделал (имейте в виду, что ваши пути могут быть разными), в моем случае язык и проект называются Nameless и я использовал .g4test расширение для тестовых сценариев (так что адаптируйте свой Bash/ Batch/ PowerShell скрипты соответственно)

      # 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
Другие вопросы по тегам