JavaFX项目的有效JAR签名
我一直在使用各种配方来使用Maven POM为JavaFX项目生成可运行的JAR文件。 这些Stackoverflow问题中的每一个都描述了同样的问题。 令人沮丧的是,对于同一目标似乎有几种不同的解决方案。
问题 :
java.lang.SecurityException: Manifest主要属性的签名文件摘要无效
在命令行上执行JAR文件时出错。 虽然Netbeans可以愉快地运行程序并调试程序。
诊断
有关于此的几个Stackoverflow和论坛问题(下面最有用的)。 即使是一个已知问题,我还没有找到一个明确的解决方案来使用JavaFX。 这些答案中描述的过程不是用于捆绑JavaFX JAR的JavaFxPackager工具:
- “无效的签名文件摘要”错误通过Maven添加Janino包
- 向Maven-Java项目添加持久性时出错(org.codehaus.mojo)? …这看起来最有希望,因为它也是一个JavaFX项目。 到目前为止同样的错误。
通常的方法 :这个问题的流行答案(撰写本文时为255票):在我们的项目中使用非 -JavaFX模块:
- 尝试运行.jar时“无效的签名文件” …
但是,当我们在构建JavaFX JAR文件的POM中放入相同的插件时,我们仍然得到:“ 无效的签名文件摘要 …”错误。 具体来说,我首先在JavaFxPackager exec规则之前和之后放置maven-shade-plugin
。 结果是
- Maven给出:“ Manifest主要属性的无效签名文件摘要 ……”错误
**题*:
如何管理JavaFX应用程序。 这是JavaFX的POM section
Netbeans设置:
src/main/resources true org.apache.maven.plugins maven-dependency-plugin 2.8 unpack-dependencies package unpack-dependencies system junit,org.mockito,org.hamcrest ${project.build.directory}/classes org.codehaus.mojo exec-maven-plugin 1.3.2 unpack-dependencies package exec ${java.home}/../bin/javafxpackager -createjar -nocss2bin -appclass ${mainClass} -srcdir ${project.build.directory}/classes -outdir ${project.build.directory} -outfile ${project.build.finalName}.jar default-cli exec ${java.home}/bin/java ${runfx.args} org.apache.maven.plugins maven-compiler-plugin 3.1 1.8 1.8 -Xlint:unchecked true true ${sun.boot.class.path}${path.separator}${java.home}/lib /jfxrt.jar org.apache.maven.plugins maven-surefire-plugin 2.16 ${java.home}/lib/jfxrt.jar
根据以下答案使用的shard plugin
配置: “无效的签名文件”在尝试运行.jar时,目前看起来像这样:
org.apache.maven.plugins maven-shade-plugin 2.3 remove-sign-files package shade *:* classes/META-INF/*.SF classes/META-INF/*.DSA classes/META-INF/*.RSA
为了尽可能地让Netbeans脱离这个等式,我就跑了
- mvn包
在命令行上。 这个问题似乎是一个常见问题,我希望有人破解了JavFX捆绑其他JAR文件中的JavaFX构建代码。
其他链接 :
- 如何告诉maven-shade-plugin保留签名?
- 包装jar无效Aggregator项目需要pom作为包装
- Apache Maven Shade插件
- 可执行的JAR
我有一个非常相似的问题; 当我在项目中包含一个签名的JAR(bouncycastle)时。 它的签名是逐字重新打包的,导致一个明显的SecurityException:
java.lang.SecurityException:Manifest主要属性的签名文件摘要无效
过滤所有种类都失败了; 适合我的解决方案在pom.xml中看起来像这样:
org.apache.maven.plugins maven-dependency-plugin 2.8 unpack-dependencies package unpack-dependencies META-INF/*.SF,META-INF/*.DSA,META-INF/*.RSA ...
我在新的“排除”模式之后省略了一些行。 这条单线是我的解决方案 – 我包括其他线,以便您可以看到放置。 (我在许多其他post中省略了标签的上下文,所以我试图为其他人省去这个麻烦)。
希望能帮助其他人解决同样的问题。
经过大量的研究,我找到了一个适用于我的项目的解决方案,使用JavaFX,Maven和NetBeans。
我正在研究一个简单的REST客户端,它使用jersey和moxy来解码JSON。 添加依赖项后,jersey-media-moxy应用程序报告无效签名的错误。
我发现这取决于某些库中META-INF内是否存在签名文件ECLIPSE_.RSA和ECLIPSE_.SF 。 在我的例子中是org.eclipse.persistence.moxy-2.5.0.jar
, org.eclipse.persistence.antlr-2.5.0.jar
, org.eclipse.persistence.asm-2.5.0.jar
和org.eclipse.persistence.core-2.5.0.jar
您指示运行两个单独步骤的Netbeans中的pom.xml。 第一个调用maven-dependency-plugin扩展了所有外部jar。 第二个使用exec-maven-plugin调用javafxpackager来创建最终的jar文件,最后运行它。
通过在org.eclipse中执行序列签名中的两个步骤,库被放置在最终jar文件的META-INF中,这会在签名上生成错误。
我的解决方案是在执行maven-dependency-plugin和exec-maven-plugin之间添加一个中间步骤。 在这一步中,我将删除目录中的所有签名文件
${project.build.directory}/classes
为此,我使用了一个插件maven-antrun-plugin
maven-antrun-plugin 1.8 package run