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_.RSAECLIPSE_.SF 。 在我的例子中是org.eclipse.persistence.moxy-2.5.0.jarorg.eclipse.persistence.antlr-2.5.0.jarorg.eclipse.persistence.asm-2.5.0.jarorg.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