我正在编写一本ANTLR(一个语言处理库)书,有很多例子应该易于使用命令行编译。
要解决问题的一些信息:
antlr-3.2.jar
包含库类。我将antlr-3.2.jar
添加到CLASSPATH
环境变量(Windows 7)中,当使用javac
编译类时,一切正常。
这是我执行编译程序的原因:
javac Test.java ExprLexer.java ExprParser.java
Test.java
包含main()
- 方法,而ExprLexer
和ExprParser
由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。是否有可能告诉口译员他应该自动查看档案?
答案 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。