【问题标题】:How to read a file in another jar file?如何读取另一个jar文件中的文件?
【发布时间】:2013-09-17 20:29:10
【问题描述】:

我正在运行一个 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。

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

【问题讨论】:

  • 如何添加插件?什么是 B.class?
  • 你可以这样尝试:- public void readXmlFile(){ JarFile jarFile = new JarFile(pathToJar2); JarEntry entry = jarFile.getJarEntry("/test.xml"); InputStream inputStream = jarFile.getInputStream(entry);}
  • 由于 jar 是 zip,请尝试从运行 A.jar 中解压缩 B.jar(或排除所需文件)并阅读您需要的内容。
  • class.getResourceAsInputStream 将搜索您的当前目录,这将是您调用方法的类文件的位置目录(A.jar)。您可能需要classloader 从 B.jar 加载类,然后调用 .getResourceAsInputStream()
  • @RahulTripathi 似乎我们有一个可能的答案;)

标签: java jar embedded-resource manifest.mf


【解决方案1】:

一般的类加载器会采用类路径上的先来的路径,显然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();

网址将类似于“jar:file://.../B.jar!META-INF/MANIFEST.MF”。


获取课程 URL:

URL url = b.class.getProtectionDomain().getCodeSource().getLocation();

【讨论】:

  • 我仍在努力解决这个问题。如果B 在类路径中,那么简单的使用getResource("META-INF/MANIFEST.MF") should work on it's own, there should no need to create a new URL, because the URL becomes unknown - there's no guarantee that the new URL` 实际上指向一个有效的资源......此外,B#getResource 已经返回了一个有效的 URL 引用......只是看起来令人困惑对我来说......
  • @MadProgrammer 令人困惑的是,B 的类加载器试图解析路径。如果路径是绝对路径,“/...”,则考虑所有 jar,由该类加载器或其类加载器加载。使用不会发生的相对路径“META-INF/...”,但 B.class 应该在根目录中(无包)。 BTW getClassLoader().getResource 使用绝对路径并且需要 no /.
猜你喜欢
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2011-01-17
  • 2011-08-12
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多