Java Platform Module System - Java Platform Module System
Den Java Platform Module System angiver en fordeling format til samlinger af Java -kode og tilhørende ressourcer. Det specificerer også et lager til lagring af disse samlinger eller moduler og identificerer, hvordan de kan opdages, indlæses og kontrolleres for integritet. Det inkluderer funktioner såsom navneområder med det formål at rette nogle af manglerne i det eksisterende JAR- format, især JAR-helvede , hvilket kan føre til problemer såsom klassesti og klasseindlæsningsproblemer.
Java-modulsystemet blev oprindeligt udviklet under Java Community Process som JSR 277 og var planlagt til at blive frigivet med Java 7.
JSR 277 blev senere sat på hold, og Project Jigsaw blev oprettet for at modulere JDK. Denne JSR blev afløst af JSR 376 (Java Platform Module System).
Project Jigsaw var oprindeligt beregnet til Java 7 (2011), men blev udskudt til Java 8 (2014) som en del af Plan B, og udsat igen til en Java 9- udgivelse i 2017. Java 9 inklusive Java Module System blev frigivet den 21. september, 2017.
Arkitektur
Java-modulsystemet implementeret i Java 9 inkluderer følgende JEP'er og JSR (Java Specification Request) :
- JEP 200: Modular JDK: Definer en modulstruktur for JDK
- JEP 201: Modulær kildekode: Omorganiser JDK-kildekoden i moduler, forbedr build-systemet til at kompilere moduler og håndhæv modulgrænser ved byggetid
- JEP 220: Modulære kørselstidsbilleder: Omstrukturer JDK- og JRE-kørselsbillederne, så de passer til moduler og forbedrer ydeevne, sikkerhed og vedligeholdelsesevne
- JEP 261: Modulsystem: Implementer Java Platform Module System
- JEP 282: Java Linker: Opret et værktøj, der kan samle og optimere et sæt moduler og deres afhængigheder til et brugerdefineret kørselstidsbillede
- JSR 376: Java Platform Module System
Derudover er flere andre JDK 9-funktioner blevet tilføjet for at lette overgangen til modulsystemet:
- JEP 238: JAR-filer med flere udgivelser: Udvid JAR-filformatet, så flere Java-frigivelsesspecifikke versioner af klassefiler kan eksistere sammen i et enkelt arkiv.
- JEP 253: Forbered JavaFX UI-kontroller og CSS API'er til modularisering: Definer offentlige API'er til JavaFX-funktionaliteterne, der i øjeblikket kun er tilgængelige via interne API'er og ville blive utilgængelige på grund af modularisering.
- JEP 260: Indkapsling af de fleste interne API'er: Gør det meste af JDKs interne API'er utilgængelige som standard, men lad et par kritiske, udbredte interne API'er være tilgængelige, indtil der findes understøttede erstatninger for hele eller det meste af deres funktionalitet.
- JEP 275: Modulær Java-applikationspakning: Java-pakkeren vil udvikle sig til JDK 9 og gøre den opmærksom på moduler, hvilket f.eks. Tillader at pakke et modul og alle de moduler, det afhænger af.
Egenskaber for moduler
Moduler er en ny måde at gruppere kode på. I modsætning til Jar-filer erklærer moduler eksplicit, hvilke moduler de er afhængige af, og hvilke pakker de eksporterer. Eksplicitte afhængighedserklæringer forbedrer kodens integritet ved at gøre det lettere at ræsonnere om store applikationer og afhængigheden mellem softwarekomponenter.
For eksempel erklærer følgende modulerklæring , at modulet com.foo.bar afhænger af et andet com.foo.baz- modul, og eksporterer følgende pakker: com.foo.bar.alpha og com.foo.bar.beta :
module com.foo.bar {
requires com.foo.baz;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
De offentlige medlemmer af com.foo.bar.alpha- og com.foo.bar.beta- pakkerne vil være tilgængelige via afhængige moduler. Private medlemmer er utilgængelige, selv på en måde som refleksion , selv om 'ulovlig adgang' de facto er tilladt afhænger af en kommandolinieindstilling.
I modsætning til Jar-filformatet beskriver modulet disse afhængigheder i en modulerklæring , som placeres i en fil med navnet module-info.java i roden af modulets kildefilhierarki. JDK vil være i stand til at kontrollere afhængigheder og interaktioner mellem moduler både på kompileringstid og runtime. JDK selv er blevet moduleret i Java 9 .
Links til OSGi
Java-modulsystemet har ikke til hensigt at understøtte alle de funktioner, som OSGi- platformen i øjeblikket understøtter (for eksempel Life-Cycle-modellen og Services Registry). Java-modulsystemet understøtter dog funktioner, der ikke understøttes af OSGi, såsom modularitet ved kompileringstid og indbygget support til indfødte biblioteker. Et par artikler, der udforsker, hvordan Java Module System og OSGi kunne fungere sammen, blev offentliggjort i 2016. Disse kan findes på InfoQ og også OSGi Alliance Blog.