Więc od wczorajszego ranka nie miałem pojęcia, czym w ogóle był OSGi. OSGi było tylko modnym hasłem, które ciągle pojawiało się w kółko, więc w końcu poświęciłem trochę czasu, aby to odświeżyć.
Właściwie wydaje się to całkiem fajne, więc chciałbym zacząć od stwierdzenia (dla porządku), że pod żadnym względem nie jestem przeciwny OSGi, ani nie jest to jakieś pytanie o "walenie w OSGi".
Ostatecznie wydaje się, że OSGi - w zasadzie - zajęło się JSR 277 w Java Modularity, które uznało, że istnieją niedociągnięcia w JAR
specyfikacji pliku, które mogą prowadzić do rozwiązywania przestrzeni nazw i problemów z ładowaniem klas w niektórych przypadkach narożnych. OSGi robi również wiele innych naprawdę fajnych rzeczy, ale z tego, co mogę stwierdzić, to jego największa atrakcja (lub jedna z nich).
Dla mnie - jako całkiem nowego (od kilku lat) programisty Java EE, jest absolutnie zadziwiające, że jesteśmy w roku 2011 i obecnie żyjemy w erze Java 7 i że te problemy z ładowaniem klas są nadal obecne; szczególnie w środowiskach korporacyjnych, gdzie jeden serwer aplikacji może mieć setki plików JAR, przy czym wiele z nich zależy od różnych wersji i wszystkie działają (mniej więcej) jednocześnie.
Moje pytanie:
Tak jak jestem zainteresowany OSGi i chociaż chcę zacząć się o nim uczyć, aby zobaczyć, gdzie / czy może być przydatny w moich projektach, po prostu nie mam czasu, aby usiąść i nauczyć się czegoś tak dużego, przynajmniej teraz.
Co więc mają zrobić programiści spoza OSGi, gdy pojawią się te problemy? Jakie rozwiązania Java (Oracle / Sun / JCP) są obecnie dostępne? Dlaczego wyrzynarka została wycięta z J7? Na ile pewna jest społeczność, że Jigsaw zostanie wdrożony w przyszłym roku w J8? Czy można uzyskać Jigsaw do swojego projektu, mimo że nie jest on jeszcze częścią platformy Java?
Myślę, że to o co tutaj pytam to połączenie paniki, intrygi i facepalm. Teraz, kiedy w końcu rozumiem, czym jest OSGi, po prostu nie rozumiem, jak coś takiego jak Jigsaw zajęło ponad 20 lat, zanim doszło do skutku, a potem jak można to było powstrzymać po premierze. Wydaje się to po prostu fundamentalne.
Jako programista jestem również ciekawy, jakie są moje rozwiązania bez OSGi.
Również Uwaga : Wiem, że to nie jest „ programowanie czysty ” -type pytanie, ale zanim niektórzy z was wasze nosy odkształcone, chciałem stanu (ponownie, do dokumentacji), że celowo umieścić na to pytanie WIĘC. To dlatego, że mam tylko najwyższy szacunek dla moich kolegów SO-ów i szukam odpowiedzi na poziomie architektonicznym od niektórych „bogów IT”, których czają się tu każdego dnia.
Ale dla tych z Was, którzy absolutnie nalegają, aby pytanie SO było poparte jakimś segmentem kodu:
int x = 9;
(Dziękuję każdemu, kto może się zastanowić nad tym OSGi / Jigsaw / classloader / namespace / JAR piekło!)
źródło
Odpowiedzi:
Najpierw zrozum, że podstawowym przypadkiem użycia Jigsaw jest modularyzacja samego środowiska JRE. Drugorzędnym celem będzie oferowanie systemu modułowego, który może być używany przez inne biblioteki i aplikacje Java.
Moje stanowisko jest takie, że coś takiego jak Jigsaw jest prawdopodobnie potrzebne tylko dla środowiska JRE, ale spowoduje znacznie więcej problemów, niż twierdzi, że je rozwiązuje, jeśli jest używane przez inne biblioteki lub aplikacje Java.
Środowisko JRE to bardzo trudny i szczególny przypadek. Ma ponad 12 lat i jest przerażającym bałaganem, podziurawionym cyklami zależności i bezsensownymi zależnościami. Jednocześnie jest używany przez około 9 milionów programistów i prawdopodobnie miliardy działających systemów. Dlatego absolutnie nie można refaktoryzować środowiska JRE, jeśli taka refaktoryzacja powoduje istotne zmiany.
OSGi to system modułowy, który pomaga (a nawet zmusza do) tworzenia oprogramowania, które jest modułowe. Nie można po prostu dodać modułowości do istniejącej niemodularnej bazy kodu. Przekształcenie niemodularnej bazy kodu w modularną nieuchronnie wymaga pewnych refaktoryzacji: przeniesienia klas do odpowiedniego pakietu, zastąpienia bezpośredniego tworzenia instancji usługami odsprzęgniętymi i tak dalej.
To sprawia, że trudno jest zastosować OSGi bezpośrednio w bazie kodu JRE, ale nadal istnieje wymóg podzielenia środowiska JRE na oddzielne części lub „moduły”, aby można było dostarczyć okrojone wersje JRE.
Dlatego uważam Jigsawa za rodzaj „ ekstremalnego środka ”, który ma utrzymać kod JRE przy życiu podczas dzielenia go. Czyni nie kod pomocy, aby stać się bardziej modularny, a jestem przekonany, że będzie to rzeczywiście zwiększyć utrzymanie wymaganej ewoluować żadnej biblioteki lub aplikację, która go używa.
Wreszcie: OSGi istnieje, podczas gdy Jigsaw jeszcze nie istnieje i może nigdy nie istnieć. Społeczność OSGi ma 12 lat doświadczenia w tworzeniu aplikacji modułowych. Jeśli jesteś poważnie zainteresowany tworzeniem aplikacji modułowych, OSGi jest jedyną grą w mieście.
źródło
To proste, jeśli chcesz dziś tworzyć prawdziwe komponenty w Javie, to OSGi jest jedyną grą w mieście.
Moim zdaniem Jigsaw to połączenie kompromisu tego, co jest do zrobienia w JDK i wcześniejszych złych relacji między SUNem a gośćmi z OSGi. Może będzie dostarczany z Javą 8, ale musimy poczekać i zobaczyć.
OSGi nie jest panaceum, jeśli pracujesz w typowym środowisku korporacyjnym i będziesz musiał zapoznać się z działaniem ładowania klas, ponieważ wiele dobrze znanych bibliotek (patrząc na ciebie, Hibernate) przyjęło założenia dotyczące widoczności klas, które są już nieaktualne wewnątrz OSGi.
Lubię OSGi, ale nie próbowałbym go modernizować do istniejącego systemu. Rozważyłbym również zalety i wady w kontekście rozwoju greenfield - poleciłbym przyjrzeć się produktom Apache lub Eclipse, które upraszczają życie OSGi, a nie robić tego samemu.
Jeśli nie robisz OSGi, to masz pecha, jeśli wymyśliłeś system, który ma zależności od różnych wersji tej samej biblioteki - wszystko, co możesz zrobić, to spróbować uniknąć problemu, chociaż potrzebujesz wielu wersji Biblioteka wydaje mi się „zapachem” architektury.
źródło
Uwielbiam, gdy do opisania obecnej sytuacji używasz wyrażenia „przypadki narożne”.
W każdym razie od wielu lat interesują mnie narzędzia i techniki, które wspierają tworzenie, a nawet lepiej egzekwują kod, który jest czystszy, bardziej odsprzężony, spójniejszy i łatwiejszy w utrzymaniu niż to, co prawdopodobnie byłoby wynikiem bez nich. Test Driven Design i Junit to takie połączenie.
Po kilku miesiącach przenoszenia znacznej części naszego kodu do OSGi, powiedziałbym, że OSGi jest jeszcze lepszym narzędziem pod tym względem. I to jest naprawdę wystarczający powód, aby przejść do OSGi. Na dłuższą metę pozwoli Ci to zaoszczędzić sporo pieniędzy.
A jako bonus da ci szansę zrobienia wielu fajnych rzeczy. Wyobraź sobie, że podczas demonstracji bezproblemowo uaktualniasz moduł uwierzytelniania, bez utraty ruchu, do obsługi OAuth ... nagle znowu tworzy się radość!
źródło