Firma JAR válida para proyectos JavaFX

He estado trabajando con varias recetas para producir un archivo JAR ejecutable para un proyecto JavaFX utilizando un Maven POM. Cada una de estas preguntas sobre Stackoverflow describe el mismo problema. Es frustrante que parezca haber varias soluciones diferentes para el mismo objective.

problema :

java.lang.SecurityException: resumen de archivo de firma inválido para los atributos principales de Manifest

Error al ejecutar un archivo JAR en la línea de comando. Aunque Netbeans puede ejecutar felizmente el progtwig y depurar el progtwig.

diagnóstico

Hay varias preguntas de Stackoverflow y foro sobre esto (las más útiles a continuación). Aunque es un problema conocido, aún no he encontrado una solución clara para trabajar con JavaFX. Los procedimientos descritos en estas respuestas NO se utilizan con la herramienta JavaFxPackager utilizada para agrupar su JAR JavaFX:

  • Error al “resumen de archivo de firma inválido” al agregar el paquete Janino a través de Maven
  • Error (org.codehaus.mojo) al agregar persistencia a Maven-Java-project? … Esto parece el más prometedor ya que también es un proyecto de JavaFX. El mismo error aquí hasta ahora.

enfoque habitual : la respuesta popular posterior para esta pregunta (255 votos al momento de la redacción): funciona con módulos que no son de JAVA en nuestro proyecto:

  • “Archivo de firma inválido” cuando se intenta ejecutar un archivo .jar …

Sin embargo, cuando ponemos el mismo complemento en el POM que crea el archivo JAR de JavaFX, seguimos obteniendo el errorInvalid signature file digest …”. Específicamente, puse el maven-shade-plugin primero antes y después de la regla de ejecución de JavaFxPackager. El resultado es

  • Maven muestra el siguiente mensaje : ” Dígito de archivo de firma inválido para los atributos principales del manifiesto …”

**pregunta*:

¿Cómo se logra empaquetar una aplicación JavaFX? Esta es la section POM section Configuraciones de Netbeans para JavaFX:

     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      

La configuración de shard plugin utilizada en base a la respuesta en: “Archivo de firma inválido” cuando se intenta ejecutar un .jar tiene el siguiente aspecto:

   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        

Para mantener a Netbeans fuera de la ecuación tanto como sea posible, solo corro

  • paquete mvn

En la línea de comando. Este problema justo parece ser un problema frecuente y espero que alguien haya descifrado el código para la agrupación de JavFX en otros archivos JAR para una comstackción JavaFX.

Otros enlaces :

  • ¿Cómo decirle al maven-shade-plugin que preserve las firmas?
  • El paquete de empaquetado no es válido El proyecto del agregador necesita pom como embalaje
  • Apache Maven Shade Plug-in
  • JAR ejecutable

Tuve un problema muy similar; cuando incluí un JAR firmado (bouncycastle) en el proyecto. Su firma se volvió a empaquetar textualmente, lo que resultó en una obvia SecurityException:

java.lang.SecurityException: resumen de archivo de firma inválido para los atributos principales de Manifest

El filtrado de todos los géneros falló; la solución que funciona para mí se ve así en 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 ...     

Omití algunas líneas después de la nueva con el patrón “excluye”. Esta única línea fue la solución para mí, incluí las otras líneas para que pueda ver la ubicación. (Tuve problemas con muchas otras publicaciones que omitieron el contexto de una etiqueta, así que trato de evitarles a otros este problema).

Espero que ayude a otros con el mismo problema.

Después de mucha investigación encontré una solución que funciona para mi proyecto usando JavaFX, Maven y NetBeans.

Estoy trabajando en un cliente REST simple que usa jersey y moxy para decodificar JSON. Después de agregar la aplicación de dependencia jersey-media-moxy, se informa el error de la firma no válida.

Descubrí que esto depende de la presencia del archivo de firma ECLIPSE_.RSA y ECLIPSE_.SF dentro del META-INF para algunas bibliotecas. En mi caso fueron org.eclipse.persistence.moxy-2.5.0.jar , org.eclipse.persistence.antlr-2.5.0.jar , org.eclipse.persistence.asm-2.5.0.jar y org.eclipse.persistence.core-2.5.0.jar

El pom.xml en Netbeans que indicó ejecutando dos pasos separados. La primera invocación maven-dependency-plugin que expande todo el jar externo. El segundo uso exec-maven-plugin que llama a javafxpackager para crear el archivo jar final y finalmente ejecutarlo.

Al realizar los dos pasos en la secuencia, la firma en las bibliotecas de org.eclipse se coloca en el META-INF del archivo jar final y esto genera el error en la firma.

Mi solución es agregar un paso intermedio entre la ejecución de maven-dependency-plugin y exec-maven-plugin. En este paso, voy a eliminar todos los archivos de firmas dentro del directorio

 ${project.build.directory}/classes 

Para hacer esto, utilicé un plugin maven-antrun-plugin

  maven-antrun-plugin 1.8   package  run