java - 运行时从Jar文件加载资源

标签 java groovy jar

我正在尝试从运行时添加的 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/

相关文章:

java - 开始使用 wicket 和 Hibernate

java - 正则表达式在Java中替换部分字符串

docker - Dockerfile下载中的ADD命令出错

java - 如何在 JAVA 方法中合并 boolean 值

java - 将罗马数字转换为十进制

database - 如何从 Grails Controller 操作中在当前系统中创建文件并保存从数据库中获取的数据?

spring - 类加载器问题

java - 下载并替换java中正在运行的可执行文件

grails - 尝试使组具有在Grails中拥有自己的URL的能力。 (类似于您如何浏览至facebook.com/{username})

eclipse - Groovy 在 Eclipse 中无法正确编译