我在尝试通过 .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没有明确安装。在我们的一台机器上发生此问题之前,我不知道它的存在——此时我也能够在我的本地机器上重现它。