2012-06-28 22 views
7

創建jar文件我有以下目錄結構:命令行

SigarTest 
src 
    SigarTest 
    .java files 
bin 
    SigarTest 
    .class files 

這裏,SigarTest是包名。根文件夾位於jdk的bin文件夾中。 從那裏,即時通訊運行以下命令來創建我的項目的jar文件 -

./jar cfe temp.jar SigarTest.SigarMain SigarTest/bin/ tools.jar sigar.jar mongo-2.7.3.jar 

在需要的tools.jar,蒙戈-2.7.3.jar和sigar.jar,並在同一個文件夾中根目錄(jdk的bin文件夾)。然而,在運行它,我得到

ClassNotFoundException : SigarTest.SigarMain 

我做錯了什麼?

+0

jar cfe temp.jar SigarTest.SigarMain.class SigarTest/bin ....嘗試他的 –

+0

@AlpeshPrajapati:與我所做的相同嗎? – Cygnus

+0

你還沒有添加.class之後SigarTest.SigarMain ... –

回答

5

使用-Cdir option其中

jar命令的執行過程中,暫時改變目錄(cdDIR)處理下列inputfiles參數。

如果您在執行您的問題jar命令,並列出temp.jar的內容,你會看到類似以下的輸出:

$ rm -rf temp.jar 
$ jar cfe temp.jar SigarTest.SigarMain SigarTest/bin/ tools.jar sigar.jar mongo-2.7.3.jar 
$ jar tf temp.jar 
META-INF/ 
META-INF/MANIFEST.MF 
SigarTest/bin/ 
SigarTest/bin/SigarTest/ 
SigarTest/bin/SigarTest/SigarMain.class 
tools.jar 
sigar.jar 
mongo-2.7.3.jar 
$ java -jar temp.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: SigarTest/SigarMain 
Caused by: java.lang.ClassNotFoundException: SigarTest.SigarMain 
    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:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

注意,在temp.jar有SigarTest /箱是不正確的。執行temp.jar會拋出ClassNotFoundException,因爲SigarMain位於程序包中。現在考慮使用-CDIR選項以下jar命令:

$ rm -rf temp.jar 
$ jar cfe temp.jar SigarTest.SigarMain -C SigarTest/bin/ . tools.jar sigar.jar mongo-2.7.3.jar 
$ jar tf temp.jar 
META-INF/ 
META-INF/MANIFEST.MF 
SigarTest/ 
SigarTest/SigarMain.class 
tools.jar 
sigar.jar 
mongo-2.7.3.jar 
$ java -jar temp.jar 

SigarMain是正確的包和執行temp.jar不會引發ClassNotFoundException

+0

謝謝!這解決了:) – Cygnus

+0

順便說一句,當你做-C時,目錄名稱後面的文件或所有跟隨該名稱的值的文件是否已更改目錄?據此,應該是後者的權利? – Cygnus

+1

這個文檔有點混亂。從一些測試中,我發現它只是下面的一個文件,這解釋了爲什麼在'-C SigarTest/bin /中。 tools.jar','SigarMain.class'取自'SigarTest/bin /','tools.jar'取自'jar'執行的目錄。您也可以多次指定'-C'。 – creemama