Mi programa java está empaquetado en un archivo jar y hace uso de una biblioteca jar externa, castillo hinchable . Mi código se compila bien, pero ejecutar el jar provoca el siguiente error:
Excepción en el subproceso "main" java.lang.SecurityException: resumen de archivo de firma no válido para los atributos principales del manifiesto
Busqué en Google durante más de una hora buscando una explicación y encontré muy poco valor. Si alguien ha visto este error antes y podría ofrecer alguna ayuda, estaría obligado.
Respuestas:
La solución que se enumera aquí podría proporcionar un puntero.
Línea de fondo :
fuente
Para aquellos que obtuvieron este error al intentar crear un uber-jar con
maven-shade-plugin
, la solución es excluir los archivos de firma de manifiesto agregando las siguientes líneas a la configuración del complemento:fuente
Para aquellos que usan gradle e intentan crear y usar un tarro gordo, la siguiente sintaxis podría ayudar.
fuente
exclude
a mifatJar
tarea, que tenía eseconfigurations.compile.collect
comando. Ver stackoverflow.com/a/31426413/103412Error: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
Es probable que algunas de sus dependencias sean archivos jar firmados. Cuando los combina todos en un gran archivo jar, los archivos de firma correspondientes todavía están presentes, y ya no coinciden con el archivo jar "grande combinado", por lo que el tiempo de ejecución se detiene pensando que el archivo jar ha sido manipulado (lo cual ... hablar).
Puede resolver el problema eliminando los archivos de firma de sus dependencias de archivo jar. Desafortunadamente, no es posible hacer esto en un solo paso en la hormiga .
Sin embargo, pude hacer que esto funcionara con Ant en dos pasos, sin nombrar específicamente cada dependencia de archivo jar, usando:
Se supone que el elemento de suspensión previene errores sobre archivos con fechas de modificación en el futuro .
Otras variaciones que encontré en los hilos vinculados no funcionaron para mí.
fuente
Por favor use el siguiente comando
fuente
Tuve este problema al usar IntelliJ IDEA 14.01.
Pude arreglarlo:
Archivo-> Estructura del proyecto-> Agregar nuevo (artefactos) -> jar-> Desde módulos con dependencias en la ventana Crear jar desde el módulo:
Selecciona tu clase principal
Archivo JAR de bibliotecas Seleccione copiar en el directorio de salida y enlace mediante manifiesto
fuente
La seguridad ya es un tema difícil, pero me decepciona ver que la solución más popular es eliminar las firmas de seguridad. JCE requiere estas firmas . Maven Shading explota el archivo jar de BouncyCastle que coloca las firmas en META-INF, pero las firmas BouncyCastle no son válidas para un nuevo jar uber (solo para el jar BC), y eso es lo que causa el error de firma no válido en este hilo .
Sí, excluir o eliminar las firmas según lo sugerido por @ruhsuzbaykus hace que el error original desaparezca, pero también puede conducir a nuevos errores crípticos:
Al especificar explícitamente dónde encontrar el algoritmo de esta manera:
Pude obtener un error diferente:
JCE no puede autenticar al proveedor porque hemos eliminado las firmas criptográficas siguiendo la sugerencia en otra parte de este mismo hilo .
La solución que encontré fue el complemento de empaquetador ejecutable que utiliza un enfoque jar-in-jar para preservar la firma BouncyCastle en un solo jar ejecutable.
ACTUALIZACIÓN :
Otra forma de hacer esto (¿la forma correcta?) Es usar el firmante Maven Jar . Esto le permite seguir usando la sombra Maven sin obtener errores de seguridad. SIN EMBARGO, debe tener un certificado de firma de código (Oracle sugiere buscar el "Certificado de firma de código Java"). La configuración de POM se ve así:
No, no hay forma de que JCE reconozca un certificado autofirmado, por lo que si necesita conservar los certificados BouncyCastle, debe usar el complemento jar-in-jar u obtener un certificado JCE.
fuente
Me enfrenté al mismo problema, después de hacer referencia en alguna parte, funcionó de la siguiente manera:
fuente
maven-shade-plugin
etiqueta.Suponiendo que construya su archivo jar con ant, puede indicar a ant que omita el directorio META-INF. Esta es una versión simplificada de mi objetivo ant:
fuente
Recientemente comencé a usar IntelliJ en mis proyectos. Sin embargo, algunos de mis colegas todavía usan Eclipse en los mismos proyectos. Hoy, tengo el mismo error después de ejecutar el archivo jar creado por mi IntelliJ. Si bien todas las soluciones aquí hablan de casi lo mismo, ninguna de ellas funcionó para mí fácilmente (posiblemente porque no uso ANT, la construcción de Maven me dio otros errores que me remitieron a http://cwiki.apache.org/ confluence / display / MAVEN / MojoExecutionException , ¡y tampoco pude entender cuáles son los frascos firmados por mí mismo!)
Finalmente esto me ayudó
¿Adivina qué se ha eliminado de mi archivo jar?
Parece que el problema era relevante para algunos archivos relevantes para eclipse.
fuente
Tuve el mismo problema
gradle
al crear un Jar gordo, actualizar elbuild.gradle
archivo con una línea de exclusión corrigió el problema.fuente
En caso de que estés usando gradle, aquí hay una tarea completa de farJar:
fuente
Compare la carpeta META-INF en el nuevo jar con el viejo jar (antes de agregar nuevas bibliotecas). Es posible que haya nuevos archivos. En caso afirmativo, puede eliminarlos. Debería ayudar. Saludos, 999michal
fuente
Una estrategia consistiría en usar ANT para simplificar la eliminación de la firma de cada archivo Jar. Continuaría con los siguientes pasos:
Aquí hay una macrodef ANT haciendo el trabajo:
``
La definición se puede llamar de esta manera en una tarea ANT:
fuente
Lo que me ayudó (IntelliJ IDEA 2016.3): Archivo -> Estructura del proyecto -> Artefactos -> Agregar JAR -> Seleccionar clase principal -> Elija "copiar al directorio de salida y vincular mediante manifiesto" -> Aceptar -> Aplicar -> Construir - > Construir artefactos ... -> Construir
fuente
Es posible que dos firmantes diferentes arruinen la mente de Java.
Intente eliminar la carpeta META-INF del jar, agregando manifiesto y firmando JAR nuevamente, me ayudó: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- atributos /
fuente
Si está buscando una solución Fat JAR sin desempaquetar o alterar las bibliotecas originales pero con un cargador de clases JAR especial, eche un vistazo a mi proyecto aquí .
Descargo de responsabilidad: no escribí el código, simplemente lo empaqueté y lo publiqué en Maven Central y describí en mi archivo léame cómo usarlo.
Personalmente lo uso para crear JAR uber ejecutables que contienen dependencias BouncyCastle. Quizás también te sea útil.
fuente
Para aquellos que tienen problemas con la solución aceptada, hay otra forma de excluir recursos del frasco sombreado con DontIncludeResourceTransformer:
https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer
Desde Shade 3.0, este transformador acepta una lista de recursos. Antes de eso, solo necesita usar transformadores múltiples, cada uno con un recurso.
fuente
Esto me sucedió en Intellij cuando hice clic en "Agregar como proyecto Maven" en la línea de fondo cuando Intellij dijo "se encontraron archivos pom no administrados". Mientras tanto, ya se generó la carpeta. Por lo tanto, no recibió cambios recientes.
Eliminar la carpeta y ejecutar el programa me resolvió el problema. nuestra carpeta fue recreada.
Vea también la respuesta de Little Fox. El error que recibí fue muy similar al suyo.
fuente
Tuve un problema similar. La razón fue que estaba compilando usando un JDK con un JRE diferente al predeterminado en mi cuadro de Windows.
Usar el java.exe correcto resolvió mi problema.
fuente
Si obtiene esto cuando intenta enlazar archivos JAR para un proyecto de enlaces Xamarin.Android de esta manera:
Simplemente abra los archivos JAR usando Winzip y elimine los directorios meta-inf. Reconstruir - trabajo hecho
fuente