Java 8u74 classLoader.getResource("")。getPath();返回NULL

时间:2016-02-23 09:22:20

标签: java java-web-start

我们正在使用Java Web Start来部署我们的应用程序。 所有JAR文件都已签名,并且在使用所有Java版本(包括8u73)的应用程序时没有任何问题。

使用JRE 8u74,应用程序部署正常(已下载所有JAR文件并正确启动应用程序)。 尝试从JAR文件中提取文件时,我们收到以下消息:

Failed to validate certificate. The application will not be executed.

java.security.cert.CertificateException: Could not verify signing in resource: https://www.example.com:443/app/myFile.jar
            at com.sun.deploy.security.TrustDecider.ensureAllJarEntriesSigned(Unknown Source)
            at com.sun.deploy.security.TrustDecider.getValidationState(Unknown Source)
            at com.sun.deploy.security.TrustDecider.validateChain(Unknown Source)
            at com.sun.deploy.security.TrustDecider.isAllPermissionGrantedInt(Unknown Source)
            at com.sun.deploy.security.TrustDecider.isAllPermissionGranted(Unknown Source)
            at com.sun.deploy.security.DeployURLClassLoader.getResourcePermission(Unknown Source)
            at com.sun.deploy.security.DeployURLClassLoader.getResourceAsStream(Unknown Source)
            at com.til.manager.B.A.A(Unknown Source)
            at com.til.manager.B.A.D(Unknown Source)
            at com.til.manager.B.A.B(Unknown Source)
            at com.til.manager.app.H$6.run(Unknown Source)
Caused by: com.sun.deploy.net.JARSigningException: Could not verify signing in resource: https://www.example.com:443/app/myFile.jar

多个文件都会发生这种情况。 当我们的应用程序尝试将文件从JAR文件提取到本地计算机时,会显示此错误消息。

进一步调查我们发现在8u74上,代码如下:

ClassLoader classLoader = this.getClass().getClassLoader();
classLoader.getResource("").getPath();

第二行返回NULL。 在以前的所有Java版本中,这都正常工作。

这可以连接到错误消息吗?

知道为什么会这样或者如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

The API documentation for ClassLoader.getResource(String)声称它将返回null"如果无法找到资源或者调用者没有足够的权限来获取资源"。此外,我使用OpenJDK 1.7.0_95以及Oracle JDK 1.8.0_72测试了您列出的代码,并且两者都在我的系统上 not 返回null,而是返回执行目录(例如/home/errantlinguist/Eclipse%20Workspaces/Default/ClassLoaderTest8/bin/)。

这两个证据表明,您所获得的空引用是问题的症状而不是原因:CertificateException"表示各种证书问题之一" ,而且还是GeneralSecurityException的子类 - 请注意 privileges security

您是否完全确定myFile.jar的清单是否正确? - 如果是这样,您运行的JVM究竟是什么? - 如果清单正确,则可能是此问题与{{{ 3}}。遗憾的是,如果没有关于部署的进一步信息,我们无法确定。

答案 1 :(得分:0)

我遇到了同样的问题,但我的JNLP提到的Jar只有DLL,没有Java代码。在阅读了与此问题相关的数百个类似线程后,很明显我可能需要将一个Jar添加到实际包含Java代码的JNLP中。所以,我原来的JNLP包括4个带有DLL的Jars,如下所示:

  <resources os="Windows" arch="x86">
    <nativelib href="lib/jogl/jogl-all-natives-windows-i586.jar"/>
  </resources>
  <resources os="Windows" arch="amd64">
    <nativelib href="lib/jogl/jogl-all-natives-windows-amd64.jar"/>
  </resources>
  <resources os="Windows" arch="x86">
    <nativelib href="lib/jogl/gluegen-rt-natives-windows-i586.jar"/>
  </resources>
  <resources os="Windows" arch="amd64">
    <nativelib href="lib/jogl/gluegen-rt-natives-windows-amd64.jar"/>
  </resources>

这与Java.security.cert.CertificateException失败:无法验证资源中的签名:...

然后,当我在其中添加一个带有Java代码的签名Jar时,问题就消失了:

  <resources>
    <jar href="lib/hdf/jhdf.jar"/>
  </resources>