2014-09-15 6 views
9

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

проблема:

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

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

диагноз

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

обычный подход: Сообщение популярный ответ на этот вопрос (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 используется на основании ответа в: "Invalid signature file" when attempting to run a .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.

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

+0

http://stackoverflow.com/questions/34738653/maven-shade-plugin-does-not-exclude-the-manifest-signature-files – ycnix

ответ

1

После долгих исследований я нашел решение, которое работает для моего проекта с использованием 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> 
    <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> 
12

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

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

Фильтрация всех видов не удалось; решение, которое работает для меня выглядит, как это в 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> 

я пропустил несколько строк после нового с «исключает» модель. Эта единственная строка была для меня решением - я включаю другие строки, чтобы вы могли видеть место размещения. (У меня были проблемы со многими другими сообщениями, которые не учитывали контекст тега, поэтому я стараюсь избавить других от этой проблемы).

Надежды, которые помогают другим с той же проблемой.

+0

Наконец-то! Я страдал часами с плагином тени, но безрезультатно. –

+0

Я знаю это чувство - это мотивировало меня написать этот ответ. – foo

+0

Это должен быть правильный ответ, зеленый контроль! – etlds

Смежные вопросы