簡體   English   中英

即使在清單類路徑中包含了JAR,也不會出現NoClassDefFoundError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM