Do tej pory tworzyłem uruchamialne pliki JAR za pomocą funkcji Eclipse „Export ...”, ale teraz przełączyłem się na IntelliJ IDEA i Gradle w celu automatyzacji kompilacji.
Niektóre artykuły sugerują tutaj wtyczkę „aplikacja”, ale nie prowadzi to do końca, którego oczekiwałem (tylko JAR, brak skryptów startowych lub coś podobnego).
W jaki sposób mogę osiągnąć taki sam wynik, jaki daje Eclipse w oknie dialogowym „Eksportuj ...”?
Odpowiedzi JB Nizeta i Jorge_B są poprawne.
W najprostszej formie, utworzenie wykonywalnego pliku JAR za pomocą Gradle to tylko kwestia dodania odpowiednich wpisów do manifestu . Jednak znacznie częściej występują zależności, które muszą być uwzględnione w ścieżce klas, co utrudnia to podejście w praktyce.
Plugin aplikacja dostarcza alternatywnego podejścia; zamiast tworzyć wykonywalny plik JAR, zapewnia:
run
zadanie łatwe ułatwienia uruchamiania aplikacji bezpośrednio z budowyinstallDist
zadanie, które generuje strukturę katalogów w tym wybudowanym JAR, wszystkie JAR, że zależy on i skryptu startowego, który ciągnie to wszystko razem do programu można uruchomićdistZip
idistTar
zadania, które tworzą archiwa zawierające pełną dystrybucję aplikacji (skrypty startowe i JAR)Trzecim podejściem jest utworzenie tak zwanego „grubego pliku JAR”, który jest wykonywalnym plikiem JAR, który zawiera nie tylko kod komponentu, ale także wszystkie jego zależności. Istnieje kilka różnych wtyczek, które wykorzystują to podejście. Dołączyłem linki do kilku, o których wiem; Jestem pewien, że jest ich więcej.
źródło
configurations.runtime
do pakietu zależności wykonawcze w jednym pliku jar..tar
/.zip
?Jak zauważyli inni, aby plik jar był wykonywalny, punkt wejścia aplikacji musi być ustawiony w
Main-Class
atrybucie pliku manifestu. Jeśli pliki klas zależności nie są kolokowane, należy je ustawić weClass-Path
wpisie pliku manifestu.Wypróbowałem różne kombinacje wtyczek, a nie tylko po to, aby utworzyć plik wykonywalny jar i jakoś dołączyć zależności. Wydaje się, że wszystkim wtyczkom brakuje w ten czy inny sposób, ale w końcu dostałem to tak, jak chciałem. Żadnych tajemniczych skryptów, ani miliona różnych mini-plików zanieczyszczających katalog kompilacji, całkiem czysty plik skryptu kompilacji, a przede wszystkim: ani milion obcych plików klas innych firm, które zostały włączone do mojego archiwum jar.
Poniżej znajduje się kopia-wklej stąd dla Twojej wygody.
[How-to] Utwórz dystrybucyjny plik ZIP z plikami JAR zależności w podkatalogu
/lib
i dodaj wszystkie zależności doClass-Path
wpisu w pliku manifestu:Hostowane jako sedno tutaj .
Wynik można znaleźć w,
build/distributions
a rozpakowana zawartość wygląda następująco:Zawartość
MyJarFile.jar#META-INF/MANIFEST.mf
:źródło
lib
katalogu utworzonego pliku zip / tar, ale raczej wlib
katalogu nadrzędnym, jak sugeruje ta odpowiedź. To rozwiązanie wydawało mi się działać idealnie."lib/$it.name"
na"$it.name"
wystarczy.Najmniejszym wysiłkiem dla mnie było użycie wtyczki gradle-shadow-plugin
Oprócz zastosowania wtyczki wszystko, co należy zrobić, to:
Skonfiguruj zadanie jar, aby umieścić klasę główną w manifeście
Uruchom zadanie gradle
Weź app-version-all.jar od build / libs /
I na koniec wykonaj to poprzez:
źródło
build.gradle
przykład .'com.my.app.MainKt'
. Bez dodatkowych informacji nie mogę Ci dalej pomóc.Czy próbowałeś wykonać zadanie „installApp”? Czy nie tworzy pełnego katalogu z zestawem skryptów startowych?
http://www.gradle.org/docs/current/userguide/application_plugin.html
źródło
installApp
nie tworzyMETA-INF/MANIFEST.MF
pliku. czy robię coś źle?installApp
zadania na liście zadań wtyczki aplikacji . CzyinstallDist
zamiast tego miałeś na myśli ?installApp
zmieniono nazwę nainstallDist
. Oto informacja o wydaniu .Dziękuję Konstantin, działał jak urok z kilkoma niuansami. Z jakiegoś powodu określenie klasy main jako części manifestu jar nie zadziałało i zamiast tego potrzebny był atrybut mainClassName. Oto fragment z build.gradle, który zawiera wszystko, aby działał:
Po uruchomieniu gradle shadowJar dostajesz myapp- {wersja} -all.jar w folderze kompilacji, który można uruchomić jako java -jar myapp- {wersja} -all.jar.
źródło
Artefakt jar można zdefiniować w ustawieniach modułu (lub strukturze projektu).
Zrobienie słoika jest wtedy tak proste, jak kliknięcie „Zbuduj artefakt ...” w menu Budowa. Jako bonus możesz spakować wszystkie zależności w jeden słoik.
Przetestowano na IntelliJ IDEA 14 Ultimate.
źródło
Sprawdziłem kilka linków do rozwiązania, w końcu wykonałem poniższe kroki, aby to działało. Używam Gradle 2.9.
Wprowadź następujące zmiany w kompilacji, pliku gradle:
Wspomnij o wtyczce:
Podaj skrypt kompilacji:
Podaj klasę główną:
Utwórz fatjar:
Uruchom fatjar z / build / libs /:
źródło
Możesz użyć wtyczki SpringBoot:
Utwórz słoik
A następnie uruchom go
Uwaga: Twój projekt NIE musi być projektem SpringBoot, aby korzystać z tej wtyczki.
źródło