2010-05-28 105 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