web-dev-qa-db-fra.com

Création d'un pot avec Intellij 2016 - Aucun attribut de manifeste principal

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

12
mallaudin

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

37
Zsolt Tolvaly

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).

3
Jool

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é:

  • Configurations Exécuter/Déboguer
  • MANIFEST.MF
  • dans les paramètres de la structure du projet: Projet, Modules (marquez ce qui est sources, ressources, etc.), Artefacts.

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.

 enter image description here

3
Maksim Ryabovol

Mettre le dossier META-INF dans */resourcespeut 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:

  • utilisez le fichier MANIFEST.MF existant à la racine du projet;
  • la classe principale est correcte
  • coché le Include in Project build sous "Structure du projet" -> panneau "Artefacts"
  • le dossier 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
  • le type de fichier généré est JAR, dans le coin supérieur droit

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

 enter image description here

1
WesternGun

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 ...

1
Per Huss

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.

 This is part of the Project Structure Dialog box

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. 

0
J.E.Tkaczyk

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)
        }
    }
}
0
mallaudin