J'ai installé une application, quand j'essaye de l'exécuter (c'est un pot exécutable), rien ne se passe. Lorsque je l'exécute à partir de la ligne de commande avec:
java -jar "app.jar"
J'obtiens le message suivant:
aucun attribut manifeste principal, 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 pot pour voir si je pouvais trouver la classe principale, mais il y en a de nombreuses 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 correctement sur d'autres systèmes.
javap
. Vous voudrez peut-être le décompresser et regarder pour voir s'il n'y a pas de manifeste.Réponses:
Tout d'abord, c'est un peu bizarre de te voir courir
java -jar "app"
et nonjava -jar app.jar
Deuxièmement, pour rendre un exécutable jar ... vous devez créer un fichier appelé META-INF / MANIFEST.MF
le fichier lui-même doit avoir (au moins) cette doublure:
Où se
com.mypackage.MyClass
trouve la classe contenant le point d'entrée principal public void statique ( arguments String []) .Notez qu'il existe plusieurs façons de faire cela avec la CLI, Maven, Ant ou Gradle:
Pour CLI , la commande suivante fera l'affaire: (tks @ dvvrt )
jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
Pour Maven , quelque chose comme l'extrait suivant devrait faire l'affaire. Notez que ce n'est que la définition du plugin, pas le pom.xml complet :
(Choisissez un élément
<version>
approprié à votre projet.)Pour Ant , l'extrait ci-dessous devrait vous aider:
Crédits Michael Niemand -
Pour Gradle :
la source
lib
dossier, il vous suffit d'exécuter le pot avecjava -jar myproject.jar
et il trouvera les dépendances.jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
maven-jar-plugin
élément dans le fichier Maven généré par VSC, je viens donc d'y ajouter la<configuration>
section.Cela aurait dû être
java -jar app.jar
au lieu dejava -jar "app"
.L'
-jar
option ne fonctionne que si le fichier JAR est un fichier JAR exécutable, ce qui signifie qu'il doit contenir un fichier manifeste avec unMain-Class
attribut. Voir Empaquetage de programmes dans des fichiers JAR pour savoir comment créer un JAR exécutable.Si ce n'est pas un JAR exécutable, vous devrez alors exécuter le programme avec quelque chose comme:
où
com.somepackage.SomeClass
est la classe qui contient lamain
méthode pour exécuter le programme. (Ce qu'est cette classe dépend du programme, il est impossible de le dire à partir des informations que vous avez fournies).la source
META-INF
répertoire à l'intérieur du fichier JAR). Il doit contenir unMain-Class
attribut qui vous donne le nom de la classe principale.Vous pouvez également utiliser maven-assembly-plugin, comme indiqué dans l'exemple ci-dessous:
Dans cet exemple, tous les pots de dépendance spécifiés dans la section seront automatiquement inclus dans votre pot unique. Notez que jar-with-dependencies doit être mis littéralement en tant que, pour ne pas être remplacé par les noms de fichier jar que vous souhaitez inclure.
la source
maven-assembly-plugin
fonctionné.maven-jar-plugin
non.pom.xml
fichier à l'intérieur<build><plugins> PUT IT HERE </plugins></build>
, puis exécutez le package maven (dans le menu coulissant ouvert IDEA maven à droite, recherchez projet> Cycle de vie> package). Ensuite, votre fichier jar sera dans le dossier Target. À votre santé!En effet, 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 regarder ce qu'il y a dans un fichier jar? Ouvrez le fichier jar avec WinRAR.
L'attribut principal à l'intérieur du MANIFEST.MF ressemble à ceci:
Vous obtenez cette erreur «aucun attribut manifeste principal» lorsque cette ligne est manquante dans le fichier MANIFEST.MF.
C'est vraiment un énorme gâchis de spécifier cet attribut dans le fichier MANIFEST.MF.Mise à jour: je viens de trouver un moyen vraiment sympa de spécifier le point d'entrée de l'application dans eclipse. Quand vous dites Exporter,
la source
J'ai eu le même problème. en ajoutant les lignes suivantes au fichier pom l'a fait fonctionner. Le plugin assurera le processus de construction de votre application avec toutes les étapes nécessaires.
la source
<parent>...</parent>
application dans le pom.xml. Je suppose que si nous visitons leparent
pom.xml de l' application, nous aurons une idée claire.repackage-classifier
. Veuillez visiter docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…La réponse Gradle consiste à ajouter un paramètre jar / manifest / attributes comme ceci:
la source
J'ai eu ce problème lors de la création d'un bocal à l'aide d'IntelliJ IDEA. Voir cette discussion .
Ce qui m'a résolu était de recréer l'artefact JAR, en choisissant JAR> From modules with dependencies, mais sans accepter le répertoire par défaut pour META-INF / MANIFEST.MF. Changez-le de - / src / main / java en - / src / main / resources.
Sinon, il incluait un fichier manifeste dans le bocal, mais pas celui dans - / src / main / java qu'il devrait avoir.
la source
Pour maven, c'est ce qui l'a résolu (pour moi, pour une base de code Veetle sur GitHub):
À votre santé...
la source
mvn package shade:shade
simple fait de courirmvn package
ne déclenchait pas le plugin d'ombre.Essayez cette commande pour inclure le pot:
la source
Pour moi, aucune des réponses n'a vraiment aidé - j'avais le fichier manifeste au bon endroit, contenant la classe principale et tout. Ce qui m'a fait trébucher, c'est ceci:
( source ). L'ajout d'une nouvelle ligne à la fin du manifeste l'a corrigé.
la source
Si vous utilisez Maven, incluez ce qui suit dans le pom
la source
no main manifest attribute
erreur, mais je travaille sur l'application Spring Boot, donc cette réponse m'a aidé. Je savais déjà comment créer unMETA-INF/MANIFEST.MF
fichier, mais pas comment faire Spring-Boot le gère automatiquement.spring-boot
ignorez-le. Stackoverflow aide également à créer votre propre référentiel de problèmes auquel vous êtes confronté lors de la programmation.J'ai eu le même problème aujourd'hui. Mon problème a été résolu en déplaçant META-INF vers le dossier des ressources.
la source
J'ai eu la même erreur tout à l'heure. Si vous utilisez
gradle
, ajoutez simplement le suivant dans votre urgradle.build
:Où
com.company.project.MainClass
chemin vers votre classe avecpublic static void main(String[] args)
méthode.la source
mainClassName
ensemble de variables de niveau supérieur , mais cela n'aide que lagradle run
commande, pas la création d'un exécutable .jarLe problème MAVEN est qu'il essaie d'inclure le premier fichier MANIFEST.MF de la première bibliothèque des dépendances au lieu de NOTRE PROPRE MANIFEST.MF LORSQUE VOUS UTILISEZ DES ARTEFACTS! .
Copiez le vrai MANIFEST.MF qui a déjà été généré dans votre projet par MAVEN.
Manifest-Version: 1.0 Main-Class: yourpacket.yourmainclass (pour exmaple info.data.MainClass)
Remplacez le contenu de MANIFEST.MF de youjar.zip par celui-ci.
OU!
Créez simplement votre propre MANIFEST.MF et:
Mais si vous utilisez le panneau maven (ou la ligne de commande maven), vous pouvez le forcer à générer votre propre manifeste et à l'inclure dans le fichier JAR.
Ajoutez à la section de construction de you pom.xml ce code:
Ouvrez le panneau MAVEN (dans Intellij) et exécutez "Installer". Il va générer le fichier MANIFEST et compiler la propriété du fichier JAR avec toutes les dépendances dans le dossier "Target". Il sera également installé dans le référentiel maven local.
la source
Si le bocal ne suit pas les règles , ce n'est pas un bocal exécutable.
la source
J'ai rencontré le même problème et il est résolu maintenant :) Suivez simplement les étapes ci-dessous et l'erreur pourrait être pour n'importe quoi, mais les étapes ci-dessous rendent le processus plus fluide. Je passe beaucoup de temps à trouver la solution.
1.Essayez de redémarrer Eclipse (si vous utilisez Eclipse pour créer un fichier JAR) -> En fait, cela a aidé mon problème à exporter correctement le fichier JAR.
Après le redémarrage de l'éclipse, essayez de voir si votre éclipse est capable de reconnaître la classe / méthode principale par votre projet Java -> clic droit -> Exécuter en tant que -> Exécuter les configurations -> Principal -> cliquer sur le bouton Rechercher pour voir si votre éclipse est capable de rechercher votre classe principale dans le fichier JAR. -> C'est pour la validation que le fichier JAR aura le point d'entrée vers la classe principale.
Après cela, exportez votre projet Java Dynamic en tant que fichier "JAR exécutable" et non fichier JAR.
Dans la configuration de lancement Java, choisissez votre classe principale.
Une fois le fichier jar exporté, utilisez la commande ci-dessous pour exécuter. java -cp [Votre JAR] .jar [package complet] .MainClass par exemple: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit
Vous pourriez rencontrer l'erreur de version Java non prise en charge. le correctif consiste à changer le java_home dans votre profil bash shell pour correspondre à la version java utilisée pour compiler le projet dans eclipse.
J'espère que cela t'aides! Veuillez me faire savoir si vous avez encore des problèmes.
la source
J'ai eu le même problème. Un grand nombre des solutions mentionnées ici ne m'ont pas donné une vue d'ensemble, donc je vais essayer de vous donner un résumé de la façon de compresser les fichiers jar à partir de la ligne de commande .
Si vous souhaitez avoir vos
.class
fichiers dans des packages, ajoutez le package au début de la.java
.Test.java
Pour compiler votre code avec vos
.class
fichiers se terminant par la structure donnée par le nom du package, utilisez:Le
-d .
fait que le compilateur crée la structure de répertoires souhaitée.Lors de l'empaquetage du
.jar
fichier, vous devez indiquer à la routine jar comment l'emballer. Ici, nous utilisons l'ensemble d'optionscvfeP
. Il s'agit de conserver la structure du package (optionP
), de spécifier le point d'entrée afin que le fichier manifeste contienne des informations significatives (optione
). L'optionf
vous permet de spécifier le nom du fichier, l'optionc
crée une archive et l'optionv
définit la sortie sur verbeuse. Les choses importantes à noter ici sontP
ete
.Vient ensuite le nom du pot que nous voulons
test.jar
.Vient ensuite le point d'entrée.
Et puis vient
-C . <packagename>/
récupérer les fichiers de classe de ce dossier, en préservant la structure du dossier.Vérifier votre
.jar
fichier dans un programme zip. Il devrait avoir la structure suivantetest.jar
Le MANIFEST.MF doit contenir les éléments suivants
Si vous modifiez votre manifeste à la main, assurez-vous de conserver la nouvelle ligne à la fin, sinon java ne la reconnaît pas.
Exécutez votre
.jar
fichier avecla source
Personnellement, je pense que toutes les réponses ici comprennent mal la question. La réponse à cela réside dans la différence de la façon dont Spring-Boot construit le .jar. Tout le monde sait que Spring Boot met en place un manifeste comme celui-ci, qui varie de l' hypothèse de tout le monde qu'il s'agit d'un lancement standard .jar, qu'il peut ou non être:
Peut-être qu'il doit être exécuté avec
org.springframework.boot.loader.JarLauncher
sur le chemin de classe?la source
Tout fichier jar exécutable doit s'exécuter en cliquant ou en exécutant à l'aide de l'invite de commande comme java -jar app.jar (utilisez "si le chemin du jar contient de l'espace" - c'est-à-dire java -jar "C: \ nom du dossier \ app.jar"). Si votre fichier exécutable n'est pas en cours d'exécution, cela signifie qu'il n'est pas créé correctement.
Pour une meilleure compréhension, extrayez le fichier jar (ou affichez-le à l'aide de n'importe quel outil, pour Windows 7-Zip, c'est bien) et vérifiez le fichier sous /META-INF/MANIFEST.MF. Si vous trouvez une entrée comme
Main-Class: your.package.name.ClaaswithMain - alors ça va, sinon vous devez le fournir.
Soyez conscient de l'ajout d'une entrée de classe principale sur le fichier MANIFEST.MF, vérifiez où vous l'enregistrez!
la source
Vous pouvez simplement suivre cette étape Créer un fichier jar en utilisant
Lors de l'exécution du fichier jar, exécutez simplement comme ceci
la source
Vous n'avez peut-être pas créé le fichier jar correctement:
Les oeuvres suivantes:
la source
Si vous utilisez la ligne de commande pour assembler .jar, il est possible de pointer vers le fichier principal sans ajouter de fichier manifeste. Exemple:
(le paramètre "e" fait cela: TheNameOfClassWithMainMethod est un nom de la classe avec la méthode main () et app.jar - nom de l'exécutable .jar et * .class - juste tous les fichiers de classes à assembler)
la source
Pour moi, cette erreur s'est produite simplement parce que j'ai oublié de dire à Eclipse que je voulais un fichier jar exécutable et non un simple fichier jar de bibliothèque. Donc, lorsque vous créez le fichier jar dans Eclipse, assurez-vous de cliquer sur le bouton radio droit
la source
Les réponses ci-dessus ne m'ont été que partiellement utiles.
java -cp
faisait partie de la réponse, mais j'avais besoin d'informations plus précises sur la façon d'identifier la classe à exécuter. Voici ce qui a fonctionné pour moi:Étape 1: trouver la classe dont j'ai besoin pour exécuter
Les premières lignes du résultat sont les suivantes:
App.class contenait la classe principale à exécuter. Je ne suis pas sûr à 100% si vous pouvez toujours supposer que le cours dont vous avez besoin est le premier, mais c'était pour moi. Si ce n'est pas le cas, j'imagine qu'il n'est pas trop difficile d'utiliser grep pour exclure les résultats liés à la bibliothèque pour réduire la liste des classes à une taille gérable.
À partir de là, c'était facile: j'utilise simplement ce chemin (moins le suffixe ".class"):
la source
java -cp ... somepackage.App
.Puisque vous avez ajouté MANIFEST.MF, je pense que vous devriez considérer l'ordre des champs dans ce fichier. Mon env est
java version "1.8.0_91"
et mon MANIFEST.MF comme ici
Cependant, comme indiqué ci-dessous,
la source
(premier message - donc il peut ne pas être propre)
Ceci est mon correctif pour OS X 11.6, programme Netbeans 8.2 basé sur Maven. Jusqu'à présent, mon application est 100% Netbeans - pas de peaufinage (juste quelques échappements shell pour l'impossible!).
Ayant essayé la plupart des réponses ici et ailleurs en vain, je suis retourné à l'art "d'utiliser ce qui fonctionne".
La meilleure réponse ici ( olivier-refalo ) semblait être le bon endroit pour commencer, mais n'a pas aidé.
En regardant d'autres projets qui ont fonctionné, j'ai remarqué quelques différences mineures dans les lignes de manifeste:
Je ne sais pas pourquoi (je ne suis que 3 mois en java) ou comment, mais je peux seulement dire que cela a fonctionné.
Voici juste le bloc manifeste modifié utilisé:
la source
J'ai trouvé une nouvelle solution à la mauvaise génération de manifestes!
Cliquez sur pour META-INF
Ajouter ou modifier
Ajouter:
Créez un fichier texte appelé MANIFEST.MF dans un dossier appelé META-INF et ajoutez la ligne suivante:
Enregistrez le fichier et ajoutez-le au zip
Éditer:
Ouvrez cmd et tapez: java -jar c: /path/JarName.jar
Cela devrait bien fonctionner maintenant!
la source
la plupart des solutions n'ont pas fonctionné pour moi mais mon instructeur m'a aidé je voudrais partager sa solution ici j'ai utilisé le terminal kali linux mais ça devrait aller dans tous les debian
dans le type de fichier
maintenant pour exécuter l'utilisation du fichier
ou vous pouvez aller aux propriétés du dossier et vérifier
cela m'a aidé alors que la plupart des réponses ci-dessus ne l'ont pas
la source
Vous pourriez avoir le même problème que moi. Après avoir créé votre fichier .jar, écrivez
jar xf app.jar META-INF/MANIFEST.MF
. Cela créera une copie du fichier dans votre répertoire actuel afin que vous puissiez le lire. Si cela ne dit que quelque chose comme:et ne contient pas la déclaration "Main-Class", alors je pense que vous avez trouvé votre problème.
Mais je ne sais pas comment le résoudre. J'ai vérifié d'autres personnes ayant des problèmes identiques / similaires sur StackOverflow et je n'ai pas trouvé de réponse. Cependant, avec ces informations, vous pouvez peut-être obtenir une meilleure aide (étant donné que vous avez le même problème que moi).
Edit: j'avais essayé avec un fichier manifeste mais je ne l'ai pas fait fonctionner, mais mon erreur était de ne nommer qu'une des classes lors de la création du fichier jar. J'ai plutôt écrit * .class et cela fonctionne maintenant.
Bien que je ne sache pas pourquoi il est nécessaire de créer un fichier manifeste. Mais je suppose que ça va tant que ça marche.
la source
J'ai eu ce problème et je l'ai résolu récemment en le faisant dans Netbeans 8 (reportez-vous à l'image ci-dessous):
la source