我正在尝试从运行时添加的 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:打开 zip 文件时出错 在 java.util.zip.ZipFile.open( native 方法)
问题:
1) 我需要在我的网址中添加“test.resource”吗? 2)我的URLClassLoader和我当前类的类加载器之间有什么关系? 3)流式传输此资源的正确方法是什么(显然我所拥有的不起作用)?
谢谢
最佳答案
如果要将 JAR 文件添加到当前线程的 ClassLoader,您需要创建一个新的 URLClassLoader,使用当前类的 ClassLoader 作为父级并添加新的 JAR URL。您不能输入 test.resource
在您的网址中。不要忘记将新的类加载器分配给当前线程。请参阅下面的示例:
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 - 运行时从Jar文件加载资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5957589/