簡體   English   中英

Java忽略jar文件清單中的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參數的同時指定類路徑。

非常感謝提前。


還有一些我可以提前回答的事情:

  • “在最后一行之后是否有換行符?” - 是的
  • “這可能是eclipse對MANIFEST.MF的錯誤嗎?” - 可能是,但是當我用螞蟻制作罐子時,我遇到了同樣的問題。 因此,如果eclipse和ant都會使清單變形,我不知道應該如何格式化它。
  • “你試過哪些平台,Java版本?” - 我在Windows 10上嘗試過Java8,在Fedora Linux上嘗試過Java6,Java7和Java8。

好的,感謝JB Nizet的評論,我發現一切都運轉正常。 它不會打印出類路徑,但我可以從庫中訪問這些類。 所以我的實驗設置錯了。 這對我來說是個壞消息,因為我的其他項目仍然不起作用,而且在這里發布太復雜了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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