2010-05-28 73 views
4

我正在通过一个ANTLR(一种语言处理库)书,并且有很多例子,应该使用命令行很容易编译。执行类时未找到罐子

一些信息,以获得TE问题:

antlr-3.2.jar包含库类。我将antlr-3.2.jar添加到CLASSPATH环境变量(Windows 7)中,并且在编译javac时一切正常。 这是我执行编译我的程序:

javac Test.java ExprLexer.java ExprParser.java 

Test.java包含我main() - 方法而ExprLexerExprParser由ANTLR生成。所有三个班级都使用antlr-3.2.jar中包含的班级。但迄今为止这么好。正如我刚才所说,编译工作正常。

这是当我尝试执行我遇到麻烦的Test.class。 这是I型:

java -cp ./ Test 

当执行此,翻译告诉我,他无法找到包含在antlr-3.2.jar的ANTLR类,altough我加在CLASSPATH变量的条目。

Exception in thread "main" java.lang.NoClassDefFoundError: org/antlr/runtime/Cha 
rStream 
Caused by: java.lang.ClassNotFoundException: org.antlr.runtime.CharStream 
     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:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
Could not find the main class: Test. Program will exit. 

我使用Windows 7和Java 1.6_20。有人可以告诉发生了什么事吗?为什么口译员不会在CLASSPATH中指定的jar中存档?

我发现了一些workaroud。我将antlr-3.2.jar复制到Test.class所在的目录中,然后执行:

java -cp ./;antlr-3.2.jar Test 

这解决了。但是我不想每次执行我的测试程序时输入jar-Archive。是否有可能告诉口译员他应该自动查看档案?

回答

5

我使用的是Windows 7和Java 1.6_20。 有人可以告诉发生了什么事吗?为什么 解释器不会在 CLASSPATH中指定的 jar-Archive I中查找?

命令行上的-cp将覆盖CLASSPATH变量。没有方便的方法来做你想做的事情。如果你不想每次输出完整的类路径,我会建议创建一个ant脚本,shell脚本或shell别名。

+0

Ahhhhh! :) 谢谢! – Simon 2010-05-28 18:09:06

3

或者,您可以将您的测试应用程序放到它自己的jar文件中,manifest告诉它将antlr-3.2.jar包含在classpath中。

+0

对不起...我想设置另一个帖子作为答案,但我错误地设置你的...... :) – Simon 2010-05-28 18:25:03

+0

@Simon:我看到了这一点,并认为这可能是一个错误。没有伤害,没有犯规。 (我通常会在正确答案后发布替代方案。) – Powerlord 2010-05-28 19:06:05