我的问题如下: 我试图访问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实例。
我们非常感谢任何建议。
答案 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
。