1

我在尝试通过 .jar 从应用程序的 .jar 文件加载 MANIFEST.MF 时注意到了这个问题class.getResource("/META-INF/MANIFEST.MF")

而不是得到我自己的清单,清单似乎是从/usr/share/java/java-atk-wrapper.jar. 但是,此 jar 未指定为我的应用程序类路径的一部分 - 我尝试禁用 java 可访问性辅助技术(此处),但这没有效果。

有趣的是,这种行为特定于 OpenJDK-11.0.4。使用 11.0.3 时不会出现此问题。任何人都可以阐明这里可能发生的事情吗?java-internal jars/classes 的加载/访问方式是否有某种变化?或者这可能只是 11.0.4 中引入的一个错误?

最小的工作示例:

import java.net.URL;

public class Main {
    public static void main(String[] args) {
        final URL resource = Main.class.getResource("/META-INF/MANIFEST.MF");
        System.out.println(resource.getPath());
    }
}

然后运行:

$ java --version
openjdk 11.0.4 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-116.04.1)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-116.04.1, mixed mode, sharing)
$ javac Main.java
$ java Main
file:/usr/share/java/java-atk-wrapper.jar!/META-INF/MANIFEST.MF
$ echo $CLASSPATH

$

此代码片段的预期行为是抛出 NPE,因为没有清单资源。相反,清单是从 atk-wrapper 加载的。

环境细节:

Ubuntu 16.04.5 LTS

OpenJDK 是通过 apt 全新安装的

add-apt-repository ppa:openjdk-r/ppa
apt install openjdk-11-jdk

apk-wrapper没有明确安装。在我们的一台机器上发生此问题之前,我不知道它的存在——此时我也能够在我的本地机器上重现它。

4

2 回答 2

2

当我尝试在 Fedora 29 上使用 OpenJDK Java 11.0.4 重现这一点时,我得到了一个 NPE。

$ javac Main.java 
$ java Main 
Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:6)
$ java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment 18.9 (build 11.0.4+11)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.4+11, mixed mode, sharing)
$ echo $CLASSPATH

$

然后我试图找到java-atk-wrapper.jar. 不在那里。所以我通过包管理器安装了它,然后再次运行你的程序。

仍然是 NPE 1

嗯。

结论:您安装的 OpenJDK Java 11.0.4 有一些奇怪的地方,但不是 OpenJDK 本身的错误。

请注意,以下 OpenJDK 错误报告与此相关:

似乎是说 OpenJDK 团队不支持/维护该 JAR 文件中的内容。


更新

鉴于您添加到问题的额外信息,问题似乎是 Debian / Ubuntu 的 OpenJDK 软件包中的错误。我发现了这个似乎相关的 Debian 错误:

我怀疑他们修复原始错误(“辅助功能未加载”)的尝试引入了这种回归。

我给你的建议是:

  1. 使用 Ubuntu / Debian 提出一个新问题。让他们决定是否需要在上游提出这个问题,或者这是否是他们需要解决的问题。

  2. 如果您想尝试一种 hacky 解决方法,请查看如果您重命名java-atk-wrapper.jar以使启动器无法找到它会发生什么。它可能会起作用。

  3. 或者(不那么老套),看看你的系统上JAR 文件来自哪个 Ubuntu 包。如果有意义,请卸载该软件包以及依赖它的任何内容。


1 - NPE 发生是因为getResource正在返回null......因为类加载器找不到清单资源。这就是应该发生的事情。

于 2019-10-04T14:06:50.167 回答
0

我也遇到了同样的情况:我
没有删除 libatk-wrapper-java ,而是遍历了 getResource 中所有 URL,并选择了带有 jar 名称的 URL。
https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#getResources-java.lang.String-

Env: 
$uname -a 
Linux hostname 5.11.0-46-generic #51~20.04.1-Ubuntu SMP Fri Jan 7 06:51:40 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
$java -version
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)
于 2022-01-17T12:57:02.530 回答