【问题标题】:Java 8u74 classLoader.getResource("").getPath(); returns NULLJava 8u74 classLoader.getResource("").getPath();返回 NULL
【发布时间】:2016-02-23 09:22:19
【问题描述】:

我们正在使用 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 版本上,这都能正常工作。

这是否与错误消息有关?

知道为什么会发生这种情况或如何解决这个问题吗?

【问题讨论】:

  • 你认为classLoader.getResource("") 应该返回什么?您在与class 相同的文件夹中是否有一个名为EMPTY_STRING 的资源?否则,返回nullthe documentation 中指定的行为。
  • “正常工作”是什么意思? classLoader.getResource("")的结果是怎么定义的?
  • 我想知道OP是否将classLoader.getResource("")的行为与new File("")混淆了。
  • @Tom 有一个 URLClassLoader 的 UB,确实返回文件夹上 getResource 的路径。我认为 OP 在某些逻辑上依赖它...

标签: java java-web-start


【解决方案1】:

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“表示各种证书问题之一”,而且是@987654323 的子类@-- 请注意 privilegessecurity 这两个词。

您确定myFile.jar 的清单是正确的吗?-- 如果是,那么您运行的是什么确切的 JVM?-- 如果您的清单正确,则此问题可能与 a reported bug in OpenJDK 8u72 有关。遗憾的是,如果没有有关您的部署的更多信息,则无法确定。

【讨论】:

  • Manifest 文件是:Manifest-Version: 1.0 Permissions: all-permissions Created-By: 1.6.0_31 (Sun Microsystems Inc.) Name: myFile/file.txt SHA1-Digest: ...
【解决方案2】:

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

  <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>

【讨论】:

  • 您可以使用 jogamp-fat.jar 来避免必须管理包含本机库的 JAR,它会解决您的问题,因为它也包含 Java 代码,因为它包含 GlueGen,所以它更大, JOGL、JOAL 和 JOCL。
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2019-08-25
  • 2016-05-28
  • 2016-03-08
  • 2015-12-09
相关资源
最近更新 更多