[英]load resource from Jar file at runtime
我正在嘗試從運行時添加的Jar文件中加載資源,並且進展不會太遠。
這是我的代碼(常規):
URL url = new URL("jar:file:/out/resource.jar!/test.resource")
def urlList = [] << url
URL[] urls = urlList.toArray()
URLClassLoader classLoader = new URLClassLoader(urls, this.class.getClassLoader())
InputStream stream = url.openStream()
我收到此錯誤:java.util.zip.ZipException:在java.util.zip.ZipFile.open(本機方法)中打開zip文件時出錯
問題:
1)我需要在網址中放入“ test.resource”嗎? 2)URLClassLoader和當前類的類加載器之間是什么關系? 3)在此資源中進行流式傳輸的正確方法是什么(顯然我所擁有的不起作用)?
謝謝
如果要將JAR文件添加到當前線程的ClassLoader中,則需要創建一個新的URLClassLoader,將當前類的ClassLoader用作父類並添加新的JAR URL。 您不得在網址中放入test.resource
。 不要忘記將新的ClassLoader分配給當前線程。 請參閱以下示例:
URL url = new URL("file:/out/resource.jar")
def urlList = [] << url
URL[] urls = urlList.toArray()
URLClassLoader classLoader = new URLClassLoader(urls, getClass().classLoader)
Thread.currentThread().setContextClassLoader(classLoader)
現在,您應該能夠通過Thread.currentThread().getContextClassLoader().getResourceAsStream
獲取文件。
如果您實際上只是想從JAR中讀取文件而不將其添加到類路徑中,則可以采用以下方法:
JarFile jar = new JarFile(new File('/out/resource.jar'))
JarEntry jarEntry = jar.getJarEntry('test.resource')
if(jarEntry) {
File file = new File(new URL("jar:file:/out/resource.jar!/test.resource").toURI())
}
我對Java的興趣比對groovy的更為熟悉,但這應該可以為您提供您所要求的InputStream:
JarFile jarFile = new JarFile(new File("/out/resource.jar"))
JarEntry jarEntry = jarFile.getJarEntry("test.resource")
InputStream inputStream = jarFile.getInputStream(jarEntry)
除非擔心:
org.eclipse.core.runtime.FileLocator#resolve(URL)
) 如果jar文件已經在您的類路徑中,則您應該能夠執行Classloader.getResourceAsStream
這個jar是否在您當前的類路徑之外?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.