适用于 JavaFX 项目的有效 JAR 签名

2022-09-04 08:29:32

我一直在研究各种配方,以使用Maven POM为JavaFX项目生成可运行的JAR文件。这些 Stackoverflow 问题中的每一个都描述了相同的问题。令人沮丧的是,似乎有几种不同的解决方案可以实现同一目标。

问题

java.lang.SecurityException:Manifest main attributes 的签名文件摘要无效

在命令行上执行 JAR 文件时出错。尽管 Netbean 可以愉快地运行程序并调试程序。

诊断

关于这一点,有几个Stackoverflow和论坛问题(下面最有帮助的问题)。尽管这是一个已知的问题,但我还没有找到一个明确的解决方案来使用JavaFX。这些答案中描述的过程与用于捆绑JavaFX JAR的JavaFxPackager工具无关:

通常的方法:这个问题的流行答案(在撰写本文时为255票):适用于我们项目中的非JavaFX模块:

但是,当我们在构建JavaFX JAR文件的POM中放置相同的插件时,我们仍然会得到:“无效的签名文件摘要......”错误。具体来说,我把第一个放在JavaFxPackager执行规则之前和之后。结果是<artifactId>maven-shade-plugin</artifactId>

  • Maven 给出了:“清单主要属性的无效签名文件摘要...”错误

**问题*:

如何设法打包JavaFX应用程序。这是 JavaFX 的 POM Netbeans 设置:<build> section

      <build>
          <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
          </resources>

          <plugins>
             <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-dependency-plugin</artifactId>
                  <version>2.8</version>
                  <executions>
                      <execution>
                          <id>unpack-dependencies</id>
                          <phase>package</phase>
                          <goals>
                              <goal>unpack-dependencies</goal>
                          </goals>
                          <configuration>
                              <excludeScope>system</excludeScope>
                              <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                              <outputDirectory>${project.build.directory}/classes</outputDirectory>
                          </configuration>
                      </execution>
                  </executions>
              </plugin>

              <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>exec-maven-plugin</artifactId>
                  <version>1.3.2</version>
                  <executions>
                      <execution>
                          <id>unpack-dependencies</id>
                          <phase>package</phase>
                          <goals>
                              <goal>exec</goal>
                          </goals>
                          <configuration>
                              <executable>${java.home}/../bin/javafxpackager</executable>
                              <arguments>
                                  <argument>-createjar</argument>
                                  <argument>-nocss2bin</argument>
                                  <argument>-appclass</argument>
                                  <argument>${mainClass}</argument>
                                  <argument>-srcdir</argument>
                                  <argument>${project.build.directory}/classes</argument>
                                  <argument>-outdir</argument>
                                  <argument>${project.build.directory}</argument>
                                  <argument>-outfile</argument>
                                  <argument>${project.build.finalName}.jar</argument>
                              </arguments>
                          </configuration>
                      </execution>
                      <execution>
                          <id>default-cli</id>
                          <goals>
                              <goal>exec</goal>
                          </goals>
                          <configuration>
                              <executable>${java.home}/bin/java</executable>
                              <commandlineArgs>${runfx.args}</commandlineArgs>
                          </configuration>
                      </execution>
                  </executions>
              </plugin>

              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <version>3.1</version>
                  <configuration>
                      <source>1.8</source>
                      <target>1.8</target>
                      <compilerArgument>-Xlint:unchecked</compilerArgument>  <!-- all -->
                      <showWarnings>true</showWarnings>
                      <showDeprecation>true</showDeprecation>
                      <compilerArguments>
                          <bootclasspath>${sun.boot.class.path}${path.separator}${java.home}/lib      /jfxrt.jar</bootclasspath>
                      </compilerArguments>
                  </configuration>
              </plugin>

              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-surefire-plugin</artifactId>
                  <version>2.16</version>
                  <configuration>
                      <additionalClasspathElements>
                          <additionalClasspathElement>${java.home}/lib/jfxrt.jar</additionalClasspathElement>
                      </additionalClasspathElements>
                  </configuration>
              </plugin>
          </plugins>
      </build>

尝试运行.jar时,基于“无效的签名文件”中的答案使用的配置目前如下所示:shard plugin

              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-shade-plugin</artifactId>
                      <!--    http://maven.apache.org/plugins/maven-shade-plugin/     -->
                      <!--    http://docs.codehaus.org/display/MAVENUSER/Shade+Plugin -->
                      <!--    http://zhentao-li.blogspot.com.au/2012/06/maven-shade-plugin-invalid-signature.html     -->
                  <version>2.3</version>
                  <executions>
                      <execution>
                        <id>remove-sign-files</id>
                        <phase>package</phase>
                        <goals>
                          <goal>shade</goal>
                        </goals>
                        <configuration>
                          <filters>
                              <filter>
                                  <artifact>*:*</artifact>
                                  <excludes>
                                      <exclude>classes/META-INF/*.SF</exclude>
                                      <exclude>classes/META-INF/*.DSA</exclude>
                                      <exclude>classes/META-INF/*.RSA</exclude>
                                  </excludes>
                              </filter>
                          </filters>
                        </configuration>
                      </execution>
                  </executions>
              </plugin>

为了尽可能地将 Netbean 排除在等式之外,我只是运行

  • mvn package

在命令行上。这个问题似乎是一个常见的问题,我希望有人已经破解了JavFX捆绑在其他JAR文件中的代码,用于JavaFX构建。

其他链接


答案 1

我有一个非常相似的问题;当我在项目中包含一个签名的JAR(弹跳城堡)时。它的签名被逐字重新打包,从而产生了明显的SecurityException:

java.lang.SecurityException:Manifest main attributes 的签名文件摘要无效

各种过滤失败;对我有用的解决方案在pom中如下所示.xml:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>2.8</version>
  <executions>
    <execution>
      <id>unpack-dependencies</id>
      <phase>package</phase>
      <goals>
        <goal>unpack-dependencies</goal>
      </goals>
      <configuration>
        <excludes>META-INF/*.SF,META-INF/*.DSA,META-INF/*.RSA</excludes>
        ...
      </configuration>
    </execution>
  </executions>
</plugin>

我在具有“排除”模式的新行之后省略了一些行。这一行对我来说是解决方案 - 我包括其他行,所以你可以看到位置。(我在许多其他帖子中遇到了麻烦,这些帖子省略了标签的上下文,所以我试图为其他人省去这个麻烦)。

希望能帮助其他有同样问题的其他人。


答案 2

经过大量研究,我找到了一个适用于我的项目的解决方案,它使用JavaFX,Maven和NetBeans。

我正在开发一个简单的REST客户端,它使用jersey和moxy来解码JSON。添加依赖项后,jersey-media-moxy 应用程序会报告无效签名的错误。

我发现这取决于签名文件ECLIPSE_是否存在。RSAECLIPSE_。某些库的 META-INF 中的 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

pom.xml Netbeans 中,您指示运行两个单独的步骤。第一个调用maven-dependency-plugin,它扩展了所有外部jar。第二个使用exec-maven-plugin调用javafxpackager来创建最终的jar文件e最终运行它。

通过在 org.eclipse 库中执行序列签名中的两个步骤,这些库被放置在最终 jar 文件的 META-INF 中,这会在签名上生成错误。

我的解决方案是在执行 maven-dependency-plugin 和 exec-maven-plugin 之间添加一个中间步骤。在此步骤中,我将删除目录中的所有签名文件

${project.build.directory}/classes

为此,我使用了一个插件maven-antrun-plugin。

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
         <execution>
              <phase>package</phase>
              <goals>
                   <goal>run</goal>
              </goals>
              <configuration>
                   <target>
                       <delete>
                           <fileset dir="${project.build.directory}/classes" includes="**/META-INF/*.DSA"/>
                           <fileset dir="${project.build.directory}/classes" includes="**/META-INF/*.RSA"/>
                           <fileset dir="${project.build.directory}/classes" includes="**/META-INF/*.SF"/>
                    </delete>
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

推荐