我正在尝试从运行时添加的 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()
Run Code Online (Sandbox Code Playgroud)
我收到此错误: java.util.zip.ZipException: error in opening zip file at java.util.zip.ZipFile.open(Native Method)
问题:
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)
Run Code Online (Sandbox Code Playgroud)
现在您应该能够通过 获取该文件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())
}
Run Code Online (Sandbox Code Playgroud)