1324 votes

Impossible d'exécuter le fichier jar : "aucun attribut de manifeste principal"

J'ai installé une application et quand j'essaie de l'exécuter (c'est un fichier jar exécutable), rien ne se passe. Quand je l'exécute à partir de la ligne de commande avec :

java -jar "app.jar"

Je reçois le message suivant :

aucun attribut principal de manifeste, dans "app.jar"

Normalement, si j'avais créé le programme moi-même, j'aurais ajouté un attribut de classe principale au fichier manifeste. Mais dans ce cas, puisque le fichier provient d'une application, je ne peux pas le faire. J'ai également essayé d'extraire le jar pour voir si je pouvais trouver la classe principale, mais il y a trop de classes et aucune d'entre elles n'a le mot "main" dans son nom. Il doit y avoir un moyen de résoudre ce problème car le programme fonctionne parfaitement sur d'autres systèmes.

0 votes

Cherchez les méthodes principales ; vous ne pouvez pas vous fier sur les noms de classe.

3 votes

Je sais, mais comme je n'ai que des fichiers .class, je ne peux pas vraiment voir les méthodes. Ou puis-je ?

0 votes

Vous ne tapez pas vraiment les guillemets, n'est-ce pas? En tout cas, il existe plusieurs façons de voir les méthodes, y compris en utilisant javap. Vous voudrez peut-être décompresser le fichier .jar et voir s'il n'y a en fait aucun manifeste.

1305voto

Olivier Refalo Points 12606

Tout d'abord, c'est un peu étrange de vous voir exécuter java -jar "app" et non pas java -jar app.jar

Deuxièmement, pour rendre un jar exécutable... vous devez archiver un fichier nommé META-INF/MANIFEST.MF

Le fichier lui-même devrait contenir (au moins) cette ligne :

Main-Class: com.mypackage.MyClass

com.mypackage.MyClass est la classe contenant le point d'entrée public static void main(String[] args).

Remarquez qu'il existe plusieurs façons de le faire, que ce soit avec la CLI, Maven, Ant ou Gradle :

Pour la CLI, la commande suivante fera l'affaire : (merci @dvvrt)

jar cmvf META-INF/MANIFEST.MF .jar  

Pour Maven, quelque chose comme l'extrait suivant devrait fonctionner. Remarquez que ceci est seulement la définition du plugin, pas le pom.xml complet :

Dernière documentation sur ce plugin : voir https://maven.apache.org/plugins/maven-jar-plugin/

      org.apache.maven.plugins
      maven-jar-plugin
      3.1.0

            true
            lib/
            com.mypackage.MyClass

(Choisissez une appropriée à votre projet.)

Pour Ant, l'extrait suivant devrait vous aider :

Crédit à Michael Niemand -

Pour Gradle :

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}

18 votes

Dans Ant, c'est à l'intérieur de l'élément

2 votes

Merci. Je voulais juste ajouter que vous pouvez copier les dépendances dans le dossier lib en utilisant ceci : stackoverflow.com/a/996915/1121497. Comme le classpath inclut ce dossier lib, vous n'avez qu'à exécuter le jar avec java -jar myproject.jar et il trouvera les dépendances.

5 votes

COMMENT CRÉER UN "jar à un fichier appelé META-INF/MANIFEST.MF" ? J'ai un .jar d'un côté et un .MF de l'autre, comment les lier ensemble ? J'ai mis le manifeste dans le même dossier que le .jar mais cela ne fonctionne pas, j'ai toujours le problème !

374voto

Jesper Points 65733

Cela aurait dû être java -jar app.jar au lieu de java -jar "app".

L'option -jar ne fonctionne que si le fichier JAR est un fichier JAR exécutable, ce qui signifie qu'il doit avoir un fichier de manifeste avec un attribut Main-Class en lui. Consultez Emballage des programmes dans des fichiers JAR pour apprendre comment créer un JAR exécutable.

S'il ne s'agit pas d'un JAR exécutable, alors vous devrez exécuter le programme avec quelque chose comme :

java -cp app.jar com.somepackage.SomeClass

com.somepackage.SomeClass est la classe qui contient la méthode main pour exécuter le programme. (Quelle que soit la classe, cela dépend du programme, il est impossible de le dire à partir des informations que vous avez fournies).

5 votes

Merci pour votre réponse, mais votre solution ne fonctionne que si je connais le nom de la classe qui contient la méthode principale. Et c'était une faute de frappe... C'était censé être "app.jar". Mais comment expliquez-vous que cela fonctionne sur d'autres systèmes en double-cliquant simplement sur le fichier?

0 votes

Si c'est effectivement un JAR exécutable, vous pouvez extraire le fichier manifest (il se trouve dans le répertoire META-INF à l'intérieur du fichier JAR). Il devrait contenir un attribut Main-Class qui vous donne le nom de la classe principale.

0 votes

Si cela ne fonctionne pas sur un système, alors ce système a peut-être une version de Java trop ancienne. Si le JAR est par exemple compilé avec Java 7, alors vous ne pouvez pas l'exécuter sur un système ayant Java 6 ou une version antérieure.

69voto

Sasanka Panguluri Points 1405

Cela est dû au fait que Java ne peut pas trouver l'attribut Main dans le fichier MANIFEST.MF. L'attribut Main est nécessaire pour indiquer à Java quelle classe il doit utiliser comme point d'entrée de l'application. À l'intérieur du fichier jar, le fichier MANIFEST.MF se trouve dans le dossier META-INF. Vous vous demandez comment vous pourriez voir ce qu'il y a à l'intérieur d'un fichier jar ? Ouvrez le fichier jar avec WinRAR.

L'attribut main à l'intérieur du MANIFEST.MF ressemble à ceci :

Main-Class: .

Vous obtenez cette erreur "aucun attribut principal de manifestation" lorsque cette ligne est manquante du fichier MANIFEST.MF.

C'est vraiment un gros bazar de spécifier cet attribut à l'intérieur du fichier MANIFEST.MF.

Mise à jour


Je viens de trouver une manière vraiment astucieuse de spécifier le point d'entrée de l'application dans Eclipse :

  1. Sélectionnez Fichier > Exporter..
  2. Sélectionnez Fichier JAR puis Suivant
  3. Donnez-lui un nom dans la fenêtre suivante puis Suivant
  4. Sélectionnez Suivant à nouveau
  5. Vous verrez "Sélectionnez la classe du point d'entrée de l'application", choisissez simplement une classe et Eclipse construira automatiquement un MANIFEST.MF cool pour vous.

entrer la description de l'image ici

33voto

Dave Points 226

Pour Maven, voici ce qui a résolu le problème (pour moi, pour une base de code Veetle sur GitHub) :

      org.apache.maven.plugins
      maven-shade-plugin
      2.0

          package

            shade

                org.lazydevs.veetle.api.VeetleAPI

0 votes

J'ai trouvé que cela fonctionnait, mais j'ai dû exécuter comme mvn package shade:shade juste en exécutant mvn package n'a pas déclenché l'exécution du plugin shade.

0 votes

Cette solution a été mentionnée dans un commentaire ci-dessus. Veuillez consulter maven.apache.org/plugins/maven-shade-plugin/examples/…

0 votes

Je reçois une erreur Erreur : Une erreur JNI s'est produite, veuillez vérifier votre installation et réessayez. Exception dans le thread "main" java.lang.SecurityEception: Signature de fichier non valide pour les attributs principaux du Manifeste.. Je cherche une solution.

31voto

Burhan ARAS Points 664

Essayez cette commande pour inclure le jar:

java -cp NomDeVotreJar.jar votre.package..votre.MainClass

1 votes

Une manière est d'inclure la classe principale dans le fichier pom.xml et d'utiliser la commande java -jar, l'autre est d'utiliser la commande java -cp.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X