2

我的问题如下:我正在尝试访问 Jar 中的类文件。我在包“com.msgxsd”中有一个罐子“dumb.jar”。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");

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

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

但返回的 URL 为空。

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

我想要的只是能够为 jar 中的“DummyClass1.class”获取一个 InputStream(或者理想情况下是一个 URL),这样我就可以以某种方式构造一个 File 实例。

任何建议将不胜感激。

4

5 回答 5

2

尝试

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

可能在 jar 中指定 DummyClass1.class 位置

于 2012-05-15T14:12:39.637 回答
1

您要做的最简单的事情是移动您的 jar,使其直接包含在类路径中,或者更改您的类路径以将“com/msgxsd”也包含为顶级条目。在任何一种情况下DummyClass,标准都会加载ClassLoader,您可以getResourceAsStream("DummyClass1.class")按照您已经建议的方式进行操作。

如果无法以这种方式更改您的类路径,那么您需要JarInputStream按照上面@Micky 的建议或在这个更完整的答案中创建一个。

于 2012-05-15T15:39:31.250 回答
1

尝试

is = this.getClass().getClassLoader().getResourceAsStream("com/msgxsd/dumb.jar!/DummyClass1.class")
于 2012-05-15T14:19:42.663 回答
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));
于 2012-05-15T14:12:20.823 回答
1

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

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

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

于 2012-05-15T14:22:32.583 回答