Falsches Manifest.mf in IntelliJ IDEA erstellt .jar

102

Ich versuche, ein Projekt mit OptaPlanner 6.0.1-Bibliotheken über das JAR-Artefakt von IntelliJ IDEA in eine JAR-Datei zu packen, aber anstelle meiner manifest.mf, die den Standard enthält

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

Das Glas verwendet das in ecj-3.7.2.jar, einer der unterstützenden Bibliotheken von OptaPlanner, bereitgestellte:

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

Aus diesem Grund tritt "no main manifest attribute, in appname.jar"beim Versuch, die App auszuführen , ein Fehler auf. Wenn ich das Manifest in der JAR-Datei manuell durch meine ersetze, funktioniert alles korrekt. Kann ich irgendetwas tun, um das zu beheben?

Ich behalte die Bibliotheken in einem separaten / lib-Verzeichnis und sie wurden dem Stammverzeichnis des JAR-Artefakts als Extracted Directory hinzugefügt. IntelliJ IDEA ist v13.0.1.

Grudolf
quelle
1
Kennen Sie Build-Tools wie Ant, Maven oder Gradle?
MariuszS
Ich kenne sie, habe aber bisher nur make- und .NET-Gegenstücke (NAnt, MSBuild) verwendet. Welchen von ihnen sollte ich auswählen, wenn das Build-Tool von IntelliJ es nicht schneidet?
Grudolf
1
Stimmen Sie ab, um dieses Problem hier zu beheben ,
Bigjosh

Antworten:

260

Ich hatte das gleiche Problem.

Stellen Sie sicher, dass sich Ihre MANIFEST.MF in:

src/main/resources/META_INF/

NICHT

src/main/java/META_INF/
Jamhan
quelle
20
Dies ist in der Tat die richtige Antwort. Es scheint, dass Intellij IDEA den META-INF-Ordner falsch platziert, wenn die Projektvorlage Maven
Kumait ist.
In meinem Fall musste ich das Layout meines Projekts ändern. Ich hatte zuvor ein Projekt mit Maven-Layout, aber ich habe die Unterstützung von Maven entfernt. Ich erstelle ein Projekt von Grund auf neu und jetzt funktioniert es.
Maxence
1
Dies funktionierte bei mir nicht, ich musste die Mainfest-Datei in das Stammverzeichnis des Projekts verschieben.
Rennen
Ist Maven so dumm, dass diese Datei in ein falsches Verzeichnis gestellt wird? : ^)
Daria
@Kumait, das Problem ist in IntelliJ 2017.1.5 noch vorhanden. Ich frage mich, ob das JetBrain-Team davon Kenntnis hat.
Fruqi
12

Reparieren:

  1. Datei> Projektstruktur
  2. Wählen Sie links unter Projekteinstellungen "Artefakte" aus.
  3. Suchen Sie die JAR-Definition im mittleren Bereich und wählen Sie sie aus
  4. Suchen Sie im linken Bereich der Registerkarte "Ausgabelayout" die JAR-Datei in der Liste und wählen Sie sie aus
  5. Klicken Sie unten auf die Schaltfläche "Vorhandenes Manifest verwenden" und wählen Sie die Manifestdatei aus, die sich in Ihrer Projektquelle befindet.
  6. Klicken Sie auf OK und führen Sie den Build aus
Javaru
quelle
3
Es gibt keine Schaltfläche "Vorhandenes Manifest verwenden", jedoch zeigt die Manifestdatei im Ausgabelayout auf den richtigen Speicherort (... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf
5
OK, musste das JAR-Artefakt löschen und neu erstellen, diesmal als "Leer" anstelle von "Von Modulen mit Abhängigkeiten". Ich habe die Schaltflächen "Manifest erstellen" und "Vorhandenes Manifest verwenden" erhalten, die auf mein Manifest und die gelesenen Bibliotheken verweisen und die Ausgabe kompilieren. Es gibt zwei Unterschiede zu früher: Eine META_INF \ MANIFEST.INF ist jetzt explizit im Ausgabelayout enthalten und die JAR-Datei scheint korrekt generiert zu sein. :)
Grudolf
Dies löst das Problem zumindest für mich nicht. Jamahns Antwort hat jedoch funktioniert.
Andrew Breksa
Kommentar von Low-Rep-Benutzer @ ds-Justice wie folgt hinzugefügt - @ grudolfs Kommentar oben zum Erstellen eines leeren Jar war das einzige, was für mich nach mehreren Stunden des Kampfes mit einem importierten Gradle-Projekt funktioniert hat. Dies ist eine wichtige Frage. Bitte erwägen Sie, Ihren Kommentar als separate Antwort erneut zu veröffentlichen.
Shawn Mehan
10

Wie in @ grudolfs Kommentar in einer der anderen Antworten erwähnt, besteht eine Möglichkeit, dies zu tun (und die einzige, die in einem importierten Gradle-Projekt für mich funktioniert hat) darin, ein leeres Glas wie folgt zu erstellen:

  • Projektstruktur -> Artefakte -> + Glas -> Leer
  • Im mittleren Bereich befinden sich jetzt die Schaltflächen Manifest erstellen und Vorhandenes Manifest verwenden. Verwenden Sie eine davon.
  • Ich hatte Schwierigkeiten, wenn ich abhängige Bibliotheken mit ihren eigenen Manifesten in das Ausgabestammverzeichnis extrahierte. Sie schienen das neue manuell erstellte Manifest zeitweise zu überschreiben. Das Herumspielen mit der Reihenfolge der Operationen schien zu funktionieren.

AKTUALISIEREN:

Dies ist definitiv ein Fehler in Idea. Diese verknüpfte Antwort funktioniert zuverlässig, wenn extrahierte Verzeichnisse vorhanden sind. Im Wesentlichen finden Sie Ihre .idea / JARNAME.xml. Fügen Sie das folgende Element ganz oben im <root>Element für Ihr Glas hinzu. Alle extrahierten Elemente über Ihrer neuen Dateikopie, die ein Manifest enthalten, blockieren Ihr neues Manifest.

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>
Herbst
quelle
7

Wenn Sie die Hauptklasse angeben möchten, müssen Sie dieses Plugin zu pom.xml hinzufügen:

<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
quelle
1

Ich hatte ein ähnliches Problem.

Das Problem war in der Datei pom.xml.

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

Ich weiß nicht, aus welchem ​​Grund dieser Code in Eclipse funktioniert, aber nicht in IntelliJ

Das ist richtig.

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

Manifest.mf hat funktioniert !!!

Ich hoffe das hilft.

marcelocesar
quelle
Ich hatte genau diese Situation und kam zu dem gleichen Schluss wie Sie: Zeilenumbrüche zwischen <Abhängigkeiten> -Elementen funktionierten in Eclipse, aber nicht in Intellij IDEA.
Arion Krause
0

Es gibt verschiedene Möglichkeiten, ausführbare Jars zu generieren. Die Verwendung der GUI-Funktion von IntelliJ ist eine gute Möglichkeit. Eine andere Möglichkeit ist die Verwendung von Maven (oder ähnlichem in gradle, buildr usw.), das für Build-Server geeignet ist:

Es ist mehr oder weniger kopierbar aus den Optaplanner-Beispielen Maven Build:

  1. Das Endbenutzer-JAR (Optaplanner-Beispiele - *. JAR) muss den Klassenpfad seiner Abhängigkeiten in sein Manifest aufnehmen .
  2. Das sh and bat-Skript muss dann das Glas mit entsprechend ausführen.
Geoffrey De Smet
quelle
0

Um kein Problem wie Manifest zu haben, sollten Sie ein Verzeichnis mit dem Namen "META-INF" im Verzeichnis "src" haben. Erstellen Sie es also und fügen Sie eine Datei mit dem Namen "MANIFEST.MF" mit dem folgenden Inhalt ein:

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

Nicht zu vergessen, den Paketnamen mit der oben genannten Hauptklasse zu ersetzen!

Mohsen Abasi
quelle
4
Die Aufzeichnung zeigt, dass ich religiöses Material von Ihrem Posten im August abgeschnitten habe. Bitte beachten Sie, dass die Community das Hinzufügen religiöser Themen zu Posts diskutiert hat und die Antwort lautet, dass wir es vorziehen würden, wenn sie weggelassen würden. Sie können sie jedoch gerne zu Ihrem Profil oder Avatar hinzufügen.
Halfer