我有一个带有签名 JAR 的 Java 应用程序,其中包含所有类文件和资源。该应用程序附带一个捆绑的 JRE 和一个可执行文件。此可执行文件是用 C++ 编写的,并使用 JNI 加载 VM 并启动应用程序。这在过去完美无缺。
从 JRE 8u232(例如 Azul,还有来自 Oracle 的 8u231)开始,应用程序不再运行,因为在 JNI 的FindClass()函数中找不到指定的主类。它返回一个空指针,然后当我调用该ExceptionDescribe()函数时,它会显示 Java 方法中发生的 NPE JarVerifier::processEntry:
Exception in thread "main" java.lang.NullPointerException
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:303)
at java.util.jar.JarVerifier.update(JarVerifier.java:230)
at java.util.jar.JarFile.initializeVerifier(JarFile.java:383)
at java.util.jar.JarFile.ensureInitialization(JarFile.java:612)
at java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:69)
at sun.misc.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:991)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:451)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
Run Code Online (Sandbox Code Playgroud)
当我从 JAR 的 META-INF 文件夹中删除 *.RSA 和 *.SF 文件时,它又可以工作了。当我从 JRE 的“bin”文件夹调用“java”可执行文件时,它也可以工作,如下所示:
java -cp …Run Code Online (Sandbox Code Playgroud) 我已经更新到 Azul Zulu 8u282 JRE,我注意到一个新的 JAR 文件在我使用的以前的版本 (8u265) 中没有。它被称为“crs-agent.jar”,类文件都在包结构“com.azul.crs.*”内。当我用 IntelliJ 反编译它们时,它看起来像是一些诊断或报告的东西,而且还有网络在工作。
我在 Azul 网站上浏览了大量当前和旧版本的发行说明,但没有关于此 CRS 的信息。维基百科为该首字母缩写词提供了几个结果,其中“运营商路由系统”最有意义。
那么这个 JAR 是做什么用的呢?我可以删除它吗?