2016-03-16 133 views
0

我正在嘗試部署使用Jackson,JUnit和Commons-IO的應用程序。我在我的應用程序的類路徑以下罐:即使在類路徑中的Jar中也找不到該類

commons-io-2.4.jar 
jackson-databind-2.7.0.jar 
jackson-annotations-2.7.0.jar 
log4j-api-2.4.1.jar 
wsdiscovery-0.2.jar 
jackson-core-2.7.0.jar 
log4j-core-2.4.1.jar 

此應用程序中我的開發環境,並且我已經部署所有上述罐的與主應用程序罐子。我可以毫無問題運行應用程序,但是每次我試圖使用它,我得到以下故障:

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper 
    at com.oncam.hware.app.OnvifApp.formatOutput(OnvifApp.java:356) 
    at com.oncam.hware.app.OnvifApp.dispatchCommand(OnvifApp.java:271) 
    at com.oncam.hware.app.OnvifApp.loopSocket(OnvifApp.java:130) 
    at com.oncam.hware.app.OnvifApp.useSocket(OnvifApp.java:216) 
    at com.oncam.hware.app.OnvifApp.main(OnvifApp.java:473) 
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 5 more 

的ObjectMapper類是在傑克遜數據綁定-2.7.0.jar文件。此外,在訪問其他jar文件中的類(包括JUnit jar!)時,我沒有任何問題。出於某種原因,就好像類加載器正在加載除jackson-databind-2.7.0.jar之外的每個Jar。

有誰知道是什麼原因造成了這種情況,我該如何解決?

有人請指教...

+0

你的類路徑中必須有一個錯字。你如何運行你的程序? –

+0

使用java -verbose查看所有類從哪裏加載。這些錯誤有時也掩蓋了初始化程序中的一個錯誤或者另一個無法像超類一樣找到的依賴項。 – Gerhard

回答

0

我想通了什麼是錯的。

事實證明,當您將代碼導出到JAR文件時,我正在使用的環境(Eclipse!)沒有正確更新清單文件。沒有正確的清單條目,應用程序無法「查找」依賴的jar文件。

在我看來,這是對Eclipse人員的嚴重監督 - 尤其是當你有一個依賴於很多jar文件的應用程序時。爲了讓我的應用程序運行,我有以下選擇:

  1. 創建一個運行在JVM並具有指向每一個需要的jar文件的參數列表,或腳本:

2:手動輸入每個必需的jar文件到清單文件

據我所知,沒有辦法自動更新清單文件。這是一個嚴重的PITA(痛苦的A **)...

無論如何,很抱歉打擾人們對這個問題。希望發佈這個答案將有助於其他人避免類似的問題...

+0

也許使用maven或ivy來進行依賴管理? – Max

+0

Maven不是重點。我有應用程序依賴的所有jar在開發環境中運行。除非Maven爲您更新清單文件,否則在環境外部署時無關緊要。 (請注意:你認爲我如何得到所有依賴的罐子?)...... –

相關問題