执行类时找不到jar

时间:2010-05-28 17:59:36

标签: java command-line classpath

我正在编写一本ANTLR(一个语言处理库)书,有很多例子应该易于使用命令行编译。

要解决问题的一些信息:

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时。 这是我输入的内容:

java -cp ./ Test

执行此操作时,解释器告诉我他找不到antlr-3.2.jar中包含的ANTLR类,尽管我在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-Archive?

我找到了某种工作方式。我将antlr-3.2.jar复制到Test.class所在的目录中,然后执行:

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

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

2 个答案:

答案 0 :(得分:5)

  

我正在使用Windows 7和Java 1.6_20。   有人能说出发生了什么吗?为什么   翻译会不会看到   jar-Archive我指定的   CLASSPATH?

命令行上的

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

答案 1 :(得分:3)

或者,您可以将Test应用程序放入其自己的jar文件中,并使用manifest告诉它在类路径中包含antlr-3.2.jar。