Co to jest słoik Uber?

251

Czytam dokumentację Maven i natknąłem się na nazwę „uber-jar”.

Co oznacza Uber-Jar i jakie są jego cechy / zalety?

Ashay Batwal
źródło
14
Innym terminem określającym „słoik uber” lub „super słoik” jest „słoik tłuszczu”. Zobacz stackoverflow.com/questions/19150811/... .
erwaman
Od czasu do czasu widziałem też, że nazywa się to „onejar” lub „one-jar”.
Jeen Broekstra,

Odpowiedzi:

357

Überto niemieckie słowo oznaczające abovelub over(w rzeczywistości jest podobne do angielskiego over).

Dlatego w tym kontekście słoik-uber jest „słoikiem”, o jeden poziom wyżej od prostego pliku JAR (a) , zdefiniowanego jako taki, który zawiera zarówno pakiet, jak i wszystkie jego zależności w jednym pliku JAR. Nazwa może pochodzić od tej samej stajni co ultrageek, superman, hiperprzestrzeń i metadane, które wszystkie mają podobne znaczenie „poza normą”.

Zaletą jest to, że możesz dystrybuować swój słoik uber-jar i zupełnie nie dbać o to, czy zależności są instalowane w miejscu docelowym, ponieważ uber-jar faktycznie nie ma żadnych zależności.

Wszystkie zależności twoich własnych rzeczy w słoiku uber są również w tym słoju. Podobnie jak wszystkie zależności tych zależności. I tak dalej.


(a) Prawdopodobnie nie powinienem wyjaśniać programistom Java, czym jest plik JAR, ale podam go w celu uzupełnienia. Jest to archiwum Java, w zasadzie pojedynczy plik, który zazwyczaj zawiera wiele plików klasy Java wraz z powiązanymi metadanymi i zasobami.

paxdiablo
źródło
Dziwne ... Jestem Niemcem i oczywiście znam słowo „über” i jego znaczenie. Ale dlaczego jest tu używany w kontekście Maven? Ten przypadek oznacza, że ​​jedna lub więcej rzeczy jest zebranych razem i jest dostępny przez wygenerowany słoik. Niestety ta podpowiedź nie przesłoniła mojego problemu z maven ;-)
Bjoern
7
BTW, überi oversą wynikiem systematycznego przesunięcia wokalnego w starych germańskich, które mogą być również obserwowane w tych par słów: geben/give, leben/live, haben/have, heben/heavei wiele innych.
biziclop
Bardzo mądry opis: Przykładowy link
Veniamin
Biorąc pod uwagę, jak wiele żalu odczuwałem próbując edukować ludzi, postanowiłem po prostu usunąć rzeczy, na które niektórzy wciąż narzekają. Nadal definiuję Ubera w kontekście języka niemieckiego, ale lekcja historii (nieco pełna) już minęła :-)
paxdiablo
58

słoik Ubar jest również znany jako słoik tłuszczu, tj. słoik z zależnościami.
Istnieją trzy popularne metody konstruowania słoika Uber:

  1. Bez cieniowania: rozpakuj wszystkie pliki JAR, a następnie ponownie je zapakuj w jeden plik JAR. Działa z domyślnym modułem ładującym klasy Java. Narzędzia maven-assembly-plugin
  2. Zacieniowany: Taki sam jak bezcieniowany, ale zmień nazwę (tzn. „Cień”) wszystkich pakietów wszystkich zależności. Działa z domyślnym modułem ładującym klasy Java. Unika niektórych (nie wszystkich) konfliktów wersji zależności. Narzędzia maven-shadow-plugin
  3. JAR z JAR: Ostateczny plik JAR zawiera inne pliki JAR osadzone w nim. Unika kolizji wersji zależności. Wszystkie pliki zasobów są zachowane. Narzędzia: Eksporter plików JAR Eclipse

po więcej

Premraj
źródło
57

Definicja Paxdiablo jest naprawdę dobra.

Ponadto rozważ dostarczenie słoika do uber-jar jest czasem dość interesujące, jeśli naprawdę chcesz rozpowszechniać oprogramowanie i nie chcesz, aby klient musiał sam pobierać zależności. Wadą tego jest fakt, że jeśli ich własne zasady nie zezwalają na korzystanie z niektórych bibliotek lub jeśli muszą powiązać niektóre dodatkowe komponenty (slf4j, biblioteki lib zgodne z systemem, biblioteki arch specialiez, ...) prawdopodobnie zwiększy to ich trudności .

Możesz to zrobić:

Czystszym rozwiązaniem jest oddzielne udostępnienie swojej biblioteki; maven-shadow-plugin ma wstępnie skonfigurowany deskryptor. Nie jest to bardziej skomplikowane (z maven i jego wtyczką).

Wreszcie, naprawdę dobrym rozwiązaniem jest użycie pakietu OSGI. Jest na to mnóstwo dobrych samouczków :)

W celu dalszej konfiguracji zapoznaj się z tymi tematami:

Jean-Rémy Revy
źródło
4

Samodzielne, wykonywalne archiwum Java. W przypadku uberjars WildFly Swarm jest to pojedynczy plik .jar zawierający twoją aplikację, części WildFly wymagane do jej obsługi, wewnętrzne repozytorium zależności Maven oraz shim, aby wszystko uruchomić. Zobacz

Rasheed
źródło
0

Różne nazwy to tylko sposoby pakowania aplikacji Java.

Chudy - zawiera TYLKO bity, które dosłownie wpisujesz w edytorze kodu, i NIC NIE.

Cienki - zawiera wszystkie powyższe PLUS bezpośrednie zależności aplikacji od aplikacji (sterowniki db, biblioteki narzędzi itp.).

Hollow - odwrotność cienkich - zawiera tylko bity potrzebne do uruchomienia aplikacji, ale NIE zawiera samej aplikacji. Zasadniczo wstępnie zapakowany „serwer aplikacji”, na którym można później wdrożyć aplikację, w tym samym stylu co tradycyjne serwery aplikacji Java EE, ale z istotnymi różnicami.

Tłuszcz / Uber - zawiera fragment, który dosłownie sam piszesz PLUS bezpośrednie zależności aplikacji PLUS bity potrzebne do uruchomienia aplikacji „na własną rękę”.

Źródło: artykuł Dzone

Wizualna reprezentacja typów JAR

Przesłane z: https://stackoverflow.com/a/57592130/9470346

Mark Han
źródło