Действительная подпись JAR для проектов JavaFX

Я работал с различными рецептами для создания исполняемого JAR файла для проекта JavaFX с использованием Maven POM. Каждый из этих вопросов Stackoverflow описывает ту же проблему. Это расстраивает то, что, кажется, существует несколько различных решений для одной и той же цели.

Проблема

java.lang.SecurityException: Недопустимый дайджест файла подписи для основных атрибутов манифеста

Ошибка при выполнении JAR файла в командной строке. Хотя Netbeans может с радостью запустить программу и отладить программу.

диагноз

Есть несколько вопросов о Stackoverflow и форуме об этом (наиболее полезные ниже). Хотя это известная проблема, мне еще предстоит найти ясное решение для работы с JavaFX. В процедурах, описанных в этих ответах, НЕ используется инструмент JavaFxPackager, который используется для объединения JAR JavaFX:

обычный подход: Популярный ответ на этот вопрос (255 голосов на момент написания): работает с не -JavaFX-модулями в нашем проекте:

Однако, когда мы помещаем тот же плагин в POM, который создает файл JAR JavaFX, мы по-прежнему получаем ошибку " Недопустимый файл сигнатур файла...". В частности, я поместил <artifactId>maven-shade-plugin</artifactId> сначала перед, а затем после правила exec JavaFxPackager. Результатом является

  • Maven предоставляет: "Недопустимый файл дайджеста файла для основных атрибутов...".

** вопрос *:

Как можно упаковать приложение JavaFX. Это настройка POM <build> section Netbeans для JavaFX:

      <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>

Конфигурация shard plugin, используемая на основе ответа в: "Недопустимый файл подписи" при попытке запустить .jar в настоящее время выглядит следующим образом:

              <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>

Чтобы максимально сократить Netbeans из уравнения, я просто запускаю

  • mvn package

В командной строке. Эта проблема просто является частым явлением, и я надеюсь, что кто-то взломал код для JavFX-пакета в других JAR файлах для сборки JavaFX.

Другие ссылки:

Ответ 1

У меня была очень похожая проблема; когда я включил подписанный JAR (bouncycastle) в проект. Его подпись была переупакована дословно, что привело к очевидному SecurityException:

java.lang.SecurityException: Недопустимый дайджест файла подписи для Манифест основных атрибутов

Фильтрация всех видов не удалась; решение, которое работает для меня, выглядит так в 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, который использует трикотаж и moxy для декодирования JSON. После добавления зависимостей приложение jersey-media-moxy сообщает об ошибке недопустимой подписи.

Я обнаружил, что это зависит от наличия файла подписи ECLIPSE_.RSA и ECLIPSE_.SF внутри META-INF для некоторых библиотек. В моем случае были 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

pom.xml в Netbeans, который вы указали, выполняет два отдельных шага. Первый вызывает maven-dependency-plugin, который расширяет всю внешнюю банку. Второй вариант использования exec-maven-plugin, который вызывает javafxpackager для создания окончательного файла jar файла, наконец, запускает его.

Выполняя два шага в сигнатуре последовательности в библиотеках org.eclipse, помещается в META-INF финального файла jar, и это порождает ошибку в сигнатуре.

Мое решение добавляет промежуточный шаг между выполнением плагина maven-dependency и plug-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>