A Java 9 Platform Module System, röviden JPMS. A Java 9-ben vezették be a modulok kezelésére.
A modul nevét, függőségeit, láthatósági szabályait a module-info.java fájlban írjuk le.
Miket tartalmazhat egy modul?
Minden modul gyökérkönyvtárában lennie kell egy module-info.java fájlnak, például:
module com.example { requires javafx.controls; requires javafx.fxml; exports com.example.ui; opens com.example.controllers to javafx.fxml; }
Kulcsszó | Jelentés |
---|---|
module | A modul neve (pl. com.example) |
require | Függőség megadása |
require transitive | A függőséget a modulunkat használók is elérhetik |
exports | Egy csomagot más modulok számára elérhető tesz |
opens | Egy csomagot reflektív hozzáférésre nyit meg. |
opens … to | Egy csomagot célzottan egy adott modul számára nyit meg |
uses | A ServiceLoader1) által betöltött szolgáltatást jelez. |
provides … with | Egy interfészt és annak megvalósítását adja meg a ServiceLoader számára |
module com.example { requires java.sql; }
module com.example { requires transitive javafx.graphics; }
A com.example.api csomag látható más modulok számára.
module com.example { exports com.example.api; }
module com.example { opens com.example.model to com.google.gson; }
Ez azt jelenti, hogy a com.example.model csomagot csak a Gson könyvtár érheti el reflektíven, más modulok nem.
module com.example { provides com.example.MyService with com.example.impl.MyServiceImpl; }
Ez azt jelenti, hogy a com.example.impl.MyServiceImpl osztály az com.example.MyService interfész megvalósítása.
Ha egy másik modul ezt használni szeretné, így teheti meg:
module com.client { requires com.example; uses com.example.MyService; }
Ha egy nem moduláris (régi) JAR-t szeretnél használni, akkor:
Jellemző | Moduláris alkalmazás | Hagyományos alkalmazás |
---|---|---|
Modulok láthatóság | Csak exportált csomagok láthatók | Minden public látható |
Függőségek | A requires használatával szabályozott | Classpath alapján működik |
Egységbezárás | Jobban ellenőrizhető | Gyengébb láthatóság-kezelés |
Visszafelé kompatibilitás | Kezdeti nehézségek | Klasszikus Java mód |
Ha modulárisan programozunk, a modulunk neve lehet com.example, lan.zold, de nevezzük most egyszerűen „A” modulnak.
A module-info.java fájlban egy függőséget így jelölhetünk meg:
requires javafx.controls;
vagy:
requires javafx.fxml;
Legyen egy másik modul, nevezzük „B” modulnak, amely használja az „A” modult.
Ebben az esetben „B” nem fér hozzá javafx.controls és a javafx.fxml modulokhoz, mert azokat „A” csak saját használatra jelölte meg.
Most vizsgáljunk meg egy másik függőséget:
requires transitive javafx.graphics;
Mivel „A” modul ezt a függőséget tranzitív módon jelöli meg, a „B” modul is automatikusan hozzáfér javafx.graphics modulhoz, anélkül, hogy külön requires javafx.graphics; sort kellen írnia.