2012-09-25 88 views
2

我創建一個新的jar文件。當我運行罐使用運行jar文件指定支持jar文件

java -jar UpdateAvailable.jar com.dao.mysql.UpdateAvailable 

我得到了以下例外。

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONException 
Caused by: java.lang.ClassNotFoundException: org.codehaus.jettison.json.JSONException 
    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) 

但我複製了UpdateAvailable.jar中的所有支持罐。現在是什麼我的要求運行但不指定配套罐子jar文件,像

java -jar UpdateAvailable.jar com.dao.mysql.UpdateAvailable 
+0

解壓jar文件 –

+0

你是說你已經塞滿了'UpdateAvailable.jar'裏面所有的依賴罐子? – maba

+0

看看[這個](http://stackoverflow.com/questions/12229300/creating-an-independent-jar-file/12230160#12230160) –

回答

0

在可執行文件jar無法讀取jar中的任何支持jar文件。因此,請將所有支持的jar保存在一個文件夾中,並將可執行jar放在同一個目錄中。在「MANIFEST.MF」文件中添加「Class-Path」作爲「用空格分隔的支持jar文件」。現在運行的水瓶中

java -jar UpdateAvailable.jar com.dao.mysql.UpdateAvailable 
0

這裏有幾點,而你是用JAR文件和CLASSPATH工作要記住: -

  • 爲了使您的JVM找到類,您的類路徑應設置爲包含該類的目錄。在這種情況下,你有JAR。所以,你需要給路徑,直到你的罐子文件名
  • 現在,因爲你有你的Jar文件在你當前運行的Jar文件中,你不能設置你的類路徑直到文件夾內的文件夾,所以基本上你將無法設置內部Jar文件的類路徑。
  • 因此,很明顯JVM將無法看到內部Jar中的類。
  • 因此,確保所需的JAR文件在外部的所有JAR文件(我的意思是說 - 避免嵌套的JAR文件)..
0

我不知道你是如何包裝你的jar文件,但它聽起來像你需要像One-Jar這樣的東西來幫助你打包你的文件和你所有的支持庫到一個jar中。 One-Jar帶有它自己的類加載器,允許它將所有包含的jar加載到可執行jar文件中。

配置相當簡單易用。如果您正在使用Maven,則可以使用one-jar maven plugin來幫助您配置要包含哪些庫。

還有其他類似的包可以用來代替One-Jar,比如JarJarProGuard。請快速查看this SO question