Czy można określić Java, classpath
która zawiera plik JAR zawarty w innym pliku JAR?
134
Jeśli próbujesz utworzyć pojedynczy jar zawierający twoją aplikację i wymagane biblioteki, istnieją dwa sposoby (o których wiem), aby to zrobić. Pierwszym z nich jest One-Jar , który używa specjalnego modułu ładującego klasy, aby umożliwić zagnieżdżanie słoików. Drugi to UberJar (lub Shade ), który eksploduje dołączone biblioteki i umieszcza wszystkie klasy w słoiku najwyższego poziomu.
Powinienem również wspomnieć, że UberJar i Shade to wtyczki odpowiednio dla Maven1 i Maven2. Jak wspomniano poniżej, możesz również użyć wtyczki assemblera (która w rzeczywistości jest znacznie potężniejsza, ale znacznie trudniejsza do poprawnej konfiguracji).
NIE chcesz używać tych rozwiązań „eksplodowania zawartości JAR”. Zdecydowanie utrudniają dostrzeżenie rzeczy (ponieważ wszystko eksploduje na tym samym poziomie). Ponadto mogą wystąpić konflikty nazw (nie powinno się zdarzyć, jeśli ludzie używają odpowiednich pakietów, ale nie zawsze możesz to kontrolować).
Funkcja, której potrzebujesz, to jeden z 25 najpopularniejszych Sun RFE : RFE 4648386 , który Sun, w swojej nieskończonej mądrości, określił jako mający niski priorytet. Możemy mieć tylko nadzieję, że słońce się obudzi ...
W międzyczasie najlepszym rozwiązaniem, z jakim się spotkałem (które chciałbym, aby Sun skopiował w JDK) jest użycie niestandardowego modułu ładującego klasy JarClassLoader .
źródło
activation.jar
).Po kilku badaniach znalazłem metodę, która nie wymaga mavena ani żadnego rozszerzenia / programu innej firmy.
Możesz użyć „Class-Path” w swoim pliku manifestu.
Na przykład:
Utwórz plik manifestu MANIFEST.MF
Skompiluj wszystkie swoje zajęcia i uruchom
jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar
c
oznacza tworzenie archiwumf
oznacza, że chcesz określić, że plikv
jest przeznaczony do pełnych danych wejściowych, com
oznacza, że przekażemy niestandardowy plik manifestuUpewnij się, że dołączyłeś lib do pakietu jar. Powinieneś być w stanie uruchomić słoik w normalny sposób.
na podstawie: http://www.ibm.com/developerworks/library/j-5things6/
wszystkie inne potrzebne informacje o ścieżce klasowej można znaleźć tutaj
źródło
custom_lib.jar
, słoika nie można jużUżyj znacznika zipgroupfileset (używa tych samych atrybutów co znacznik zestawu plików ); rozpakuje wszystkie pliki w katalogu i doda je do nowego pliku archiwum. Więcej informacji: http://ant.apache.org/manual/Tasks/zip.html
Jest to bardzo przydatny sposób na obejście problemu słoika w słoiku - wiem, ponieważ przeszukałem w Google to dokładne pytanie StackOverflow, próbując dowiedzieć się, co zrobić. Jeśli chcesz spakować słoik lub folder słoików do swojego jednego zbudowanego słoika z Antem, zapomnij o całej tej ścieżce klas lub wtyczkach innych firm, wszystko, co musisz zrobić, to (w Ant):
źródło
Jeśli budujesz z mrówką (używam mrówki z zaćmienia), możesz po prostu dodać dodatkowe pliki jar, mówiąc mrówce, aby je dodała ... Niekoniecznie najlepsza metoda, jeśli masz projekt obsługiwany przez wiele osób, ale działa dla jednej osoby projekt i jest łatwe.
na przykład moim celem, który budował plik .jar, był:
Właśnie dodałem jedną linię, aby to zrobić:
gdzie
był reż z zewnętrznymi słojami. I to wszystko...
źródło
Nie bez napisania własnego programu ładującego klasy. Możesz dodać słoiki do ścieżki klas słoika, ale muszą one znajdować się w tym samym miejscu, a nie znajdować się w głównym słoiku.
źródło
Aby to zrobić, musisz zbudować niestandardowy program ładujący klasy lub bibliotekę innej firmy, która to obsługuje. Najlepszym rozwiązaniem jest wyodrębnienie słoika ze środowiska wykonawczego i dodanie go do ścieżki klas (lub dodanie ich do ścieżki klas).
źródło
Używam mavena do moich kompilacji java, które mają wtyczkę zwaną wtyczką zespołu maven .
Robi to, o co prosisz, ale tak jak opisują niektóre inne sugestie - zasadniczo eksploduje wszystkie zależne słoiki i ponownie łączy je w jeden słoik
źródło
Jeśli masz środowisko eclpise IDE, wystarczy wyeksportować plik JAR i wybrać opcję „Biblioteki wymagane w pakiecie do wygenerowanego pliku JAR”. eclipse automatycznie doda wymagane zależne pliki JAR do wygenerowanego pliku JAR, a także wygeneruje program ładujący niestandardową klasę eclipse, który automatycznie ładuje te pliki JAR.
źródło
Miałem właśnie poradzić, aby wyodrębnić wszystkie pliki na tym samym poziomie, a następnie zrobić z wyniku jar, ponieważ system pakietów powinien je starannie oddzielić. To byłby sposób ręczny, przypuszczam, że narzędzia wskazane przez Steve'a dobrze to zrobią.
źródło
Winstone jest całkiem niezły http://blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/ . Ale nie w przypadku złożonych witryn. A szkoda, ponieważ wystarczy dołączyć wtyczkę.
źródło
Cóż, jeśli używasz Eclipse, istnieje bardzo łatwy sposób.
Wyeksportuj swój projekt jako „Runnable” plik Jar (kliknij prawym przyciskiem myszy folder projektu w Eclipse, wybierz „Eksportuj ...”). Podczas konfigurowania ustawień eksportu pamiętaj o zaznaczeniu opcji „Wyodrębnij wymagane biblioteki do wygenerowanego Jar”. Pamiętaj, wybierz „Wyodrębnij ...”, a nie „Spakuj wymagane biblioteki ...”.
Dodatkowo : w ustawieniach eksportu należy wybrać konfigurację uruchamiania. Tak więc zawsze możesz utworzyć pustą funkcję main () w jakiejś klasie i użyć jej do konfiguracji uruchamiania.
W każdym razie nie ma gwarancji , że będzie działać przez 100% czasu - ponieważ zauważysz wyskakujący komunikat z informacją, aby sprawdzić licencje plików Jar, które dołączasz, i coś o nie kopiowaniu plików podpisów. Jednak robię to od lat i nigdy nie napotkałem problemu.
źródło
Rozpakowywanie do katalogu Uber działa dla mnie, ponieważ wszyscy powinniśmy używać root: \ java i mieć kod gniazd w pakietach z wersjonowaniem. To znaczy ca.tecreations-1.0.0. Podpisywanie jest w porządku, ponieważ słoiki są nienaruszone z miejsca ich pobrania. Podpisy osób trzecich nienaruszone, rozpakuj do c: \ java. Oto mój projekt reż. uruchomić z programu uruchamiającego, więc java -cp c: \ java Launcher
źródło