OpenJDK 11.0.4 在类路径中有 java-atk-wrapper.jar

OpenJDK 11.0.4 has java-atk-wrapper.jar in the classpath

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

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

有趣的是,此行为特定于 OpenJDK-11.0.4。使用 11.0.3 时不会出现此问题。 任何人都可以阐明这里可能发生的事情吗? java-内部 jars/classes 是 loaded/accessed 的方式有什么变化吗?或者这可能只是 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

$

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

环境详细信息:

Ubuntu 16.04.5 LTS

OpenJDK 是通过 apt 全新安装的

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

apk-wrapper 是明确安装的。直到我们的一台机器上出现了这个问题,我才意识到它的存在——此时我也能够在我的本地机器上重现它。

当我尝试在 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。不在那里。所以我通过包管理器安装了它,然后再次 运行 你的程序。

仍然是 NPE1.

嗯嗯。

结论:您安装的 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 ... 因为 class 加载程序找不到清单资源。这就是应该发生的事情。

我也遇到了同样的情况:
我没有删除 libatk-wrapper-java ,而是从 getResources 遍历了所有 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)