Install4j JRE 捆绑过程破坏了 lib jar 的 SHA 哈希?
Install4j JRE bundling process breaks the SHA hash of lib jars?
我正在使用 Install4j 5.1.11 为我的应用程序创建一个 Windows 安装程序。我需要嵌入 JRE 版本 1.7.0_72。这个特定版本的 JRE 在 Install4j JRE 下载列表中不可用。所以我通过将 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
。凉爽的。现在在媒体文件向导中,我 select 这个 JRE 包嵌入并构建我的安装程序。
然后我 运行 构建安装程序并安装我的应用程序。我可以看到 jre
在安装主目录下解压并且具有相同的版本 1.7.0_72
。凉爽的。所以现在我使用 exe 启动器启动应用程序,它启动 Tomcat 并加载应用程序等,并使用嵌入式 jre。对于其中一个 Web 应用程序(称为 Fieldbook),当 Tomcat 正在加载上下文时,我收到如下所示的错误:
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.jar
的 META-INF/MANIFEST.MF
中的内容,后者通常是 jre/lib
的一部分?
Install4j 5.x 版本在创建 JRE 包时应用 Pack 200 压缩。此压缩选项不可配置。压缩最终会修改 JRE 包的内容,这会破坏已签名和摘要标记的 jar 文件,例如 jce.jar
,它是 JRE lib 的一部分。
解决方法是使用 Install4j v6.x 创建 JRE 包,并取消选中允许禁用压缩的新 "Pack Jar files" 选项。然后可以在 Install4j 5.x 项目中使用这些包(通过将它们放在 Install4j 安装的 jres 文件夹下)嵌入到媒体文件中。
我正在使用 Install4j 5.1.11 为我的应用程序创建一个 Windows 安装程序。我需要嵌入 JRE 版本 1.7.0_72。这个特定版本的 JRE 在 Install4j JRE 下载列表中不可用。所以我通过将 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
。凉爽的。现在在媒体文件向导中,我 select 这个 JRE 包嵌入并构建我的安装程序。
然后我 运行 构建安装程序并安装我的应用程序。我可以看到 jre
在安装主目录下解压并且具有相同的版本 1.7.0_72
。凉爽的。所以现在我使用 exe 启动器启动应用程序,它启动 Tomcat 并加载应用程序等,并使用嵌入式 jre。对于其中一个 Web 应用程序(称为 Fieldbook),当 Tomcat 正在加载上下文时,我收到如下所示的错误:
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.jar
的 META-INF/MANIFEST.MF
中的内容,后者通常是 jre/lib
的一部分?
Install4j 5.x 版本在创建 JRE 包时应用 Pack 200 压缩。此压缩选项不可配置。压缩最终会修改 JRE 包的内容,这会破坏已签名和摘要标记的 jar 文件,例如 jce.jar
,它是 JRE lib 的一部分。
解决方法是使用 Install4j v6.x 创建 JRE 包,并取消选中允许禁用压缩的新 "Pack Jar files" 选项。然后可以在 Install4j 5.x 项目中使用这些包(通过将它们放在 Install4j 安装的 jres 文件夹下)嵌入到媒体文件中。