Czy istnieje sposób zmuszenia maven (2.0.9) do włączenia wszystkich zależności do jednego pliku jar?
Mam projekt kompilacji w jednym pliku jar. Chcę, aby klasy z zależności również zostały skopiowane do słoika.
Aktualizacja: Wiem, że nie mogę po prostu dołączyć pliku jar do pliku jar. Szukam sposobu na rozpakowanie słoików określonych jako zależności i spakowanie plików klas do mojego słoika.
Odpowiedzi:
Możesz to zrobić za pomocą wtyczki maven-assembly z deskryptorem „jar-with-dependencies”. Oto odpowiedni fragment z jednego z naszych pom.xml, który to robi:
źródło
attached
Celem jest przestarzała.single
Lubdirectory-single
celem powinno być preferowane zamiast.directory-single
jest teraz również przestarzałe.W przypadku Maven 2 właściwym sposobem jest skorzystanie z wtyczki Maven2 Assembly, która ma do tego celu wstępnie zdefiniowany plik deskryptora i który można po prostu użyć w wierszu poleceń:
Jeśli chcesz, aby ten jar był wykonywalny, po prostu dodaj główną klasę do uruchomienia w konfiguracji wtyczki:
Jeśli chcesz utworzyć że zespół jako część normalnego procesu kompilacji, należy powiązać jeden lub katalogów-pojedynczy cel (The
assembly
celem powinno być tylko uruchamiany z linii poleceń) do fazy cyklu życia (package
sens), coś takiego:Dostosuj
configuration
element do swoich potrzeb (na przykład z manifestem w formie mówionej).źródło
Jeśli chcesz wykonać wykonywalny plik jar, muszą one także ustawić klasę główną. Tak powinna być pełna konfiguracja.
źródło
<appendAssemblyId>false</appendAssemblyId>
wewnątrz<configuration>
tagu, aby wykluczyć sufiks „-jar-with-dependencies” w nazwie końcowej.Jest wtyczka cienia maven . Można go użyć do spakowania i zmiany nazw zależności (w celu pominięcia problemów z zależnościami w ścieżce klasy).
źródło
Możesz użyć nowo utworzonego słoika za pomocą
<classifier>
znacznika.źródło
Jeśli (podobnie jak ja) nie podoba ci się opisana powyżej metoda jar-with-dependencies , preferowanym przeze mnie rozwiązaniem jest po prostu zbudowanie projektu WAR, nawet jeśli budujesz tylko samodzielną aplikację Java:
Utwórz normalny projekt jar jar, który zbuduje plik jar (bez zależności).
Ponadto skonfiguruj projekt wojenny maven (z pustym plikiem src / main / webapp / WEB-INF / web.xml , co pozwoli uniknąć ostrzeżenia / błędu w kompilacji maven), który ma tylko twój projekt jar jako zależność i spraw, aby twój projekt jar był
<module>
pod twoim projektem wojennym. (Ten projekt wojenny jest tylko prostą sztuczką, aby owinąć wszystkie zależności pliku jar w plik zip.)Zbuduj projekt wojenny, aby utworzyć plik wojenny.
W kroku wdrażania po prostu zmień nazwę pliku .war na * .zip i rozpakuj go.
Powinieneś teraz mieć katalog lib (który możesz przenieść tam, gdzie chcesz) ze słoikiem i wszystkimi zależnościami potrzebnymi do uruchomienia aplikacji:
(Symbol wieloznaczny w ścieżce klasy działa w Javie 6 lub nowszej)
Myślę, że jest to zarówno łatwiejsze do skonfigurowania w maven (nie trzeba się bawić z wtyczką asemblera), a także daje wyraźniejszy widok struktury aplikacji (zobaczysz numery wersji wszystkich zależnych słoików w widoku prostym i unikaj zatykania wszystkiego w jednym pliku jar).
źródło
http://fiji.sc/Uber-JAR zapewnia doskonałe wyjaśnienie alternatyw:
źródło
META-INF/services
katalogu. Więcej informacji tutaj: maven.apache.org/plugins/maven-shade-plugin/examples/…źródło
Moje ostateczne rozwiązanie w Eclipse Luna i m2eclipse: Custom Classloader (pobierz i dodaj do swojego projektu, tylko 5 klas): http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org. eclipse.jdt.ui / jar% 20in% 20jar% 20loader / org / eclipse / jdt / internal / jarinjarloader / ; ten moduł ładujący jest najlepszy z jednego urządzenia ładującego klasy i bardzo szybki;
<project.mainClass>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</project.mainClass> <project.realMainClass>my.Class</project.realMainClass>
Edycja w JIJConstants „Rsrc-Class-Path” na „Class-Path”
mvn clean dependence: pakiet zależności kopiowania
jest tworzony jar z zależnościami w folderze lib za pomocą cienkiego modułu ładującego klasy
źródło
Odkładając Maven na bok, możesz umieścić biblioteki JAR w głównym słoiku, ale będziesz musiał użyć własnego modułu ładującego klasy.
Sprawdź ten projekt: tekst linku One-JAR
źródło
Ten post może być trochę stary, ale ostatnio miałem ten sam problem. Pierwsze rozwiązanie zaproponowane przez Johna Stauffera jest dobre, ale miałem pewne problemy, pracując tej wiosny. Słoiki zależności, których używam wiosną, mają niektóre pliki właściwości i deklarację schematów xml, które mają te same ścieżki i nazwy. Chociaż słoiki te pochodzą z tych samych wersji, jar-with-dependencies maven-goal nadpisywał plik tez ostatnim znalezionym plikiem.
W końcu aplikacja nie mogła się uruchomić, ponieważ słoiki wiosenne nie mogły znaleźć poprawnych plików właściwości. W tym przypadku rozwiązanie zaproponowane przez Ropa rozwiązało mój problem.
Od tego czasu istnieje już projekt Spring-Boot. Ma bardzo fajny sposób na poradzenie sobie z tym problemem, zapewniając cel maven, który przeciąża cel pakietu i zapewnia własny moduł ładujący klasy. Zobacz Przewodnik dotyczący wiosennych butów
źródło
Spójrz na tę odpowiedź:
Tworzę instalator, który działa jako plik Java JAR i musi rozpakować pliki WAR i JAR w odpowiednich miejscach w katalogu instalacyjnym. Wtyczka zależności może być używana w fazie pakietu z celem kopiowania i pobierze dowolny plik z repozytorium Maven (w tym pliki WAR) i zapisze je tam, gdzie będziesz ich potrzebować. Zmieniłem katalog wyjściowy na $ {project.build.directory} / klas, a następnie wynik jest taki, że normalne zadanie JAR zawiera moje pliki w porządku. Następnie mogę je wyodrębnić i zapisać w katalogu instalacyjnym.
źródło
Dzięki dodałem poniżej fragmentu w pliku POM.xml i problem MP rozwiązany i utwórz gruby plik jar zawierający wszystkie zależne słoiki.
źródło