Java 如何读取另一个jar文件中的文件?

Java 如何读取另一个jar文件中的文件?,java,jar,embedded-resource,manifest.mf,Java,Jar,Embedded Resource,Manifest.mf,我正在运行一个GUI应用程序(a.jar)。然后我向这个GUI(a.jar)添加了一个插件(B.jar)。 现在我想访问B.jar中的manifest.mf文件。我尝试了B.class.getResourceAsInputStream(“/META-INF/MANIFEST.MF”)。然而,我得到的是A.jar中的manifest.mf,而不是B.jar中的manifest.mf 有人能给我一些关于这个问题的提示吗?非常感谢。在这种情况下,通用类加载器将采用类路径中首先出现的路径,显然A.jar

我正在运行一个GUI应用程序(a.jar)。然后我向这个GUI(a.jar)添加了一个插件(B.jar)。 现在我想访问B.jar中的manifest.mf文件。我尝试了B.class.getResourceAsInputStream(“/META-INF/MANIFEST.MF”)。然而,我得到的是A.jar中的manifest.mf,而不是B.jar中的manifest.mf


有人能给我一些关于这个问题的提示吗?非常感谢。

在这种情况下,通用类加载器将采用类路径中首先出现的路径,显然A.jar在B.jar之前先出现

String someUniqueResourceInBJar = "...";
URL url = B.class.getResource(someUniqueResourceInBJar);
url = new URL(url.getPath().replaceFirst(someUniqueResourceInBJar + "$", "")
    + "META-INF/MANIFEST.MF";
url.openStream();
url类似于“jar:file://.../B.jar!META-INF/MANIFEST.MF”


或者获取类URL:


如何添加插件?什么是B.class?您可以这样尝试:-public void readXmlFile(){JarFile JarFile=new JarFile(pathToJar2);JarEntry entry=JarFile.getJarEntry(“/test.xml”);InputStream InputStream=JarFile.getInputStream(entry);}既然jar是zip,请尝试解压缩B.jar(或排除所需文件)运行A.jar并读取所需内容。
class.getResourceAsInputStream
将搜索当前目录,该目录将是调用方法的类文件的位置目录(A.jar)。您可能需要一个
类加载器
从B.jar加载一个类,然后调用
.getResourceAsInputStream()
@rahultripath似乎我们有了一个可能的答案;)我还在想办法解决这个问题。如果
B
在类路径中,那么简单使用
getResource(“META-INF/MANIFEST.MF”)应该可以自己工作,不需要创建新的
URL
,因为URL变得未知-不能保证新的
URL`实际指向有效的资源…此外,
B#getResource
可能已经返回了一个有效的URL引用…对我来说似乎很困惑…@MadProgrammer令人困惑的是,B的类加载器试图解析路径。如果路径是绝对路径,“/…”,则所有JAR都将被考虑,由该类装入器或其类装入器装入。使用相对路径“META-INF/…”,这不会发生,但B.class应该在根目录中(没有包)。顺便说一句,getClassLoader()。getResource
使用绝对路径,不需要
/
URL url = b.class.getProtectionDomain().getCodeSource().getLocation();