![](/img/trans.png)
[英]NoClassDefFoundError even though the JAR's are included in Manifest Class-Path
[英]Java ignoring Class-Path entry in jar file's manifest
我已經搜索了互聯網,我搜索了stackoverflow,發現很多帖子都在問這個問題,但是沒有一個具體的答案。
簡短的版本是:我有一個jar文件,它引用了清單中的其他jar文件。 然后我使用java -jar test.jar運行jar文件,但它不會將jar依賴項添加到類路徑中。
長版本:我做了一個小實驗,以確認它對我的項目不是特別的。 我在eclipse中創建了一個簡單的Java項目,只有一個類。 這個類所做的就是將類路徑寫入std-out:
package test;
import java.net.URL;
import java.net.URLClassLoader;
public class Test {
public static void main(String[] args){
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url: urls){
System.out.println("CP: "+url.getFile());
}
}
}
然后我創建了一個“lib”文件夾並在其中放入一個隨機的jar文件並將其添加到類路徑中。 文件夾結構現在看起來像這樣:
Test
|- src/test/Test.java
|- lib/mysql-connector-java-3.1.14-bin.jar
現在,當我從Eclipse運行它時,我得到以下輸出:
CP: /home/username/workspace/Test/bin/
CP: /home/username/workspace/Test/lib/mysql-connector-java-3.1.14-bin.jar
好的,現在我使用Eclipse將項目導出到一個可運行的jar。 我選擇“將所需庫復制到生成的jar旁邊的子文件夾”選項。
這將創建以下結構:
/tmp/Test
|- test.jar
|- test_lib/mysql-connector-java-3.1.14-bin.jar
如果我查看Eclipse創建的Test.jar,它看起來像這樣:
test.jar
|- test/Test.class
|- META-INF/MANIFEST.MF
MANIFEST.MF的內容是:
Manifest-Version: 1.0
Class-Path: . test_lib/mysql-connector-java-3.1.14-bin.jar
Main-Class: test.Test
是的,在Main-Class屬性之后有一個空行(我提到這是因為有些人在網上發帖說原因可能是最后一個缺少的換行符)。
所以,一切看起來都很好。 我用java -jar test.jar運行它並得到以下輸出:
CP: /tmp/Test/test.jar
所以classpath 只包含我想要運行的jar文件 。 MANIFEST中的Class-Path:屬性被完全忽略。 如果我用java -cp test.jar test.Test運行它會發生同樣的事情
如何正確使用MANIFEST.MF中的Class-Path屬性? 我無法理解我的生活。 特別是因為-cp和-jar不兼容,我不知道如何在使用-jar參數的同時指定類路徑。
非常感謝提前。
還有一些我可以提前回答的事情:
好的,感謝JB Nizet的評論,我發現一切都運轉正常。 它不會打印出類路徑,但我可以從庫中訪問這些類。 所以我的實驗設置錯了。 這對我來說是個壞消息,因為我的其他項目仍然不起作用,而且在這里發布太復雜了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.