Je reçois no main manifest attribute
lors de l'exécution du jar crée par Intellij. J'ai extrait le pot et constaté qu'il y avait un autre fichier manifeste, pas celui que j'avais spécifié lors de la création d'un artefact.
Lorsque j'ouvre un manifeste dans IDE, tout s'affiche correctement, mais après la création de jar, je reçois un nouveau fichier manifeste.
Manifest-Version: 1.0
Main-Class: YoutubeList
J'ai essayé chaque solution à partir d'autres réponses et je n'ai toujours pas bien compris. Pourquoi créer un simple bocal est une tâche ardue dans Intellij, il était supposé aider les développeurs!
Édité
Et parfois, il n’inclut pas les fichiers .class dans Jar, ce qui entraîne could not found or load class
Le même problème se posait avec maven build . Lorsque vous créez l'artefact à partir des paramètres de la structure du projet (ctrl + alt + shift + S), vous devez modifier le répertoire manifest
<project folder>\src\main\Java
changer Java en ressources
<project folder>\src\main\resources
J'ai également utilisé l'option d'extrait du fichier JAR cible, et cela fonctionne bien.
MODIFIER
Vous pouvez trouver une étape par étape détaillée, une autre solution ici: https://stackoverflow.com/a/45303637/2640826
Assurez-vous que votre pom.xml a la classe principale référencée et pleinement qualifiée, semblable à:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<mainClass>org.mypkg.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
(... bien sûr le numéro de version du plugin peut être différent).
La classe principale n'étant pas pleinement qualifiée, c'est ce qui incite les gens à suggérer de déplacer le manifeste vers un autre lieu (afin de satisfaire la référence localement).
J'ai passé quelques jours à le résoudre. Ma solution: j'ai chargé un projet qui présente dans cette réponse . Ensuite, j'ai comparé et corrigé les paramètres du projet chargé et de mon propre projet. J'ai comparé/corrigé:
Finalement, j'ai placé META-INF dans le répertoire des ressources.
Peut-être que j'ai fait des actions en excès, mais cela a fonctionné pour moi :)
P.S. Vous devez également choisir "Hériter le chemin de sortie de la compilation du projet" dans les paramètres de la structure du progiciel -> Modules -> Chemin.
Mettre le dossier META-INF dans */resources
peut se faire, mais ce n’est pas comme cela: Intellij met tout simplement sous main/resources
ou test/resources
à la racine du fichier jar généré. mais dans un projet Java, nous les plaçons généralement sous la racine du projet, qui a le même niveau que src
. Les placer sous "ressources" enfreint la convention. En outre, ce ne sont pas des fichiers de ressources.
Assurez-vous:
MANIFEST.MF
existant à la racine du projet;Include in Project build
sous "Structure du projet" -> panneau "Artefacts"META-INF
est répertorié dans les fichiers à inclure dans le fichier jar, à l'exception de "sortie compilée du projet", dans l'onglet Output Layout
Et ensuite, enregistrez les paramètres, build à nouveau, et entrez le menu "Construire" pour "Construire des artefacts ..", et "construire" le fichier JAR. Vérifiez à nouveau le fichier jar généré et exécutez-le avec Java -jar
.
Sous File
/Project structure
/Artifacts
, vous pouvez spécifier comment votre fichier jar doit être construit. Vous pouvez choisir d'utiliser un fichier existant comme manifeste ou d'en créer un nouveau. Dans ce cas, vous indiquez la classe principale et le chemin de la classe ...
J'ai trouvé une solution différente de celles affichées. Dans la boîte de dialogue de structure de projet IntelliJ utilisée pour créer le contenu du fichier .jar, je devais ajouter manuellement le dossier META-INF contenant le fichier Manifest. Voici comment cela se présente à la fin de la boîte de dialogue de la structure du projet. Si le dossier ne figure pas dans la liste du contenu du fichier jar, le fichier manifeste ne fait pas partie du fichier jar.
Pour inclure le dossier manuellement, je clique sur le signe plus, sélectionnez l'option Contenu du répertoire, puis naviguez jusqu'au dossier META-INF.
En fait, je l'ai résolu en ajoutant les lignes suivantes dans build.gradle
jar {
manifest {
attributes 'Main-Class': 'class name'
}
from {
configurations.compile.collect {
it.isDirectory()? it: zipTree(it)
}
}
}