System modułów platformy Java - Java Platform Module System
Java Platform Module system określa format dystrybucji kolekcji Java kodu i powiązanych zasobów. Określa również repozytorium do przechowywania tych kolekcji lub modułów oraz określa, w jaki sposób można je wykrywać, ładować i sprawdzać pod kątem integralności. Zawiera funkcje, takie jak przestrzenie nazw, w celu naprawienia niektórych niedociągnięć w istniejącym formacie JAR , zwłaszcza JAR Hell , który może prowadzić do problemów, takich jak problemy ze ścieżką klas i ładowaniem klas.
Java Module System był początkowo rozwijany w ramach Java Community Process jako JSR 277 i miał zostać wydany z Java 7.
JSR 277 później został wstrzymany, a Project Jigsaw został stworzony w celu modularyzacji JDK. Ten JSR został zastąpiony przez JSR 376 (Java Platform Module System).
Projekt Jigsaw był pierwotnie przeznaczony dla Javy 7 (2011), ale został odroczony do Java 8 (2014) jako część Planu B, a ponownie odroczony do wydania Java 9 w 2017 roku. Java 9, w tym Java Module System, została wydana 21 września, 2017.
Architektura
Java Module System zaimplementowany w Javie 9 zawiera następujące JEP i JSR (Żądanie specyfikacji Java) :
- JEP 200: Modułowy JDK: Zdefiniuj modułową strukturę JDK
- JEP 201: Modular Source Code: Reorganizuj kod źródłowy JDK na moduły, ulepszaj system kompilacji w celu kompilacji modułów i egzekwuj granice modułów w czasie kompilacji
- JEP 220: Modular Run-Time Images: Restrukturyzacja obrazów wykonawczych JDK i JRE, aby pomieścić moduły i poprawić wydajność, bezpieczeństwo i łatwość konserwacji
- JEP 261: System modułów: Implementuj system modułów platformy Java
- JEP 282: Java Linker: Utwórz narzędzie, które może łączyć i optymalizować zestaw modułów i ich zależności w niestandardowy obraz czasu wykonywania
- JSR 376: system modułów platformy Java
Dodatkowo dodano kilka innych funkcji JDK 9, aby ułatwić przejście do systemu modułów:
- JEP 238: Multi-Release JAR Files: Rozszerz format pliku JAR, aby umożliwić współistnienie wielu wersji plików klas specyficznych dla środowiska Java w jednym archiwum.
- JEP 253: Przygotuj JavaFX UI Controls i CSS APIs for Modularization: Zdefiniuj publiczne API dla funkcji JavaFX, które są obecnie dostępne tylko za pośrednictwem wewnętrznych API i stałyby się niedostępne z powodu modularyzacji.
- JEP 260: Hermetyzuj większość wewnętrznych API: Uczyń większość wewnętrznych API JDK niedostępnymi domyślnie, ale pozostaw kilka krytycznych, powszechnie używanych wewnętrznych API dostępnych, dopóki nie będzie obsługiwanych zamienników dla wszystkich lub większości ich funkcjonalności.
- JEP 275: Modułowe pakowanie aplikacji Java: Pakowacz Java będzie ewoluował dla JDK 9, uwrażliwiając go na moduły, umożliwiając na przykład pakowanie modułu i wszystkich modułów, od których on zależy.
Właściwości modułów
Moduły to nowy sposób grupowania kodu. W przeciwieństwie do plików Jar , moduły wyraźnie deklarują, od których modułów zależą i jakie pakiety eksportują. Jawne deklaracje zależności poprawiają integralność kodu, ułatwiając wnioskowanie o dużych aplikacjach i zależnościach między składnikami oprogramowania.
Na przykład poniższa deklaracja modułu deklaruje, że moduł com.foo.bar zależy od innego modułu com.foo.baz i eksportuje następujące pakiety: com.foo.bar.alpha i com.foo.bar.beta :
module com.foo.bar {
requires com.foo.baz;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
Publiczni członkowie pakietów com.foo.bar.alpha i com.foo.bar.beta będą dostępni przez zależne moduły. Prywatni członkowie są niedostępni nawet za pomocą takich środków jak odbicie , chociaż to, czy „nielegalny dostęp” jest de facto dozwolony, zależy od ustawienia wiersza poleceń.
W przeciwieństwie do formatu pliku Jar, moduł opisze te zależności w deklaracji modułu, która zostanie umieszczona w pliku o nazwie module-info.java w katalogu głównym hierarchii plików źródłowych modułu. JDK będzie w stanie zweryfikować zależności i interakcje między modułami zarówno w czasie kompilacji, jak i w czasie wykonywania. Sam JDK został zmodularyzowany w Javie 9 .
Powiązania z OSGi
Java Module System nie zamierza wspierać wszystkich funkcjonalności obsługiwanych obecnie przez platformę OSGi (np. model Life-Cycle i Services Registry). Jednak Java Module System będzie obsługiwać funkcje, które nie są obsługiwane przez OSGi, takie jak modułowość w czasie kompilacji i wbudowana obsługa bibliotek natywnych. W 2016 roku opublikowano kilka artykułów poświęconych współdziałaniu Java Module System i OSGi. Można je znaleźć na InfoQ oraz na blogu OSGi Alliance.