簡體   English   中英

動態加載jar中的getResourceAsStream

[英]getResourceAsStream in dynamically loaded jar

我知道有幾十個(如果不是幾百個)關於Java的getResource / getResourceAsStream的問題,但我找不到任何問題的答案。

我動態加載jar :(給出String path

File jar = new File(path);
URL url = new URL("file", "localhost", jar.getAbsolutePath());
URLClassLoader loader = new URLClassLoader(new URL[] { url });
c = loader.loadClass(name);

然后在jar中我嘗試在jar中加載資源。 這個資源顯然存在於jar中,如果我只是在Eclipse中使用類加載器運行整個過程,整個過程就可以工作。 在一個罐子里它不起作用。$

getClass().getResourceAsStream("resource.dat"); 

我想每一個可能的組合/packageName/resource.datpackageName/resource.dat/resource.datresource.dat 他們都拋出了一個stream closed Exception stream closed

我嘗試調試並最終打印通過getClass().getResource(path)加載的這些文件的getClass().getResource(path)

這導致了以下網址,這對我來說並不正常。 應該說“localhostC:......”嗎?

jar:file://localhostC:\Users\******\export.jar!/packageName/resource.dat

轉換此URL也會引發異常( URISyntaxException )。

這個URL真的壞了還是我做錯了什么?

嘗試更改線路:

URL url = new URL("file", "localhost", jar.getAbsolutePath());

URL url = new URL("file", null, jar.getAbsolutePath());

在這種情況下,URL構造函數中的host參數不適用。

首先, File類有一個toURI()方法,因此獲取指向文件的URL的首選方法是:

URL url = new File(path).toURI().toURL();

所以使用這個,類加載器:

File jar = new File(path);
URLClassLoader loader = new URLClassLoader(new URL[] { jar.toURI().toURL() });

其次,當你想加載資源的罐子,用Class是從罐子始發,所以如果你已經加載的Class c

Class<?> c = loader.loadClass(classPathAndName);
URL resource = c.getResource("data.txt");

這將導致類似於:

jar:file:/C:/test/testjar.jar!/testpkg/data.txt

或者,您可以使用ClassLoader獲取資源,如:

loader.getResoure(packageAndResourceName);

但請注意,這引用了javadoc

此方法將首先在父類加載器中搜索資源; 如果父項為null ,則搜索內置到虛擬機的類加載器的路徑。 如果失敗,此方法將調用findResource(String)來查找資源。

暫無
暫無

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

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