Действительная подпись 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 из уравнения, я просто запускаю
В командной строке. Эта проблема просто является частым явлением, и я надеюсь, что кто-то взломал код для 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>