Install4j J​​RE捆绑进程是否打破了lib jars的SHA哈希?

时间:2015-03-05 23:32:49

标签: install4j

我正在使用Install4j 5.1.11为我的应用程序创建Windows安装程序。我需要用它嵌入JRE版本1.7.0_72。 Install4j J​​RE下载列表中没有此特定版本的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。凉。现在,在媒体文件向导中,我选择了这个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哈希变得与META-INF/MANIFEST.MF jce.jar中的jre/lib不同,后者通常是{{1}}的一部分?

1 个答案:

答案 0 :(得分:1)

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

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