gpt4 book ai didi

java - Jar 输入流 : getNextJarEntry always returns null

转载 作者:行者123 更新时间:2023-11-29 03:57:59 25 4
gpt4 key购买 nike

我有一个 I18n 帮助程序类,它可以通过查看应用程序 Jar 中的文件名找出可用的 Locale

private static void addLocalesFromJar(List<Locale> locales) throws IOException {
ProtectionDomain domain = I18n.class.getProtectionDomain();
CodeSource src = domain.getCodeSource();
URL url = src.getLocation();
JarInputStream jar = new JarInputStream(url.openStream());
while (true) {
JarEntry entry = jar.getNextJarEntry();
if (entry == null) {
break;
}
String name = entry.getName();
// ...
}
}

目前,这不起作用 - jar.getNextJarEntry() 似乎总是返回 null。我不知道为什么会这样,我所知道的是 url 设置为 rsrc:./。我从未见过该协议(protocol),也找不到任何相关信息。

奇怪的是,这有效:

class Main {
public static void main(String[] args) {
URL url = Main.class.getProtectionDomain().getCodeSource().getLocation();
JarInputStream jar = new JarInputStream(url.openStream());
while (true) {
JarEntry entry = jar.getNextJarEntry();
if (entry == null) {
break;
}
System.out.println(entry.getName());
}
}
}

在此版本中,尽管它们之间几乎没有区别,但 url 已正确设置为 Jar 文件的路径。

为什么第一个版本不起作用,是什么破坏了它?

更新:

工作示例只有在我不使用 Eclipse 导出它时才有效。它在 NetBeans 中工作得很好,但在 Eclipse 版本中,URL 也设置为 rsrc:./

由于我使用 Package required libraries into generated JAR library handling 将其导出,Eclipse 将其 jarinjarloader 放入我的 Jar 中,因此我可以在其中包含所有依赖项。它适用于其他设置,但有什么方法可以独立于它们工作吗?


另一个问题

目前,该类是我的应用程序的一部分,但我打算将它放在一个单独的库中。在那种情况下,我如何确保它可以与单独的 Jar 一起使用?

最佳答案

问题是 Eclipse 正在使用的 jarinjarloader ClassLoader。显然它使用自己的自定义 rsrc: URL 方案来指向存储在主 jar 文件中的 jar 文件。您的 URL 流处理程序工厂不理解此方案,因此 openStream() 方法返回 null,这会导致您所看到的问题。

这回答了您关于单独 jar 的问题的第二部分 - 这不仅可行,而且是唯一可行的方法。您需要更改主应用程序以使用单独的 jar,而不是将它们全部捆绑在主 jar 中。如果您正在构建 Web 应用程序,将它们复制到 WEB-INF/lib 目录中就可以了。如果您正在构建桌面应用程序,请在 META-INF/MANIFEST.MF 中添加对其他 jar 的相对路径引用,当您运行主 jar 时,它们将自 Action 为类路径的一部分包含在内。

关于java - Jar 输入流 : getNextJarEntry always returns null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com