Bisher habe ich über die Eclipse-Funktion "Exportieren ..." ausführbare JAR-Dateien erstellt. Jetzt bin ich zur Build-Automatisierung zu IntelliJ IDEA und Gradle gewechselt.
Einige Artikel hier schlagen das Plugin "Anwendung" vor, aber dies führt nicht vollständig zu dem erwarteten Ergebnis (nur eine JAR, keine Startskripte oder ähnliches).
Wie kann ich mit dem Dialogfeld "Exportieren ..." das gleiche Ergebnis erzielen, das Eclipse erzielt?
Die Antworten von JB Nizet und Jorge_B sind korrekt.
In seiner einfachsten Form müssen Sie zum Erstellen einer ausführbaren JAR mit Gradle nur die entsprechenden Einträge zum Manifest hinzufügen . Es kommt jedoch viel häufiger vor, dass Abhängigkeiten in den Klassenpfad aufgenommen werden müssen, was diesen Ansatz in der Praxis schwierig macht.
Das Anwendungs-Plugin bietet einen alternativen Ansatz. Anstatt eine ausführbare JAR zu erstellen, bietet es:
run
Aufgabe, die das einfache Ausführen der Anwendung direkt vom Build aus erleichtertinstallDist
Aufgabe, die eine Verzeichnisstruktur generiert, einschließlich der erstellten JAR, aller JARs, von denen sie abhängt, und eines Startskripts, das alles zu einem Programm zusammenfasst, das Sie ausführen könnendistZip
unddistTar
Aufgaben, die Archive erstellen, die eine vollständige Anwendungsverteilung enthalten (Startskripte und JARs)Ein dritter Ansatz besteht darin, eine sogenannte "Fat JAR" zu erstellen, eine ausführbare JAR, die nicht nur den Code Ihrer Komponente, sondern auch alle ihre Abhängigkeiten enthält. Es gibt einige verschiedene Plugins, die diesen Ansatz verwenden. Ich habe Links zu einigen hinzugefügt, die mir bekannt sind. Ich bin sicher, es gibt noch mehr.
quelle
configurations.runtime
zur Bündelung von Laufzeitabhängigkeiten in der einzelnen JAR hinzufügen müssen ..tar
/.zip
Dateien ausführen ?Wie andere angemerkt haben, muss der Einstiegspunkt der Anwendung im
Main-Class
Attribut der Manifestdatei festgelegt werden, damit eine JAR-Datei ausführbar ist . Wenn die Abhängigkeitsklassendateien nicht zusammengestellt werden, müssen sie imClass-Path
Eintrag der Manifestdatei festgelegt werden.Ich habe alle Arten von Plugin-Kombinationen ausprobiert und was nicht für die einfache Aufgabe, ein ausführbares JAR zu erstellen und irgendwie die Abhängigkeiten einzuschließen. Alle Plugins scheinen auf die eine oder andere Weise zu fehlen, aber schließlich habe ich es so bekommen, wie ich es wollte. Keine mysteriösen Skripte, keine Millionen verschiedener Mini-Dateien, die das Build-Verzeichnis verschmutzen, eine ziemlich saubere Build-Skript-Datei und vor allem: Nicht eine Million ausländischer Klassendateien von Drittanbietern, die in meinem JAR-Archiv zusammengeführt wurden.
Das Folgende ist ein Kopieren und Einfügen von hier für Ihre Bequemlichkeit.
[How-to] Erstellen Sie eine Distributions-Zip-Datei mit Abhängigkeitsgläsern im Unterverzeichnis
/lib
und fügen Sie alle Abhängigkeiten zumClass-Path
Eintrag in der Manifestdatei hinzu:Hosted als Kern hier .
Das Ergebnis finden Sie in
build/distributions
und der entpackte Inhalt sieht folgendermaßen aus:Inhalt von
MyJarFile.jar#META-INF/MANIFEST.mf
:quelle
lib
Verzeichnis der erstellten zip / tar-Datei, sondern imlib
übergeordneten Verzeichnis, wie diese Antwort nahelegt. Diese Lösung schien perfekt für mich zu funktionieren."lib/$it.name"
zu"$it.name"
wird also den Job erledigen.Die Lösung mit dem geringsten Aufwand bestand für mich darin, das Gradle-Shadow-Plugin zu verwenden
Neben dem Anwenden des Plugins muss nur Folgendes getan werden:
Konfigurieren Sie die JAR-Aufgabe so, dass Ihre Hauptklasse manifestiert wird
Führen Sie die Gradle-Aufgabe aus
Nehmen Sie die app-version-all.jar aus build / libs /
Und schließlich führen Sie es aus über:
quelle
build.gradle
Beispiel .'com.my.app.MainKt'
. Ohne weitere Informationen kann ich Ihnen nicht weiter helfen.Haben Sie die 'installApp'-Aufgabe ausprobiert? Erstellt es nicht ein vollständiges Verzeichnis mit einer Reihe von Startskripten?
http://www.gradle.org/docs/current/userguide/application_plugin.html
quelle
installApp
weiß , wird keineMETA-INF/MANIFEST.MF
Datei erstellt. Mache ich etwas falsch?installApp
Aufgabe in der Aufgabenliste des Anwendungs-Plugins . Meinten SieinstallDist
stattdessen?installApp
wurdeinstallDist
in Gradle 3.0 umbenannt. Hier ist der Versionshinweis .Danke Konstantin, es hat wie ein Zauber mit wenigen Nuancen funktioniert. Aus irgendeinem Grund funktionierte die Angabe der Hauptklasse als Teil des JAR-Manifests nicht ganz und wollte stattdessen das Attribut mainClassName. Hier ist ein Ausschnitt aus build.gradle, der alles enthält, damit es funktioniert:
Nach dem Ausführen von gradle shadowJar erhalten Sie myapp- {version} -all.jar in Ihrem Build-Ordner, der als java -jar myapp- {version} -all.jar ausgeführt werden kann.
quelle
Sie können ein JAR-Artefakt in den Moduleinstellungen (oder in der Projektstruktur) definieren.
Das Erstellen eines Glases ist dann so einfach wie das Klicken auf "Artefakt erstellen ..." im Menü "Erstellen". Als Bonus können Sie alle Abhängigkeiten in einem einzigen Glas verpacken.
Getestet auf IntelliJ IDEA 14 Ultimate.
quelle
Ich habe einige Links auf die Lösung überprüft und schließlich die unten genannten Schritte ausgeführt, um sie zum Laufen zu bringen. Ich benutze Gradle 2.9.
Nehmen Sie die folgenden Änderungen in Ihrer Build-Gradle-Datei vor:
Plugin erwähnen:
Stellen Sie das Buildscript bereit:
Geben Sie die Hauptklasse an:
Erstellen Sie den Fatjar:
Führen Sie den Fatjar aus / build / libs /:
quelle
Sie können das SpringBoot-Plugin verwenden:
Erstellen Sie das Glas
Und dann lass es laufen
Hinweis: Ihr Projekt muss KEIN SpringBoot-Projekt sein, um dieses Plugin verwenden zu können.
quelle