2016-10-03 27 views
3

我想設置一個罐子清單,因此它加載了一個文件夾旁邊的所有庫(罐子)。是否有可能有一個罐子清單使用文件夾中的所有罐子

清單如下所示:

Manifest-Version: 1.0 
Class-Path: libs/ 
Main-Class: path.to.my.class.Main 

佈局如下:

- MyJar.jar 
- libs/ 
-----lib1.jar 
-----lib2.jar 

而且我試圖像這樣運行:

java -jar MyJar.jar 

我也得到NoClassDefinition有關文件夾內jar中的類的錯誤。

如果有人很好奇,該文件夾可能包含在類加載期間處理的可選jar。這是'我不能使用硬編碼或自動生成的。

有什麼想法?

更新 改寫了這個問題,因爲這是目前不可能從清單本身。答案是唯一真正可行的,不需要提取罐子,雖然它也可以。

因此,作爲總結,答案是否定的,如果您有未指定的依賴關係,則無法單獨從清單文件完成。

+0

AFIK JAR的類路徑開始於'JAR'文件的根目錄。除非要像Spring Boot或OSGI容器那樣動態加載它們,否則不能將子類或JAR放在子目錄中。 – 11thdimension

+0

原來,可以這樣做,你必須用JAR名稱指定路徑。檢查此鏈接http://todayguesswhat.blogspot.com/2011/03/jar-manifestmf-class-path-referencing.html?_sm_au_=ivVTSRf571T1SvZP – 11thdimension

+0

我早先遇到該鏈接,我的清單是基於此,但它doesn沒有工作。它只能找到該文件夾​​中在類路徑中定義的文件。單獨的文件夾似乎不起作用。 (即libs /或./libs/) – javydreamercsw

回答

0

java不知道libs目錄中的jar文件。 如果您使用的是Java 1.6或更高版本,您可以運行程序作爲

java命令的lib/*罐子MyJar.jar

+0

沒有按照書面工作。必須這樣做:java -cp libs/-jar MyJar.jar。可悲的是,這不是我所問的,因爲我試圖從清單中看出是否可能。 – javydreamercsw

+0

我結束了使用它的一個版本,使其工作:java -cp libs/* path.to.my.class.Main – javydreamercsw

+0

更新的問題,以容納這是唯一的vaid答案。 – javydreamercsw

1

嘗試提取這些罐子。看起來你不能從目錄中添加所有的jar,但你可以添加所有的類。然而,如果你只對jar的代碼內容感興趣,你可能會失去所有的配置。

我測試了這些簡單的類

import pkg.B; 

public class A { 
    public static void main(String[] args) { 
    System.out.println(B.class.getName()); 
    } 
} 

package pkg; 

public class B {} 

現在我試着分開的類。我已經將它們震撼到了

$ jar tf libA.jar 
META-INF/ 
META-INF/MANIFEST.MF 
A.class 
$ jar tf libB.jar 
META-INF/ 
META-INF/MANIFEST.MF 
pkg/B.class 

沒有任何清單中的類路徑。我可以用java -cp libB.jar:libA.jar A運行A.現在,我創建一個類路徑的另一個罐子設置爲lib/

$ cat manifest 
Class-Path: lib/ 
$ jar cfm empty.jar manifest 

我的目錄樹看起來像

$ ls -R 
.: 
A.java empty.jar lib lib.jar manifest pkg 

./lib: 
libA.jar libB.jar 

./pkg: 
B.java 

現在我嘗試罐子

$ java -jar empty.jar 
Error: Could not find or load main class A 

無望,對不對?然後我提取libA.jar和libB。jar進入lib(與[這個人] [2]相同)。現在一切正常

$ java -jar empty.jar 
pkg.B 
+0

這對我的方案不起作用,因爲非技術用戶將無法執行此操作。要求他們將jar放在目錄中已經夠難了。謝謝 – javydreamercsw

相關問題