2011-10-13 127 views
1

我有一個奇怪的問題,我不明白...我有一個簡單的HelloWorld jar,我在Eclipse中建立了它,它的類路徑上有Apache Loggings jar。我寫了一個腳本來運行jar:Java罐子和類路徑問題

#!/bin/sh 
export CLASSPATH=lib/*:$CLASSPATH 
java -jar HelloWorld.jar 

這裏的目錄結構與HelloWorld.jar主目錄和子目錄lib持有commons-logging-1.1.1.jar

運行此腳本工作正常。然而,當我放置HelloWorld.jarlib目錄(即包含在一個地方的所有JAR文件),並執行java -jar lib/HelloWorld.jar,我得到:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 

錯誤。爲什麼?!?!?!?!

我在問這是因爲我已經在OSX上使用JarBundler爲HelloWorld應用程序創建了一個應用程序包,並在MacOS目錄中放置了一個修改過的腳本,而所有這些庫都放在了Resources/Java目錄中。腳本的修改版本:

#!/bin/sh 
RESOURCE_DIR=$(cd "../Resources"; pwd) 
export CLASSPATH=$RESOURCE_DIR/Java/*:$CLASSPATH 
java -jar $RESOURCE_DIR/Java/HelloWorld.jar 

,我得到同樣的錯誤如上我會很感激理解爲什麼我不能做到這一點和/或如何解決它的任何幫助嗎?

回答

6

類路徑不適用於通配符。每個jar都必須顯式指定,或者作爲CLASSPATH變量的一部分,或者包含在classpath中的另一個jar的清單中。

另外,IIRC java -jar會忽略所有存在於類路徑中的第三方jar。爲什麼不這樣做呢?

java -cp yourJar:logJars <mainClass> 
1

使用MANIFEST文件(META-INF文件夾)處理類路徑條目。使用庫的相對路徑。

有關更多信息,請參閱here

基本上,一個lib文件夾內與共享記錄的情況:

Class-Path: lib/commons-logging-1.1.1.jar 

而對於在同一文件夾兩個罐子:

Class-Path: commons-logging-1.1.1.jar 
0

是否設置log4j.jar到類。我認爲你沒有添加log4j.jar到它的類路徑。

+0

進入你的類路徑* –

2

嘗試將共享記錄-1.1.1.jar添加到CLASSPATH直接

+0

我試過了,(看到我對@Sarel Botha的評論),但它仍然沒有奏效。 –

+0

是的,我想這是-jar導致...我認爲@Jagat解決方案應該可以工作。 – yoprogramo

2

Java將不會以lib/*,但殼可以擴展它爲你工作。仔細檢查一下。把這樣的行導出後:

echo $CLASSPATH 

另外,我建議把它在清單文件中已經提到。編號: 這是一個權限問題嗎?如果以root/admin身份運行該應用程序,或者將該文件放在其他位置並使用完全限定的路徑,它是否工作?

+0

'echo $ CLASSPATH'會產生'/Users/sonogenics/Documents/workspace/HelloWorld/lib/commons-logging-1.1.1.jar:'這是我期望它的位置,但我仍然收到錯誤。 .. –

+0

作爲sudo運行腳本仍然不能解決問題。我瘋了!但感謝您的意見! –

+0

我認爲Jagat有正確的答案。當你使用-jar時,我知道它忽略了-classpath。它可能也忽略了$ CLASSPATH。 –

1

感謝大家幫忙解決這個問題。基本上,在我不知情的情況下,清單文件正在創建並捆綁到jar中,因此任何$CLASSPATH-cp標誌都被忽略。在我的Eclipse項目中,我的類路徑設置爲$(projectRoot)/lib,與我的dist目錄巧合的是相同的目錄結構。但是,當它們被OSX的JarBundler捆綁到一個目錄中時,該目錄不存在,因此類路徑錯誤!

我試圖從有關Eclispe創建MANIFEST.MF但該命令行移除Class-Path屬性$CLASSPATH和/或-cp條目似乎仍然不能有所作爲?難道一個清單文件否定所有命令行類路徑的存在項?

+0

我不擅長在問題中提問。請從現在開始提出新的問題或更新您的問題及相關信息。 至於你的回答'java -jar'會忽略外部類路徑設置(它與MANIFEST類路徑的存在無關)。您可以使用@Jagat'-cp'解決方案來自己管理類路徑......但是,我無法強調,沒有理由重新創建井,只需在您的MANIFEST文件中正確設置類路徑或讓JarBundler執行它爲你。 [Ant任務](http://informagen.com/JarBundler/)。 –

+0

爲了更具體一點,我正在討論'jarfileset'和'jarfileset'選項。不要使用'extraclasspath' *選項來包含公共日誌記錄。 –