[英]NoClassDefFoundError even though the JAR's are included in Manifest Class-Path
以下是我創建的jar的清單文件。
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Arun
Class-Path: lib/httpclient-4.5.1.jar lib/httpcore-4.4.3.jar lib/c
ommons-logging-1.2.jar lib/commons-codec-1.9.jar lib/httpmime-4.5.1.j
ar lib/json-simple-1.1.1.jar lib/junit-4.10.jar lib/hamcrest-core-1.1
.jar
Created-By: Apache Maven 3.3.3
Build-Jdk: 1.8.0_72
Main-Class: org.wso2.ml.driver.Shell
盡管Class-Path條目顯示它已在jar的lib文件夾中添加了必需的jar,但是當我運行此可執行jar時,出現了Noclassdeffound錯誤。
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/entity/mime/content/ContentBody
這就是我執行我的罐子的方式
java -jar restclient-1.0-SNAPSHOT.jar
盡管Class-Path條目顯示它已在jar的lib文件夾中添加了必要的jar
Java不找你的jar文件中的jar文件。 它在罐子旁邊尋找它們。 因此,您需要以下文件/目錄結構:
restclient-1.0-SNAPSHOT.jar
lib/
httpclient-4.5.1.jar
httpcore-4.4.3.jar
...
另外,在運行時依賴項中包含junit和hamcrest似乎也不對。 這些應該由測試代碼而不是生產代碼使用。
我認為錯誤是您似乎正在做出的假設:
盡管Class-Path條目顯示它已在jar的lib文件夾中添加了必需的jar ,
我假設您已將這些Class-Path
JAR放在restclient-1.0-SNAPSHOT.jar
本身中,否則您將不會遇到此問題。
如果您看到JAR文件教程 ,它將明確提到以下內容:
注意:Class-Path標頭指向本地網絡上的類或JAR文件,而不是JAR文件中的JAR文件或可通過Internet協議訪問的類。 要將JAR文件中的JAR文件中的類加載到類路徑中,必須編寫自定義代碼以加載這些類。 例如,如果MyJar.jar包含另一個名為MyUtils.jar的JAR文件,則不能使用MyJar.jar清單中的Class-Path標頭將MyUtils.jar中的類加載到類路徑中。
您應該使那些其他JAR文件在本地文件夾中可用。 如果您喜歡Maven,也許考慮使用maven shade plugin 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.