2016-12-30 60 views
0

我有一個包含以下內容的jar文件:的Java類加載器沒有找到預期的資源

LibJar Contents 

dir1 
    |dir1-1 
    |  |Class1-1-1 
    |  |LClass1-1-2 
    |Ldir1-2 
     |LClass1-2-1 
Ldir2 
    |LClass2-1 

我的Java程序(我們可以把它叫做ProgJar,但我在NetBeans IDE還運行)具有以下封裝結構:

ProgJar 

dir1 
    |dir1-1 
    |  |Class-1-1 
    |  |PClass1-1-2  Different file name from LibJar 
Pdir2 
    |PClass2-1 

ProgJar和LibJar之間唯一的共享包結構是「dir1/dir1-1/Class1-1-1」。其他所有以P開頭的前綴都是ProgJar所獨有的,所有以L開頭的前綴都是LibJar所獨有的。

我使用LibJar作爲ProgJar中的庫。

這是我在ProjJar運行的代碼片段:

ClassLoader clP = Pdir2.PClass2-1.class.getClassLoader(); 
ClassLoader clL = Ldir2.LClass2-1.class.getClassLoader(); 

URL u1 = clP.getResource("dir1/dir1-1"); 
URL u2 = clL.getResource("dir1/dir1-1"); 

System.out.printf(u1.toExternalForm()); 
System.out.printf(u2.toExternalForm()); 

當我運行這個Netbeans中我得到以下輸出:

Netbeans Output: 
jar:file:/C:/path/to/project/lib/LibJar.jar!/dir1/dir1-1 
jar:file:/C:/path/to/project/lib/LibJar.jar!/dir1/dir1-1 

當我作爲一個ProgJar運行作爲建罐子NetBeans外部,我得到:

Jar Output: 
jar:file:/C:/path/to/ProgJar/ProgJar.jar!/dir1/dir1-1 
jar:file:/C:/path/to/ProgJar/ProgJar.jar!/dir1/dir1-1 

我希望看到的是如下:

Netbeans Output: 
jar:file:/C:/path/to/project/build/classes/dir1/dir1-1 
jar:file:/C:/path/to/project/lib/LibJar.jar!/dir1/dir1-1 

Jar Output: 
jar:file:/C:/path/to/ProgJar/ProgJar.jar!/dir1/dir1-1 
jar:file:/C:/path/to/ProgJar/libs/LibJar.jar!/dir1/dir1-1 

我經歷了幾個不同的文章閱讀,但是這一次似乎有點相關與這個特定問題:

http://jeewanthad.blogspot.com/2014/02/how-to-solve-java-classpath-hell-with.html

我如何能實現我的指定的輸出?

回答

0

下面的代碼是不是做你期望它做的事情:

ClassLoader clP = Pdir2.PClass2-1.class.getClassLoader(); 
ClassLoader clL = Ldir2.LClass2-1.class.getClassLoader(); 

這裏CLP AMD CLL是同一類的實例(你的系統/應用類加載器是特定的)。爲了驗證,只看到(clP == clL)應返回true。

你想要做的是,使用自定義類加載器(URLClassLoader應該這樣做)來加載你的庫。然後,加載您的ProgJar和您的自定義類加載器的系統類加載器將有所不同。然後其餘的代碼應該按預期工作。

+0

我會試試這個報告。 – MrJman006

+0

您的問題有何進展? – code

+0

我還沒有嘗試過。本週我會盡力去解決它。 – MrJman006