Mon programme java est empaqueté dans un fichier jar et utilise une bibliothèque jar externe, château gonflable . Mon code se compile bien, mais l'exécution du bocal conduit à l'erreur suivante:
Exception dans le thread "principal" java.lang.SecurityException: résumé de fichier de signature non valide pour les attributs principaux du manifeste
J'ai googlé pendant plus d'une heure à la recherche d'une explication et trouvé très peu de valeur. Si quelqu'un a déjà vu cette erreur et pourrait offrir de l'aide, je serais obligé.
Réponses:
La solution répertoriée ici peut fournir un pointeur.
Conclusion:
la source
Pour ceux qui ont obtenu cette erreur en essayant de créer un uber-jar avec
maven-shade-plugin
, la solution consiste à exclure les fichiers de signature manifeste en ajoutant les lignes suivantes à la configuration du plugin:la source
Pour ceux qui utilisent gradle et essaient de créer et d'utiliser un gros pot, la syntaxe suivante pourrait aider.
la source
exclude
à mafatJar
tâche, qui avait cetteconfigurations.compile.collect
commande. Voir stackoverflow.com/a/31426413/103412Error: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
Certaines de vos dépendances sont probablement des fichiers jar signés. Lorsque vous les combinez tous en un seul grand fichier jar, les fichiers de signature correspondants sont toujours présents et ne correspondent plus au fichier jar "grand combiné", de sorte que l'exécution s'arrête en pensant que le fichier jar a été falsifié (ce qu'il ... a donc pour parler).
Vous pouvez résoudre le problème en éliminant les fichiers de signature de vos dépendances jarfile. Malheureusement, il n'est pas possible de le faire en une seule étape .
Cependant, j'ai pu faire fonctionner cela avec Ant en deux étapes, sans nommer spécifiquement chaque dépendance de fichier jar, en utilisant:
L'élément sleep est censé empêcher les erreurs sur les fichiers avec des dates de modification à l'avenir .
D'autres variantes que j'ai trouvées dans les fils liés ne fonctionnaient pas pour moi.
la source
Veuillez utiliser la commande suivante
la source
J'ai rencontré ce problème lors de l'utilisation d'IntelliJ IDEA 14.01.
J'ai pu le réparer en:
Fichier-> Structure du projet-> Ajouter un nouveau (artefacts) -> jar-> À partir des modules avec des dépendances dans la fenêtre Créer un pot à partir du module:
Sélectionnez votre classe principale
Fichier JAR des bibliothèques Sélectionnez la copie dans le répertoire de sortie et liez via le manifeste
la source
La sécurité est déjà un sujet difficile, mais je suis déçu de voir que la solution la plus populaire consiste à supprimer les signatures de sécurité. JCE requiert ces signatures . L'ombre Maven explose le fichier de pot BouncyCastle qui place les signatures dans META-INF, mais les signatures BouncyCastle ne sont pas valides pour un nouveau pot uber (uniquement pour le pot BC), et c'est ce qui provoque l'erreur de signature non valide dans ce fil .
Oui, l'exclusion ou la suppression des signatures comme suggéré par @ruhsuzbaykus fait en effet disparaître l'erreur d'origine, mais elle peut également conduire à de nouvelles erreurs cryptiques:
En spécifiant explicitement où trouver l'algorithme comme ceci:
J'ai pu obtenir une erreur différente:
JCE ne peut pas authentifier le fournisseur car nous avons supprimé les signatures cryptographiques en suivant la suggestion ailleurs dans ce même fil .
La solution que j'ai trouvée était le plugin packer exécutable qui utilise une approche jar-in-jar pour préserver la signature BouncyCastle dans un seul pot exécutable.
MISE À JOUR :
Une autre façon de le faire (la bonne façon?) Est d'utiliser le signataire Maven Jar . Cela vous permet de continuer à utiliser l'ombre Maven sans obtenir d'erreurs de sécurité. CEPENDANT, vous devez avoir un certificat de signature de code (Oracle suggère de rechercher "Certificat de signature de code Java"). La configuration POM ressemble à ceci:
Non, il n'y a aucun moyen pour que JCE reconnaisse un certificat auto-signé, donc si vous devez conserver les certificats BouncyCastle, vous devez soit utiliser le plugin jar-in-jar, soit obtenir un certificat JCE.
la source
J'ai fait face au même problème, après référence quelque part, cela a fonctionné comme ci-dessous en changeant:
la source
maven-shade-plugin
balise.En supposant que vous construisez votre fichier jar avec ant, vous pouvez simplement demander à ant de laisser de côté le répertoire META-INF. Ceci est une version simplifiée de ma cible de fourmi:
la source
J'ai récemment commencé à utiliser IntelliJ sur mes projets. Cependant, certains de mes collègues utilisent toujours Eclipse sur les mêmes projets. Aujourd'hui, j'ai la même erreur après avoir exécuté le fichier jar créé par mon IntelliJ. Alors que toutes les solutions ici parlent de presque la même chose, aucune d'entre elles n'a fonctionné facilement pour moi (peut-être parce que je n'utilise pas ANT, maven build m'a donné d'autres erreurs qui m'ont renvoyé à http://cwiki.apache.org/ confluence / affichage / MAVEN / MojoExecutionException , et je n'ai pas pu comprendre par moi-même quels sont les pots signés!)
Enfin, cela m'a aidé
Devinez ce qui a été supprimé de mon fichier jar?!
Il semble que le problème concernait certains fichiers liés à l'éclipse.
la source
J'ai eu le même problème
gradle
lors de la création d'un gros bocal, la mise à jour dubuild.gradle
fichier avec une ligne d'exclusion a corrigé le problème.la source
Dans le cas où vous utilisez gradle, voici une tâche farJar complète:
la source
Comparez le dossier META-INF dans le nouveau pot avec l'ancien pot (avant d'ajouter de nouvelles bibliothèques). Il est possible qu'il y ait de nouveaux fichiers. Si oui, vous pouvez les supprimer. Ça devrait aider. Cordialement, 999michal
la source
Une stratégie consisterait à utiliser ANT pour simplifier la suppression de la signature de chaque fichier Jar. Il procéderait avec les étapes suivantes:
Voici un macrodef ANT qui fait le travail:
"
La définition peut ensuite être appelée de cette façon dans une tâche ANT:
la source
Ce qui m'a aidé (IntelliJ IDEA 2016.3): Fichier -> Structure du projet -> Artefacts -> Ajouter JAR -> Sélectionner la classe principale -> Choisissez "copier dans le répertoire de sortie et lier via le manifeste" -> OK -> Appliquer -> Construire - > Construire des artefacts ... -> Construire
la source
Il est possible que deux signataires différents gâchent l'esprit Java.
Essayez de supprimer le dossier META-INF du pot, en ajoutant à nouveau le manifeste et en signant le JAR, cela m'a aidé: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- les attributs/
la source
Si vous recherchez une solution Fat JAR sans déballer ni altérer les bibliothèques originales mais avec un chargeur de classe JAR spécial, jetez un œil à mon projet ici .
Avertissement: je n'ai pas écrit le code, il suffit de l'empaqueter et de le publier sur Maven Central et de décrire dans mon fichier Lisez-moi comment l'utiliser.
Je l'utilise personnellement pour créer des fichiers JAR uber exécutables contenant des dépendances BouncyCastle. Peut-être que cela vous est également utile.
la source
Pour ceux qui ont des problèmes avec la solution acceptée, il existe une autre façon d'exclure des ressources du pot ombré avec DontIncludeResourceTransformer:
https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer
Depuis Shade 3.0, ce transformateur accepte une liste de ressources. Avant cela, il vous suffit d'utiliser plusieurs transformateurs chacun avec une seule ressource.
la source
Cela m'est arrivé dans Intellij lorsque j'ai cliqué sur "Ajouter en tant que projet Maven" sur la dernière ligne quand Intellij a dit "fichiers pom non gérés trouvés". Pendant ce temps, le dossier out a déjà été généré. Il n'a donc pas été modifié récemment.
La suppression du dossier et l'exécution du programme ont résolu le problème pour moi. le dossier a ensuite été recréé.
Voir aussi la réponse de Little Fox. L'erreur que j'ai reçue était très similaire à la sienne.
la source
J'avais un problème similaire. La raison en était que je compilais en utilisant un JDK avec un JRE différent de celui par défaut dans ma boîte Windows.
L'utilisation du java.exe correct a résolu mon problème.
la source
Si vous obtenez cela lorsque vous essayez de lier des fichiers JAR pour un projet de liaisons Xamarin.Android comme ceci:
Ouvrez simplement les fichiers JAR à l'aide de Winzip et supprimez les répertoires meta-inf. Reconstruire - travail effectué
la source