Java Platform Module System - Java Platform Module System
Den Java Platform Module System angir en distribusjonsformat for samlinger av Java -kode og tilhørende ressurser. Det spesifiserer også et lager for lagring av disse samlingene, eller modulene , og identifiserer hvordan de kan oppdages, lastes inn og kontrolleres for integritet. Den inkluderer funksjoner som navneplasser med sikte på å fikse noen av manglene i det eksisterende JAR- formatet, spesielt JAR-helvete , noe som kan føre til problemer som problemer med klassesti og klasseinnlasting.
Java-modulsystemet ble opprinnelig utviklet under Java Community Process som JSR 277 og var planlagt å bli utgitt med Java 7.
JSR 277 ble senere satt på vent og Project Jigsaw ble opprettet for å modulere JDK. Denne JSR ble erstattet av JSR 376 (Java Platform Module System).
Project Jigsaw var opprinnelig beregnet på Java 7 (2011), men ble utsatt til Java 8 (2014) som en del av Plan B, og utsatt igjen til en Java 9- utgivelse i 2017. Java 9 inkludert Java Module System ble utgitt 21. september, 2017.
Arkitektur
Java-modulsystemet implementert 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: Omorganisere JDK-kildekoden i moduler, forbedre byggesystemet for å kompilere moduler og håndheve modulgrenser ved byggetid
- JEP 220: Modular Run-Time Images: Restrukturere JDK- og JRE-kjøretidene for å imøtekomme moduler og for å forbedre ytelse, sikkerhet og vedlikeholdsevne
- JEP 261: Modulesystem: Implementer Java Platform Module System
- JEP 282: Java Linker: Lag et verktøy som kan sette sammen og optimalisere et sett med moduler og deres avhengigheter til et tilpasset kjøretidsbilde
- JSR 376: Java Platform Module System
I tillegg har flere andre JDK 9-funksjoner blitt lagt til for å lette overgangen til modulsystemet:
- JEP 238: JAR-filer med flere utgivelser: Utvid JAR-filformatet for å tillate at flere, Java-utgivelsesspesifikke versjoner av klassefiler eksisterer sammen i ett arkiv.
- JEP 253: Forbered JavaFX UI-kontroller og CSS API-er for modulering: Definer offentlige API-er for JavaFX-funksjonalitetene som for tiden bare er tilgjengelige via interne API-er og som vil bli utilgjengelige på grunn av modularisering.
- JEP 260: Innkapsling av de fleste interne API-ene: Gjør mest mulig ut av JDKs interne API-er utilgjengelige som standard, men la noen få kritiske, mye brukte interne API-er være tilgjengelige, til det finnes støttede erstatninger for hele eller det meste av funksjonaliteten.
- JEP 275: Modulær Java-applikasjonspakking: Java-pakkeren vil utvikle seg for JDK 9, og gjøre den oppmerksom på moduler, slik at den for eksempel kan pakke en modul og alle modulene den er avhengig av.
Egenskaper til moduler
Moduler er en ny måte å gruppere kode på. I motsetning til Jar-filer , erklærer modulene eksplisitt hvilke moduler de er avhengige av, og hvilke pakker de eksporterer. Eksplisitte avhengighetserklæringer forbedrer kodens integritet ved å gjøre det lettere å resonnere om store applikasjoner og avhengighetene mellom programvarekomponenter.
For eksempel erklærer følgende modulerklæring at modulen com.foo.bar er avhengig av en annen 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 medlemmene av pakkene com.foo.bar.alpha og com.foo.bar.beta vil være tilgjengelige av avhengige moduler. Private medlemmer er utilgjengelige selv gjennom et middel som refleksjon , men om 'ulovlig tilgang' de facto er tillatt, avhenger av en kommandolinjeinnstilling.
I motsetning til Jar-filformatet, vil modulen beskrive disse avhengighetene i en modulerklæring som vil bli plassert i en fil som heter module-info.java ved roten til modulens kildefilhierarki. JDK vil kunne verifisere avhengigheter og interaksjoner mellom moduler både på kompileringstid og kjøretid. Selve JDK har blitt modulert i Java 9 .
Koblinger til OSGi
Java-modulsystemet har ikke til hensikt å støtte alle funksjonene som OSGi- plattformen for øyeblikket støtter (for eksempel Life-Cycle-modellen og Services Registry). Java-modulsystemet støtter imidlertid funksjoner som ikke støttes av OSGi, for eksempel modularitet ved kompileringstid, og innebygd støtte for innfødte biblioteker. Et par artikler som utforsker hvordan Java Module System og OSGi kunne fungere sammen, ble publisert i 2016. Disse finnes på InfoQ og også OSGi Alliance Blog.