如何使用资源路径访问jar的内容?

时间:2012-05-15 14:01:37

标签: java url jar

我的问题如下: 我试图访问Jar中的类文件。 我有一个罐子" dumb.jar"位于包裹" com.msgxsd"。 jar在类路径上,如果我尝试做

InputStream is = this.getClass().getClassLoader()
            .getResourceAsStream("com/msgxsd/dumb.jar");

然后我得到了一个没有问题的jar输入流。

当我尝试获取jar中文件的输入流(或URL)时出现问题。所有jar包含(除了明显的清单)是文件" DummyClass1.class"。

我尝试了以下所有方法:

InputStream is = this.getClass().getClassLoader() .getResourceAsStream("DummyClass1.class");

InputStream is = this.getClass().getClassLoader() .getResourceAsStream("dumb.jar!/DummyClass1.class");

但返回的输入流始终为null。我也试过

URL url = this.getClass().getResource("DummyClass1.class");
URL url = this.getClass().getResource("dumb.jar!/DummyClass1.class");

但返回的网址为空。

我已经查看了与访问Jar中的文件有关的每一个问题,但建议的解决方案(如上所示)对我不起作用。

我想要的是能够为" DummyClass1.class"获得一个InputStream(或理想的URL)。在jar里面,这样我就可以以某种方式构造一个File实例。

我们非常感谢任何建议。

5 个答案:

答案 0 :(得分:2)

尝试

InputStream is = this.getClass().getClassLoader().getResourceAsStream("dumb.jar/DummyClass1.class"); 

可以在jar

中指定DummyClass1.class位置

答案 1 :(得分:1)

试试这个(对不起,如果有拼写错误,我只是在不尝试的情况下输入我的头顶代码):

int index = path.indexOf('!');
if (index == -1) return url.openStream();
String jarPath = path.substring(0, index);
File jarFile = new File(new URL(jarPath).toURI());

if (!jarFile.exists()) return null;

String filePath = path.substring(index + 1);
if (filePath.startsWith("/")) {
    filePath = filePath.substring(1);
}

JarFile jar = new JarFile(jarFile);
return jar.getInputStream(jar.getJarEntry(filePath));

答案 2 :(得分:1)

尝试

is = this.getClass().getClassLoader().getResourceAsStream("com/msgxsd/dumb.jar!/DummyClass1.class")

答案 3 :(得分:1)

我要做的是使用JarInputStream直接访问jar文件的内容。然后遍历JarEntry集合,直到找到要查找的文件并从流中读取它。像这样:

JarInputStream jarIn = new JarInputStream(this.getClass().getClassLoader() .getResourceAsStream("com/msgxsd/dumb.jar"));  
JarEntry entry = jarIn.getNextJarEntry();

现在使用jarIn读取方法读取文件。

答案 4 :(得分:1)

最简单的方法是移动jar,使其直接包含在类路径中,或者更改类路径以包含" com / msgxsd"作为顶级入口。在其中任何一种情况下,标DummyClass都会加载ClassLoader,您只需按照自己的建议getResourceAsStream("DummyClass1.class")进行加载。

如果无法以这种方式更改类路径,则需要按照@Micky上面或此more complete answer中的建议创建JarInputStream