我正在尝试从运行时添加的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(本机方法)
问题:
1)我需要在我的网址中加入“test.resource”吗? 2)我的URLClassLoader和我当前班级的类加载器之间有什么关系? 3)在这个资源中流动的正确方法是什么(显然我的工作不起作用)?
由于
答案 0 :(得分:4)
如果要将JAR文件添加到当前线程的ClassLoader中,您需要创建一个新的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())
}
答案 1 :(得分:0)
如果jar文件已经在你的类路径中,那么你应该能够Classloader.getResourceAsStream
这个jar是否在你当前的类路径之外?
答案 2 :(得分:0)
我比java更熟悉java而不是groovy,但是这应该会给你所要求的InputStream:
JarFile jarFile = new JarFile(new File("/out/resource.jar"))
JarEntry jarEntry = jarFile.getJarEntry("test.resource")
InputStream inputStream = jarFile.getInputStream(jarEntry)
除非:
,否则无需担心ClassLoaderorg.eclipse.core.runtime.FileLocator#resolve(URL)
的内容)