Pourquoi n'a-t-il pas réussi à charger l'attribut manifeste de la classe principale à partir d'un fichier JAR?

85

J'ai créé un fichier JAR de cette manière jar cf jar-file input-files. Maintenant, j'essaye de l'exécuter. L'exécution ne fonctionne pas (la commande jre est introuvable):

jre -cp app.jar MainClass

Cela ne fonctionne pas non plus:

java -jar main.jar

(Échec du chargement de l'attribut manifeste de la classe principale à partir de main.jar).

J'ai aussi découvert que

Pour exécuter une application packagée sous forme de fichier JAR (version 1.2 - nécessite l'en-tête de manifeste Main-Class)

Qu'est-ce que "l'en-tête du manifeste Main-Class"? Comment le créer et où le mettre?

romain
la source

Réponses:

62

Je ne suis pas sûr de croire à vos symptômes:

  • Si la jrecommande n'est pas trouvée, l'exécution jre -cp app.jardevrait donner la même erreur
  • Le simple fait d'ajouter un fichier JAR au classpath ne devrait pas donner l'erreur que vous voyez

Je m'attendrais à ce que vous voyiez cette erreur si vous exécutez:

java -jar app.jar

L'en-tête Main-Class doit être dans le manifeste du fichier JAR - il s'agit de métadonnées sur des éléments tels que les autres bibliothèques requises. Consultez la documentation de Sun pour savoir comment créer un manifeste approprié. Fondamentalement, vous devez créer un fichier texte qui comprend une ligne comme celle-ci:

Main-Class: MainClass

Puis cours

jar cfm app.jar manifest.txt *.class
Jon Skeet
la source
Merci. Ça marche. J'ai créé un fichier manifeste avec Main-Class: MainClass, puis j'ai créé le fichier .jar avec la commande que vous avez donnée. Après cela, j'ai pu exécuter mon programme java -jar main.jar.
Roman
1
Une autre option consiste à utiliser l'option -e, sans avoir besoin d'un fichier séparé. jar cfe app.jar MainClass *.classRemarque: -e a été ajouté dans JDK 6.
pferate
35
  1. définir le chemin de classe et compiler

    javac -classpath "C: \ Program Files \ Java \ jdk1.6.0_ updateVersion \ tools.jar" yourApp.java

  2. créer manifest.txt

    Main-Class: YourApp nouvelle ligne

  3. créez votreApp.jar

    jar cvf0m votreApp.jar manifest.txt votreApp.class

  4. lancez yourApp.jar

    java -jar yourApp.jar

bizarreFactory
la source
9

Vous pouvez courir avec:

java -cp .;app.jar package.MainClass

Cela fonctionne pour moi s'il n'y a pas de manifeste dans le fichier JAR.

Dainius
la source
J'ai: Option non reconnue: -cp. Pouvez-vous revoir votre réponse? Parce que je ne sais pas ce que cette commande essaie de faire. (java -cp.; package app.jar.MainClass). C'est une ou deux commandes?
kenorb
1
docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/… " -cp .; app.jar" doit ajouter votre fichier app.jar au chemin de classe, puis vous pouvez exécuter la méthode MainClass.main () ( MainClass est dans le package "package").
Dainius
1
Donc, probablement sous Linux, cette option (-cp) n'existe pas (la mienne est java v1.6.0_24, OpenJDK Runtime Environment (IcedTea6 1.11.3) (6b24-1.11.3-1ubuntu0.12.04.1)).
kenorb
java -version => Java HotSpot (TM) 64 bits Server VM (build 20.1-b02, mode mixte) "java -cp. test1.Main" fonctionne
Dainius
/ usr / lib / jvm / java-6-openjdk-amd64 / bin / java -version => VM serveur OpenJDK 64 bits (build 20.0-b12, mode mixte) "/ usr / lib / jvm / java-6-openjdk -amd64 / bin / java -cp. test1.Main "fonctionne
Dainius
6

J'ai eu cette erreur, et c'était parce que j'avais les arguments dans le mauvais ordre:

CORRECT

java maui.main.Examples tagging -jar maui-1.0.jar 

FAUX

java -jar maui-1.0.jar maui.main.Examples tagging 
Sridhar Sarnobat
la source
1
Ce n'est peut-être qu'un problème de BSD, je suis presque sûr que je l'ai fait récemment dans l'autre sens.
Sridhar Sarnobat
1

Le moyen le plus simple de vous assurer que vous avez créé correctement le fichier JAR exécutable, avec le fichier manifeste approprié, consiste à utiliser Eclipse pour le créer pour vous. Dans votre projet Eclipse, vous sélectionnez simplement Fichier / Exporter dans le menu et suivez les invites.

De cette façon, vous pouvez être sûr que votre fichier JAR est correct et vous saurez chercher ailleurs s'il y a toujours un problème. Le processus est décrit en détail dans la FAQ Comment créer un fichier JAR exécutable pour un programme SWT autonome? .

Greg Burdett
la source
Merci pour ExportEclipse IDE.
Ninh Pham
1

Essayer

java -cp .:mail-1.4.1.jar JavaxMailHTML 

pas besoin d'avoir un manifestfichier.

utilisateur4581964
la source
0

J'ai découvert que j'avais également cette erreur dans NetBeans. J'espère que ce qui suit est utile.

  1. Assurez-vous que lorsque vous accédez à Configuration du projet, vous définissez la classe principale que vous souhaitez exécuter.
  2. Faire une construction ou une construction propre
  3. Placez le fichier jar où vous le souhaitez et essayez à nouveau: java -jar "YourProject.jar" sur la ligne de commande.

C'était le problème que j'obtenais parce que j'avais d'autres programmes «de test» que j'utilisais dans NetBeans et je devais m'assurer que la classe principale sous la partie Exécuter de la configuration du projet était correctement définie.

beaucoup de bénédictions, John P

jean p
la source
0

J'obtenais la même erreur lorsque j'ai couru:
jar cvfm test.jar Test.class Manifest.txt

Voici ce qui a résolu le problème :
jar cvfm test.jar Manifest.txt Test.class

Mon manifeste a le point d'entrée indiqué dans la documentation oracle (assurez-vous qu'il y a un nouveau caractère de ligne à la fin du fichier):
Main-Class: Test

ÉvidentEnfant
la source
0

J'ai fait face au même problème. Cette commande unix ne parvient pas à trouver la classe principale. En effet, les versions JDK d'exécution et de compilation sont différentes. Faites passer le jar à Eclipse après avoir changé la version du compilateur Java. Le lien suivant m'a aidé.

http://crunchify.com/exception-in-thread-main-java-lang-unsupportedclassversionerror-comcrunchifymain-unsupported-major-minor-version-51-0/

Essayez d'exécuter le fichier jar créé après cette étape, puis exécutez-le

Harshita Sethi
la source
0

Si votre chemin de classe est entièrement spécifié dans le manifeste, vous avez peut-être besoin de la dernière version de l'environnement d'exécution Java. Mon problème a été résolu lorsque j'ai réinstallé le jre 8.

AmirHossein Rezaei
la source
0

Si vous utilisez eclipse, essayez ci-dessous: 1. Cliquez avec le bouton droit sur le projet -> sélectionnez Exporter 2. Sélectionnez Fichier Jar exécutable dans la sélection d'une destination d'exportation 3. Entrez le nom du fichier et sélectionnez "Package requis ..." (deuxième bouton radio) -> Terminer

J'espère que cela t'aides...!

Barani r
la source