gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:33:17 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com