类路径中的ClassDefNotFoundError

时间:2012-01-31 13:25:40

标签: java classpath antlr antlr3 classnotfoundexception

我正在尝试ParSeMiS。根据文档,它需要在ant目录中提供prefuseantlrlib个jar。我把所有必需的罐子放进去了。但是,当我尝试运行它时,我收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: antlr/TokenStreamException
    at de.parsemis.miner.environment.Settings.parseFileName(Settings.java:198)
    at de.parsemis.miner.environment.Settings.parseOption(Settings.java:312)
    at de.parsemis.miner.environment.Settings.parse(Settings.java:170)
    at de.parsemis.miner.environment.Settings.parse(Settings.java:122)
    at de.parsemis.Miner.run(Miner.java:358)
    at de.parsemis.Miner.main(Miner.java:61)
Caused by: java.lang.ClassNotFoundException: antlr.TokenStreamException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 6 more

现在,我已经确认antlr/TokenStreamException.class jar中存在antlr。我尝试通过导出CLASSPATH变量并通过-cp开关设置它来手动将jar添加到类路径中。但是,这些都不起作用,我仍然得到这个例外。任何人都可以帮我弄清楚什么是错的?感谢。

2 个答案:

答案 0 :(得分:1)

问题是您正在使用忽略CLASSPATH环境变量的-jar。您应该在清单as shown here中列出您的依赖项,例如

Class-Path: lib/ant.jar lib/antlr-3.4-complete.jar lib/prefuse.jar

(它 仍然可以使用显式的-cp选项。我的猜测是你在指定时遇到了错误,并认为它与底层原因相同使用环境变量时失败。)

答案 1 :(得分:0)

我意识到这个问题已经很老了,但我只是遇到了完全相同的问题而且发现了这个问题。对于后代,我发布了最终让它运行的方式:

如上所述,当使用-jar运行时,java显然忽略了类路径。所以不要用-jar运行它。而是在路径中包含jar并直接运行该类。在四处寻找,以下应该可以工作(路径在我的Ubuntu 12.10系统上):

java -cp /usr/share/java/antlr.jar:/full/path/to/parsemis.jar de.parsemis.Miner

然后您可以将选项传递给上述选项。 Maye确定你使用完整路径,没有像〜/ foo这样的快捷方式,因为它们显然没有扩展。

当然,如果你像我一样使用Dot格式的图形,它会在抱怨“意外的字符0xA”时很早就死掉,但至少它会更进一步。