[英]Using getResourceAsStream on jar loaded by Class.forName(…)
[英]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.dat
, packageName/resource.dat
, /resource.dat
和resource.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.