Mauvais Manifest.mf dans IntelliJ IDEA créé .jar

102

J'essaie de conditionner un projet à l'aide des bibliothèques OptaPlanner 6.0.1 dans un .jar via l'artefact jar d'IntelliJ IDEA, mais au lieu de mon manifest.mf contenant le standard

Manifest-Version: 1.0
Main-Class: a.b.c.app

le fichier jar utilise celui fourni dans ecj-3.7.2.jar, l'une des bibliothèques de support d'OptaPlanner:

Manifest-Version: 1.0
Build-Jdk: 1.6.0_26
Built-By: ibrandt
Created-By: Apache Maven
Archiver-Version: Plexus Archiver

Pour cette raison, une "no main manifest attribute, in appname.jar"erreur se produit lors de la tentative d'exécution de l'application. Si je remplace manuellement le manifeste dans le fichier .jar par le mien, tout fonctionne correctement. Puis-je faire quelque chose pour résoudre ce problème?

Je garde les bibliothèques dans un répertoire / lib séparé et elles ont été ajoutées à la racine de l'artefact jar en tant que répertoire extrait, IntelliJ IDEA est v13.0.1.

grudolf
la source
1
Connaissez-vous des outils de construction comme fourmi, maven ou gradle?
MariuszS
Je les connais, mais jusqu'à présent, je n'ai utilisé que des homologues make et .NET (NAnt, MSBuild). Lequel d'entre eux devrais-je choisir si l'outil de construction d'IntelliJ ne le coupe pas?
grudolf
1
Votez pour corriger ce problème ici ,
bigjosh

Réponses:

260

J'ai eu le même problème.

Assurez-vous que votre MANIFEST.MF se trouve dans:

src/main/resources/META_INF/

NE PAS

src/main/java/META_INF/
Jamhan
la source
20
C'est la bonne réponse en effet, il semble qu'Intellij IDEA égaré le dossier META-INF lorsque le modèle de projet est Maven
Kumait
Dans mon cas, j'ai dû changer la mise en page de mon projet. J'avais auparavant un projet avec la mise en page maven mais j'ai supprimé le support de maven. Je recrée un projet à partir de zéro et maintenant cela fonctionne.
Maxence
1
Cela ne fonctionnait pas pour moi, j'ai dû déplacer le fichier Mainfest à la racine du projet.
courses du
Est-ce que maven est si stupide que ce fichier place dans un mauvais répertoire? : ^)
Daria
@Kumait, le problème est toujours là dans IntelliJ 2017.1.5. Je me demande si l'équipe JetBrain en est consciente.
fruqi
12

Pour réparer:

  1. Fichier> Structure du projet
  2. Sous Paramètres du projet sur la gauche, sélectionnez "Artefacts"
  3. Recherchez la définition JAR dans le volet central et sélectionnez-la
  4. Dans le volet gauche de l'onglet "Disposition de sortie", recherchez le fichier jar dans la liste et sélectionnez-le
  5. En bas, cliquez sur le bouton "Utiliser le manifeste existant" et sélectionnez le fichier manifeste qui se trouve dans la source de votre projet.
  6. Cliquez sur OK et exécutez la construction
Javaru
la source
3
Il n'y a pas de bouton «Utiliser le manifeste existant», mais le fichier manifeste dans la disposition de sortie pointe vers l'emplacement correct (... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf
5
OK, j'ai dû supprimer l'artefact jar et le recréer, cette fois en tant que "Vide" au lieu de "À partir de modules avec dépendances". Vous avez les boutons "Créer un manifeste" et "Utiliser le manifeste existant", pointez sur mon manifeste et les bibliothèques lues et compilez la sortie. Il y a deux différences par rapport à avant: un META_INF \ MANIFEST.INF est maintenant explicitement inclus dans la disposition de sortie et le fichier jar semble être généré correctement. :)
grudolf
Cela ne résout pas le problème, du moins pour moi. La réponse de jamahn fonctionna cependant.
Andrew Breksa
Commentaire ajouté par l'utilisateur à faible représentant @ ds-justice comme suit - Le commentaire de @ grudolf ci-dessus sur la création d'un Jar vide était la seule chose qui fonctionnait pour moi après plusieurs heures de lutte avec un projet Gradle importé. C'est une question importante, veuillez envisager de republier votre commentaire en tant que réponse distincte.
Shawn Mehan
10

Comme indiqué dans le commentaire de @ grudolf dans l'une des autres réponses, une façon de le faire (et la seule qui a fonctionné pour moi dans un projet Gradle importé) est de créer un pot vide comme suit:

  • Structure du projet -> Artefacts -> + Jar -> Vide
  • Le volet central comporte désormais les boutons Créer un manifeste et Utiliser un manifeste existant. Utilisez l'un de ceux-ci.
  • J'avais des difficultés si j'extrayais des bibliothèques dépendantes avec leurs propres manifestes dans la racine de sortie, elles semblaient écraser par intermittence le nouveau manifeste créé manuellement. Déconner avec l'ordre des opérations semblait le faire fonctionner.

METTRE À JOUR:

C'est définitivement un bug dans Idea. Cette réponse liée fonctionne de manière fiable lorsqu'il existe des répertoires extraits. En substance, vous trouvez votre .idea / JARNAME.xml, ajoutez l'élément suivant tout en haut de l' <root>élément pour votre jar. Tous les éléments extraits au-dessus de votre nouvelle copie de fichier qui contiennent un manifeste clobberont votre nouveau manifeste.

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>
L'automne
la source
7

Si vous souhaitez spécifier la classe principale, vous devez ajouter ce plugin à pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>Form</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
usbo
la source
1

J'avais un problème similaire.

Le problème était dans le fichier pom.xml.

<archive>
  <manifestEntries>
    <Dependencies>one.jar,
                  two.rar, 
                  other.jar
    </Dependencies>
  </manifestEntries>
</archive>

Je ne sais pas pour quelle raison ce code fonctionne dans eclipse, mais pas dans IntelliJ

C'est correct.

<archive>
  <manifestEntries>
    <Dependencies>one.jar, two.rar, other.jar</Dependencies>
  </manifestEntries>
</archive>

Manifest.mf a fonctionné !!!

J'espère que ça aide.

marcelocesar
la source
J'ai eu cette situation exacte et suis arrivé à la même conclusion que vous: les nouvelles lignes entre les éléments <Dependencies> fonctionnaient dans Eclipse, mais pas dans Intellij IDEA.
Arion Krause
0

Il existe plusieurs façons de générer des fichiers JAR exécutables. L'utilisation de la fonctionnalité GUI d'IntelliJ est un bon moyen. Une autre façon est d'utiliser Maven (ou de manière similaire dans gradle, buildr, etc.) qui est compatible avec les serveurs de construction:

Il est plus ou moins copiable à partir des exemples optaplanner maven build:

  1. Le fichier jar de l'utilisateur final (optaplanner-examples - *. Jar) doit inclure le chemin de classe de ses dépendances dans son manifeste .
  2. Le script sh et bat doit ensuite exécuter ce jar avec en conséquence.
Geoffrey De Smet
la source
0

Pour n'avoir aucun problème comme Manifest, vous devriez avoir un répertoire nommé "META-INF" dans le répertoire "src". Alors, créez-le et mettez-y un fichier nommé "MANIFEST.MF" avec le contenu suivant:

Manifest-Version: 1.0
Main-Class: <packageName>.Main

Ne pas oublier de remplacer le nom du paquet contenant la classe Main ci-dessus!

Mohsen Abasi
la source
4
Le dossier montre que j'ai supprimé du matériel religieux de votre message en août. Veuillez noter que la communauté a discuté de l'ajout de thèmes religieux dans les messages, et la réponse est que nous préférerions qu'ils soient laissés de côté. Vous êtes cependant le bienvenu pour les ajouter à votre profil ou à votre avatar.
halfer