【问题标题】:Install4j JRE bundling process breaks the SHA hash of lib jars?Install4j J​​RE 捆绑过程会破坏 lib jar 的 SHA 哈希值吗?
【发布时间】:2015-03-05 23:32:49
【问题描述】:

我正在使用 Install4j 5.1.11 为我的应用程序创建 Windows 安装程序。我需要将 JRE 版本 1.7.0_72 嵌入其中。此特定版本的 JRE 在 Install4j J​​RE 下载列表中不可用。所以我通过将 Install4j 指向C\Program Files\Java\jdk_1.7.0_72\jre 来手动创建一个包。 Install4j 创建一个捆绑包C:\Program Files (x86)\install4j5\jres\windows-amd64-1.7.0_72.tar.gz。凉爽的。现在在媒体文件向导中,我选择了这个 JRE 包来嵌入并构建我的安装程序。

然后我运行构建的安装程序并安装我的应用程序。我可以看到jre在安装主目录下解压,并且具有相同的版本1.7.0_72。凉爽的。所以现在我使用 exe 启动器启动应用程序,它启动 Tomcat 并加载应用程序等,并使用嵌入式 jre。对于 Tomcat 加载上下文时的其中一个 Web 应用程序(称为 Fieldbook),我收到如下所示的错误:

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Fieldbook]]
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
 at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1120)
 at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1678)
 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
 at java.util.concurrent.FutureTask.run(FutureTask.java:262)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.SecurityException: SHA1 digest error for javax/crypto/CipherSpi.class
 at sun.security.util.ManifestEntryVerifier.verify(ManifestEntryVerifier.java:220)
 at java.util.jar.JarVerifier.processEntry(JarVerifier.java:241)
 at java.util.jar.JarVerifier.update(JarVerifier.java:228)
 at java.util.jar.JarVerifier$VerifierStream.read(JarVerifier.java:483)
 at java.io.FilterInputStream.read(FilterInputStream.java:133)
 at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
 at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
 at java.io.DataInputStream.readInt(DataInputStream.java:387)
 at org.apache.tomcat.util.bcel.classfile.ClassParser.readID(ClassParser.java:237)
 at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:114)
 at org.apache.catalina.startup.ContextConfig.populateJavaClassCache(ContextConfig.java:2293)

发生了什么事?为什么 CipherSpi.class 的 SHA 哈希值与 jce.jarMETA-INF/MANIFEST.MF 中的哈希值不同,而 jce.jar 通常是 jre/libs 的一部分?

【问题讨论】:

  • 这可能与pack200有关。在 JRE 包向导中,请取消选中“选择 JRE”步骤中的“打包 JAR 文件”复选框并创建一个新包。那么问题会消失吗?
  • 对不起,该功能仅在 6.0 之后才存在。您可以使用 6.0 创建一个同样适用于 5.1.15 的包
  • 感谢英戈凯格尔。在我使用的 Install4j 5.1.11 版本中,向导的“选择 JRE”步骤上没有“打包 Jar 文件”复选框。但是,我在常规设置 -> 媒体文件选项 -> 压缩部分下确实有“使用 Pack200 Jar 压缩(仅适用于 Java >=1.5)”选项,并且没有勾选。我确实在相同的设置下勾选了“使用 LZMA 压缩”选项,这也是原因吗?
  • 不,只有 pack200 可能会导致这样的问题。无论媒体文件部分中的设置如何,都会打包 JRE 包。在 6.0 版中,JRE 包创建向导有一个禁用 pack200 的选项。
  • @IngoKegel 我下载了 Install4j 6.0.1(适用于 Windows 64 位)并使用 90 天评估许可证进行安装。不幸的是,自定义 JRE 包创建向导屏幕(由“我找不到合适的 JRE 包”链接加载的屏幕)根本没有加载!也没有消息。单击此链接没有任何反应。另一个错误?

标签: install4j


【解决方案1】:

Install4j 5.x 版本在创建 JRE 包时应用 Pack 200 压缩。此压缩选项不可配置。压缩最终会修改 JRE 包的内容,这会破坏已签名和摘要标记的 jar 文件,例如 jce.jar,它是 JRE 库的一部分。

解决方法是使用 Install4j v6.x 创建 JRE 捆绑包,取消选中允许禁用压缩的新“打包 Jar 文件”选项。然后可以在 Install4j 5.x 项目中使用这些包(通过将它们放在 Install4j 安装的 jres 文件夹下)以嵌入媒体文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2011-09-30
    • 2021-01-31
    相关资源
    最近更新 更多