簡體   English   中英

在運行時從Jar文件加載資源

[英]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)

除非擔心:

  1. 您正在嘗試加載類(例如,作為插件),
  2. 您的資源位於某些包結構中,或者
  3. 您正在OSGi環境中使用多個不同的ClassPath和ClassLoader加載資源(在這種情況下,您可能會使用org.eclipse.core.runtime.FileLocator#resolve(URL)

如果jar文件已經在您的類路徑中,則您應該能夠執行Classloader.getResourceAsStream

這個jar是否在您當前的類路徑之外?

暫無
暫無

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

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