web-dev-qa-db-fra.com

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

J'essaie de conditionner un projet utilisant les bibliothèques OptaPlanner 6.0.1 dans un fichier .jar à l'aide de l'artefact jar d'IntelliJ IDEA, mais au lieu de mon fichier manifest.mf contenant la norme.

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

le pot utilise celui fourni dans ecj-3.7.2.jar, 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, un "no main manifest attribute, in appname.jar" _ erreur se produit lorsque vous essayez d’exécuter l’application. Si je remplace manuellement le manifeste dans le fichier .jar par le mien, tout fonctionne correctement. Y a-t-il quelque chose que je puisse faire 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.

98
grudolf

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

Assurez-vous que votre MANIFEST.MF est dans:

src/main/resources/META_INF/

NE PAS

src/main/Java/META_INF/
242
jamhan

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

  • Structure du projet -> Artefacts -> + Bocal -> Vide
  • Le volet central contient maintenant les boutons Créer un manifeste et Utiliser un manifeste existant. Utilisez-en un.
  • J'avais de la difficulté à extraire les bibliothèques dépendantes avec leurs propres manifestes dans la racine de sortie, car elles semblaient écraser par intermittence le nouveau manifeste créé manuellement. Déconner avec l'ordre des opérations semblait le faire fonctionner.

MISE À 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 gros, vous trouvez votre fichier .idea/JARNAME.xml, ajoutez-y l’élément suivant au tout en haut du <root> élément pour votre pot. Tous les éléments extraits au-dessus de votre nouvelle copie de fichier contenant un manifeste masqueront votre nouveau manifeste.

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>
10
DS Justice

Pour réparer:

  1. Fichier> Structure du projet
  2. Sous Paramètres du projet à gauche, sélectionnez "Artefacts".
  3. Recherchez la définition du fichier JAR dans le volet central et sélectionnez-la.
  4. Dans le volet de gauche de l'onglet "Mise en page de sortie", recherchez le fichier jar dans la liste et sélectionnez-le.
  5. En bas, cliquez sur le bouton "Utiliser un manifeste existant" et sélectionnez le fichier manifeste qui se trouve dans la source de votre projet.
  6. Cliquez sur OK et lancez la construction.
10
Javaru

Si vous voulez spécifier Main Class, 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>
6
usbo

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 travaillé !!!

J'espère que ça aide.

1
marcelocesar

Pour ne pas avoir de problème comme Manifest, vous devez avoir un répertoire nommé "META-INF" dans le répertoire "src". Donc, créez-le et mettez 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 principale ci-dessus!

0
Mohsen Abasi

Il existe plusieurs façons de générer des fichiers jar exécutables. Utiliser la fonction d'interface graphique d'IntelliJ est un bon moyen. Une autre méthode consiste à utiliser Maven (ou de manière similaire dans gradle, buildr, etc.), qui est convivial pour les serveurs de construction:

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

  1. Le fichier jar de l'utilisateur final (optaplanner-examples - *. Jar) doit inclure le chemin d'accès aux classes de ses dépendances dans son manifeste .
  2. Le script sh and bat doit ensuite exécuter le fichier jar en conséquence.
0
Geoffrey De Smet