Java Platform Module System - Java Platform Module System

Den Java Platform Module System anger ett distributionsformat för samlingar av Java -kod och tillhörande resurser. Det specificerar också ett arkiv för lagring av dessa samlingar eller moduler och identifierar hur de kan upptäckas, laddas och kontrolleras för integritet. Den innehåller funktioner som namnområden i syfte att åtgärda några av bristerna i det befintliga JAR- formatet, särskilt JAR-helvetet , vilket kan leda till problem som klassstig och klassladdningsproblem.

Java-modulsystemet utvecklades ursprungligen under Java Community Process som JSR 277 och planerades att släppas med Java 7.

JSR 277 sattes senare i vänteläge och Project Jigsaw skapades för att modulera JDK. Denna JSR ersattes av JSR 376 (Java Platform Module System).

Project Jigsaw var ursprungligen avsedd för Java 7 (2011) men sköts upp till Java 8 (2014) som en del av Plan B, och uppskattades återigen till en Java 9- release 2017. Java 9 inklusive Java Module System släpptes den 21 september, 2017.

Arkitektur

Java-modulsystemet implementerat i Java 9 innehåller följande JEP: er och JSR (Java Specification Request) :

  • JEP 200: Modular JDK: Definiera en modulstruktur för JDK
  • JEP 201: Modulär källkod: Omorganisera JDK-källkoden i moduler, förbättra byggsystemet för att kompilera moduler och genomdriva modulgränser vid byggtiden
  • JEP 220: Modulära körtidsbilder: Omstrukturera JDK- och JRE-körtidsbilder för att rymma moduler och för att förbättra prestanda, säkerhet och underhållsbarhet
  • JEP 261: Modulsystem: Implementera Java Platform Module System
  • JEP 282: Java Linker: Skapa ett verktyg som kan montera och optimera en uppsättning moduler och deras beroenden till en anpassad körtidsbild
  • JSR 376: Java Platform Module System

Dessutom har flera andra JDK 9-funktioner lagts till för att underlätta övergången till modulsystemet:

  • JEP 238: JAR-filer med flera versioner: Utöka JAR-filformatet så att flera Java-release-specifika versioner av klassfiler kan samexistera i ett enda arkiv.
  • JEP 253: Förbered JavaFX UI-kontroller och CSS-API: er för modulering: Definiera offentliga API: er för JavaFX-funktionerna som för närvarande endast är tillgängliga via interna API: er och skulle bli oåtkomliga på grund av modularisering.
  • JEP 260: Inkapsla de flesta interna API: erna: Gör det mesta av JDK: s interna API: er tillgängliga som standard men lämna några kritiska, allmänt använda interna API: er tillgängliga, tills ersättningar som stöds finns för alla eller de flesta av deras funktioner.
  • JEP 275: Modulär Java-applikationsförpackning: Java-paketeraren kommer att utvecklas för JDK 9, vilket gör den medveten om moduler, vilket till exempel tillåter att paketera en modul och alla moduler den är beroende av.

Egenskaper hos moduler

Moduler är ett nytt sätt att gruppera kod. I motsats till Jar-filer förklarar moduler uttryckligen vilka moduler de är beroende av och vilka paket de exporterar. Explicita beroendedeklarationer förbättrar kodens integritet genom att göra det lättare att resonera om stora applikationer och beroendet mellan mjukvarukomponenter.

Följande moduldeklaration förklarar till exempel att modulen com.foo.bar beror på en annan com.foo.baz- modul och exporterar följande paket: com.foo.bar.alpha och com.foo.bar.beta :

module com.foo.bar {
    requires com.foo.baz;
    exports com.foo.bar.alpha;
    exports com.foo.bar.beta;
}

De offentliga medlemmarna i paketen com.foo.bar.alpha och com.foo.bar.beta kommer att vara tillgängliga med beroende moduler. Privata medlemmar är oåtkomliga även på ett sätt som reflektion , men huruvida "olaglig åtkomst" de facto är tillåten beror på en inställning på kommandoraden.

I motsats till Jar-filformatet kommer modulen att beskriva dessa beroenden i en moduldeklaration som kommer att placeras i en fil med namnet module-info.java vid roten till modulens källfilshierarki. JDK kommer att kunna verifiera beroenden och interaktioner mellan moduler både vid sammanställningstid och körtid. JDK själv har modulerats i Java 9 .

Länkar till OSGi

Java-modulsystemet har inte för avsikt att stödja alla funktioner som OSGi- plattformen för närvarande stöder (till exempel Life-Cycle-modellen och Services Registry). Java-modulsystemet stöder dock funktioner som inte stöds av OSGi, såsom modulering vid kompileringstid och inbyggt stöd för inbyggda bibliotek. Ett par artiklar som utforskar hur Java Module System och OSGi kan samverka publicerades 2016. Dessa finns på InfoQ och även OSGi Alliance Blog.

Se även

Referenser

externa länkar