Ich habe eine Anwendung installiert. Wenn ich versuche, sie auszuführen (es ist eine ausführbare JAR-Datei), passiert nichts. Wenn ich es von der Kommandozeile aus starte mit:
java -jar "app.jar"
Ich erhalte die folgende Nachricht:
kein Hauptmanifestattribut in "app.jar"
Wenn ich das Programm selbst erstellt hätte, hätte ich der Manifestdatei normalerweise ein Hauptklassenattribut hinzugefügt. Aber in diesem Fall kann ich das nicht tun, da die Datei aus einer Anwendung stammt. Ich habe auch versucht, das Glas zu extrahieren, um zu sehen, ob ich die Hauptklasse finden konnte, aber es gibt zu viele Klassen, und keine von ihnen hat das Wort "main" im Namen. Es muss eine Möglichkeit geben, dies zu beheben, da das Programm auf anderen Systemen einwandfrei ausgeführt wird.
javap
. Vielleicht möchten Sie es entpacken und nachsehen, ob es tatsächlich kein Manifest gibt.Antworten:
Erstens ist es irgendwie komisch, dich rennen zu sehen
java -jar "app"
und nichtjava -jar app.jar
Zweitens müssen Sie eine Datei mit dem Namen META-INF / MANIFEST.MF erstellen, um eine JAR-Datei ausführbar zu machen
Die Datei selbst sollte (mindestens) diesen einen Liner haben:
Wo
com.mypackage.MyClass
befindet sich die Klasse, die den öffentlichen statischen void main- Einstiegspunkt (String [] args) enthält?Beachten Sie, dass es verschiedene Möglichkeiten gibt, dies entweder mit der CLI, Maven, Ant oder Gradle zu erreichen:
Für die CLI reicht der folgende Befehl aus: (tks @ dvvrt )
jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
Für Maven sollte so etwas wie das folgende Snippet den Trick machen. Beachten Sie, dass dies nur die Plugin-Definition ist, nicht die vollständige pom.xml :
(Wählen Sie eine
<version>
für Ihr Projekt geeignete.)Für Ant sollte das folgende Snippet helfen:
Credits Michael Niemand -
Für Gradle :
quelle
lib
Ordner enthält, müssen Sie nur das JAR mit ausführen,java -jar myproject.jar
und es werden die Abhängigkeiten gefunden.jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
maven-jar-plugin
Element in der VSC-generierten Maven-Datei, daher habe ich den<configuration>
Abschnitt hinzugefügt .Das hätte
java -jar app.jar
statt sein sollenjava -jar "app"
.Die
-jar
Option funktioniert nur, wenn die JAR-Datei eine ausführbare JAR-Datei ist. Dies bedeutet, dass sie eine Manifestdatei mit einemMain-Class
Attribut enthalten muss. Informationen zum Erstellen einer ausführbaren JAR finden Sie unter Packen von Programmen in JAR-Dateien .Wenn es sich nicht um eine ausführbare JAR handelt, müssen Sie das Programm folgendermaßen ausführen:
Wo
com.somepackage.SomeClass
ist die Klasse, die diemain
Methode zum Ausführen des Programms enthält ? (Was diese Klasse ist, hängt vom Programm ab. Es ist unmöglich, anhand der von Ihnen angegebenen Informationen zu erkennen.)quelle
META-INF
Verzeichnis innerhalb der JAR-Datei). Es sollte einMain-Class
Attribut enthalten , das Ihnen den Namen der Hauptklasse gibt.Alternativ können Sie das Maven-Assembly-Plugin verwenden, wie im folgenden Beispiel gezeigt:
In diesem Beispiel werden alle im Abschnitt angegebenen Abhängigkeitsgläser automatisch in Ihr einzelnes Glas aufgenommen. Beachten Sie, dass jar-with-dependencies wörtlich so gesetzt werden sollte, dass sie nicht durch die jar-Dateinamen ersetzt werden, die Sie einschließen möchten.
quelle
maven-assembly-plugin
funktioniert.maven-jar-plugin
nicht.pom.xml
Datei ein<build><plugins> PUT IT HERE </plugins></build>
und führen Sie dann das Maven-Paket aus (öffnen Sie in IDEA das Maven-Schiebemenü rechts und suchen Sie nach Projekt> Lebenszyklus> Paket). Dann befindet sich Ihre JAR-Datei im Zielordner. Prost!Dies liegt daran, dass Java das Main-Attribut in der Datei MANIFEST.MF nicht finden kann. Das Main-Attribut ist erforderlich, um Java mitzuteilen, welche Klasse als Einstiegspunkt für die Anwendung verwendet werden soll. In der JAR-Datei befindet sich die Datei MANIFEST.MF im Ordner META-INF. Sie fragen sich, wie Sie sehen können, was sich in einer JAR-Datei befindet? Öffnen Sie die JAR-Datei mit WinRAR.
Das Hauptattribut in MANIFEST.MF sieht folgendermaßen aus:
Sie erhalten den Fehler "Kein Hauptmanifestattribut", wenn diese Zeile in der Datei MANIFEST.MF fehlt.
Es ist wirklich ein großes Durcheinander, dieses Attribut in der Datei MANIFEST.MF anzugeben.Update: Ich habe gerade eine wirklich gute Möglichkeit gefunden, den Einstiegspunkt der Anwendung in Eclipse anzugeben. Wenn Sie Exportieren sagen,
quelle
Ich hatte das gleiche Problem. Durch Hinzufügen der folgenden Zeilen zur POM-Datei funktionierte es. Das Plugin stellt den Erstellungsprozess Ihrer Anwendung mit allen erforderlichen Schritten sicher.
quelle
<parent>...</parent>
Anwendung in der Datei pom.xml verwiesen haben . Ich vermute, wenn wir dieparent
pom.xml der Anwendung besuchen , bekommen wir eine klare Vorstellung.repackage-classifier
. Bitte besuchen Sie docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…Die Gradle-Antwort besteht darin, eine JAR / Manifest / Attribute-Einstellung wie folgt hinzuzufügen:
quelle
Ich hatte dieses Problem beim Erstellen eines Glases mit IntelliJ IDEA. Siehe diese Diskussion .
Was es für mich gelöst hat, war, das JAR-Artefakt neu zu erstellen und JAR> Von Modulen mit Abhängigkeiten zu wählen, aber das Standardverzeichnis für META-INF / MANIFEST.MF nicht zu akzeptieren. Ändern Sie es von - / src / main / java in - / src / main / resources.
Andernfalls wurde eine Manifestdatei in das JAR aufgenommen, aber nicht die in - / src / main / java, die es haben sollte.
quelle
Für Maven ist dies das, was es gelöst hat (für mich für eine Veetle-Codebasis auf GitHub):
Prost...
quelle
mvn package shade:shade
nur das Laufenmvn package
das Shadow-Plugin nicht zum Laufen brachte.Versuchen Sie diesen Befehl, um das Glas einzuschließen:
quelle
Für mich hat keine der Antworten wirklich geholfen - ich hatte die Manifestdatei an der richtigen Stelle, die die Hauptklasse und alles enthielt. Was mich stolperte, war Folgendes:
( Quelle ). Durch Hinzufügen einer neuen Zeile am Ende des Manifests wurde dies behoben.
quelle
Wenn Sie Maven verwenden, geben Sie Folgendes in den Pom ein
quelle
no main manifest attribute
Fehlern zu suchen , aber ich arbeite an einer Spring-Boot-Anwendung, daher hat mir diese Antwort geholfen. Ich wusste bereits, wie man eineMETA-INF/MANIFEST.MF
Datei erstellt, aber nicht, wie Spring-Boot automatisch damit umgeht.spring-boot
ignorieren Sie es einfach. Stackoverflow hilft auch dabei, ein eigenes Issue-Repository zu erstellen, mit dem Sie beim Programmieren konfrontiert sind.Ich hatte heute das gleiche Problem. Mein Problem wurde gelöst, als META-INF in den Ressourcenordner verschoben wurde.
quelle
Ich habe gerade den gleichen Fehler bekommen. Wenn Sie verwenden
gradle
, fügen Sie einfach das nächste in ur hinzugradle.build
:Wo
com.company.project.MainClass
Pfad zu Ihrer Klasse mitpublic static void main(String[] args)
Methode.quelle
mainClassName
Variablensatzes der obersten Ebene angegeben , aber das hilft nur beimgradle run
Befehl, nicht beim Erstellen einer ausführbaren .jarDas MAVEN-Problem besteht darin, dass versucht wird, die erste MANIFEST.MF-Datei aus der ersten Bibliothek aus Abhängigkeiten anstelle von UNSEREM EIGENEN MANIFEST.MF einzuschließen, wenn Sie Artefakte verwenden! .
Kopieren Sie die echte MANIFEST.MF, die MAVEN bereits in Ihrem Projekt generiert hat. Dazu gehören:
Manifest-Version: 1.0 Hauptklasse: yourpacket.yourmainclass (zum Beispiel info.data.MainClass)
Ersetzen Sie den Inhalt von MANIFEST.MF aus youjar.zip damit.
ODER!
Erstellen Sie einfach Ihre eigene MANIFEST.MF und:
Wenn Sie jedoch das Maven-Bedienfeld (oder die Maven-Befehlszeile) verwenden, können Sie es zwingen, ein eigenes Manifest zu generieren und es in die JAR-Datei aufzunehmen.
Fügen Sie dem Build-Abschnitt von you pom.xml diesen Code hinzu:
Öffnen Sie das MAVEN-Bedienfeld (in Intellij) und führen Sie "Installieren" aus. Es generiert die MANIFEST-Datei und kompiliert die JAR-Datei mit allen Abhängigkeiten in den Ordner "Target". Außerdem wird es im lokalen Maven-Repository installiert.
quelle
Wenn das Glas nicht den Regeln entspricht , ist es kein ausführbares Glas.
quelle
Ich hatte das gleiche Problem und es ist jetzt behoben :) Befolgen Sie einfach die folgenden Schritte und der Fehler kann für alles sein, aber die folgenden Schritte machen den Prozess reibungsloser. Ich verbringe viel Zeit damit, die Lösung zu finden.
1. Versuchen Sie, die Eclipse neu zu starten (wenn Sie Eclipse zum Erstellen einer JAR-Datei verwenden) -> Dies hat meinem Problem beim ordnungsgemäßen Exportieren der JAR-Datei geholfen.
2.Versuchen Sie nach dem Neustart von Eclipse, ob Ihre Eclipse die Hauptklasse / -methode von Ihrem Java-Projekt erkennen kann -> Rechtsklick -> Ausführen als -> Konfigurationen ausführen -> Haupt -> Klicken Sie auf die Schaltfläche Suchen um zu sehen, ob Ihre Eclipse in der JAR-Datei nach Ihrer Hauptklasse suchen kann. -> Dies dient zur Überprüfung, ob die JAR-Datei den Einstiegspunkt in die Hauptklasse hat.
Exportieren Sie anschließend Ihr Java Dynamic-Projekt als "Runnable JAR" -Datei und nicht als JAR-Datei.
Wählen Sie in der Java-Startkonfiguration Ihre Hauptklasse aus.
Verwenden Sie nach dem Exportieren der JAR-Datei den folgenden Befehl, um sie auszuführen. java -cp [Ihre JAR] .jar [Komplettpaket] .MainClass zB: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit
Möglicherweise tritt der nicht unterstützte Java-Versionsfehler auf. Das Update besteht darin, das java_home in Ihrem Shell-Bash-Profil so zu ändern, dass es mit der Java-Version übereinstimmt, die zum Kompilieren des Projekts in Eclipse verwendet wird.
Hoffe das hilft! Bitte lassen Sie mich wissen, wenn Sie noch Probleme haben.
quelle
Ich hatte das gleiche Problem. Viele der hier genannten Lösungen haben mir nicht das ganze Bild vermittelt, daher werde ich versuchen, Ihnen eine Zusammenfassung des Packens von JAR-Dateien über die Befehlszeile zu geben .
Wenn Sie Ihre
.class
Dateien in Paketen haben möchten , fügen Sie das Paket am Anfang des hinzu.java
.Test.java
Um Ihren Code mit Ihren
.class
Dateien zu kompilieren, die die durch den Paketnamen angegebene Struktur haben, verwenden Sie:Das
-d .
macht der Compiler die Verzeichnisstruktur erstellen Sie wollen.Wenn Sie die
.jar
Datei verpacken , müssen Sie die JAR-Routine anweisen, wie sie verpackt wird . Hier verwenden wir den OptionssatzcvfeP
. Dies dient dazu , die Paketstruktur beizubehalten (OptionP
) und den Einstiegspunkt anzugeben, damit die Manifestdatei aussagekräftige Informationen enthält (Optione
). Mit Optionf
können Sie den Dateinamen angeben, Optionc
erstellt ein Archiv und Optionv
setzt die Ausgabe auf ausführlich. Die wichtigsten Dinge, die hier zu beachten sind, sindP
unde
.Dann kommt der Name des Glases, das wir wollen
test.jar
.Dann kommt der Einstiegspunkt.
Anschließend werden
-C . <packagename>/
die Klassendateien aus diesem Ordner abgerufen, wobei die Ordnerstruktur beibehalten wird.Überprüfen Sie Ihre
.jar
Datei in einem Zip-Programm. Es sollte die folgende Struktur habentest.jar
Die MANIFEST.MF sollte Folgendes enthalten
Wenn Sie Ihr Manifest von Hand bearbeiten, müssen Sie den Zeilenumbruch am Ende behalten, da Java ihn sonst nicht erkennt.
Führen Sie Ihre
.jar
Datei mit ausquelle
Ich persönlich denke, dass alle Antworten hier die Frage falsch verstehen. Die Antwort darauf liegt in dem Unterschied, wie Spring-Boot die .jar baut. Jeder weiß, dass Spring Boot ein solches Manifest erstellt, das von jeder Annahme abweicht, dass es sich um einen Standard-JAR-Start handelt, bei dem es sich möglicherweise um Folgendes handelt oder nicht:
Vielleicht muss es mit
org.springframework.boot.loader.JarLauncher
auf dem Klassenpfad ausgeführt werden?quelle
Jede ausführbare JAR-Datei sollte entweder durch Klicken oder Ausführen über eine Eingabeaufforderung wie java -jar app.jar ausgeführt werden (verwenden Sie "wenn der Pfad des JAR Leerzeichen enthält" - dh Java -jar "C: \ Ordnername \ app.jar"). Wenn Ihr ausführbares JAR nicht ausgeführt wird, bedeutet dies, dass es nicht ordnungsgemäß erstellt wurde.
Extrahieren Sie zum besseren Verständnis die JAR-Datei (oder zeigen Sie sie mit einem beliebigen Tool an, für Windows 7-Zip ist sie hilfreich) und überprüfen Sie die Datei unter /META-INF/MANIFEST.MF. Wenn Sie einen Eintrag wie finden
Hauptklasse: your.package.name.ClaaswithMain - dann ist es in Ordnung, sonst müssen Sie es bereitstellen.
Achten Sie darauf, dass Sie den Eintrag der Hauptklasse an die Datei MANIFEST.MF anhängen. Überprüfen Sie, wo Sie ihn speichern!
quelle
Sie können diesen Schritt einfach ausführen. Erstellen Sie eine JAR-Datei mit
Während Sie die JAR-Datei ausführen, führen Sie sie einfach so aus
quelle
Möglicherweise haben Sie die JAR-Datei nicht ordnungsgemäß erstellt:
Folgendes funktioniert:
quelle
Wenn Sie die Befehlszeile zum Zusammenstellen von .jar verwenden, können Sie auf die Hauptzeile zeigen, ohne die Manifest-Datei hinzuzufügen. Beispiel:
(param "e" macht das: TheNameOfClassWithMainMethod ist ein Name der Klasse mit der Methode main () und app.jar - Name der ausführbaren Datei .jar und * .class - nur alle zu montierenden Klassendateien)
quelle
Bei mir trat dieser Fehler einfach auf, weil ich vergessen hatte, Eclipse mitzuteilen, dass ich eine ausführbare JAR-Datei und keine einfache Bibliotheks-JAR-Datei haben wollte. Wenn Sie also die JAR-Datei in Eclipse erstellen, stellen Sie sicher, dass Sie auf das rechte Optionsfeld klicken
quelle
Die obigen Antworten waren für mich nur teilweise hilfreich.
java -cp
war Teil der Antwort, aber ich brauchte genauere Informationen darüber, wie ich die auszuführende Klasse identifizieren kann. Folgendes hat bei mir funktioniert:Schritt 1: Finden Sie die Klasse, die ich ausführen muss
Die obersten Zeilen des Ergebnisses waren:
App.class enthielt die auszuführende Hauptklasse. Ich bin mir nicht 100% sicher, ob Sie immer davon ausgehen können, dass die Klasse, die Sie brauchen, die erste ist, aber es war für mich. Wenn dies nicht der Fall ist, würde ich mir vorstellen, dass es nicht allzu schwierig ist, grep zu verwenden, um bibliotheksbezogene Ergebnisse auszuschließen und die Klassenliste auf eine überschaubare Größe zu reduzieren.
Von da an war es einfach: Ich benutze nur diesen Pfad (abzüglich des Suffixes ".class"):
quelle
java -cp ... somepackage.App
.Da Sie MANIFEST.MF hinzugefügt haben, sollten Sie die Reihenfolge der Felder in dieser Datei berücksichtigen. Mein env ist
java version "1.8.0_91"
und mein MANIFEST.MF wie hier
Dies läuft jedoch wie unten durch
quelle
(erster Beitrag - daher ist es möglicherweise nicht sauber)
Dies ist mein Fix für OS X 11.6, Maven-basiertes Netbeans 8.2-Programm. Bis jetzt besteht meine App zu 100% aus Netbeans - keine Optimierung (nur ein paar Shell-Escapes für das Unmögliche!).
Nachdem ich die meisten Antworten hier und anderswo vergeblich ausprobiert hatte, kehrte ich zur Kunst zurück, "zu verwenden, was funktioniert".
Die beste Antwort hier ( Olivier-Refalo- Danke) schien der richtige Startpunkt zu sein, half aber nicht.
Bei anderen Projekten, die funktionierten, stellte ich einige geringfügige Unterschiede in den Manifestlinien fest:
Ich bin mir nicht sicher warum (ich bin erst 3 Monate in Java) oder wie, kann aber nur sagen, dass dies funktioniert hat.
Hier wird nur der modifizierte Manifestblock verwendet:
quelle
Ich habe eine neue Lösung für die Erzeugung schlechter Manifeste gefunden!
Klicken Sie auf für META-INF
Hinzufügen oder bearbeiten
Hinzufügen:
Erstellen Sie eine Textdatei mit dem Namen MANIFEST.MF in einem Ordner mit dem Namen META-INF und fügen Sie die folgende Zeile hinzu:
Speichern Sie die Datei und fügen Sie sie der Zip-Datei hinzu
Bearbeiten:
Öffnen Sie cmd und geben Sie Folgendes ein: java -jar c: /path/JarName.jar
Es sollte jetzt gut funktionieren!
quelle
Die meisten Lösungen haben bei mir nicht funktioniert, aber mein Lehrer hat mir geholfen. Ich möchte seine Lösung hier teilen. Ich habe das Kali Linux Terminal verwendet, sollte aber in allen Debians in Ordnung sein
im Dateityp
Jetzt zum Ausführen der Datei verwenden
oder Sie können zu den Eigenschaften der Datei gehen und überprüfen
Es hat mir geholfen, während die meisten der oben genannten Antworten dies nicht taten
quelle
Möglicherweise haben Sie das gleiche Problem wie ich. Schreiben Sie nach dem Erstellen Ihrer JAR-Datei
jar xf app.jar META-INF/MANIFEST.MF
. Dadurch wird eine Kopie der Datei in Ihr aktuelles Verzeichnis erstellt, damit Sie sie lesen können. Wenn es nur so etwas sagt wie:und enthält nicht die "Main-Class" -Deklaration, dann haben Sie wohl Ihr Problem gefunden.
Ich weiß jedoch nicht, wie ich es lösen soll. Ich habe andere Personen mit gleichen / ähnlichen Problemen auf StackOverflow überprüft und konnte keine Antwort finden. Mit diesen Informationen können Sie jedoch möglicherweise eine bessere Hilfe erhalten (angesichts der Tatsache, dass Sie das gleiche Problem wie ich haben).
Bearbeiten: Ich hatte es mit einer Manifest-Datei versucht, aber es funktionierte nicht, aber mein Fehler war, beim Erstellen der JAR-Datei nur eine der Klassen zu benennen. Ich habe stattdessen * .class geschrieben und es funktioniert jetzt.
Obwohl ich nicht weiß, warum eine Manifestdatei erstellt werden muss. Aber ich denke, es ist in Ordnung, solange es funktioniert.
quelle
Ich hatte dieses Problem und habe es kürzlich in Netbeans 8 gelöst (siehe Abbildung unten):
quelle