首页 文章

在运行时从Jar文件加载资源

提问于
浏览
2

我正在尝试从运行时添加的Jar文件加载资源,而不是很远 .

这是我的代码(groovy):

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和我当前 class 的类加载器之间有什么关系? 3)在这个资源中流动的正确方法是什么(显然我的工作不起作用)?

谢谢

3 回答

  • 0

    如果jar文件已经在你的类路径中,那么你应该只能做Classloader.getResourceAsStream

    这个jar在你当前的classpath之外吗?

  • 0

    如果要将JAR文件添加到当前线程's ClassLoader you' d创建新的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())
    }
    
  • 4

    我比java更熟悉java,但是这应该给你你要求的InputStream:

    JarFile jarFile = new JarFile(new File("/out/resource.jar"))
    JarEntry jarEntry = jarFile.getJarEntry("test.resource")
    InputStream inputStream = jarFile.getInputStream(jarEntry)
    

    无需担心ClassLoader,除非:

    • 您正在尝试加载类(例如作为插件),

    • 您的资源位于某个包结构中,或

    • 您正在使用多个不同的ClassPath和ClassLoader在OSGi环境中加载资源(在这种情况下,您可能会使用类似 org.eclipse.core.runtime.FileLocator#resolve(URL) 的内容)

相关问题