Tartalomjegyzék
A Java modulrendszer
- Szerző: Sallai András
- Copyright © 2025, Sallai András
- Licenc: CC BY-SA 4.0
- Web: https://szit.hu
Bevezetés
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.
Egy modul felépítése
Miket tartalmazhat egy modul?
- osztályok
- interfészek
- csomagok
- erőforrások
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; }
A module-info.java fő kulcsszavai
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 |
Egyszerű függőség
- modul-info.java
module com.example { requires java.sql; }
Tranzitív függőség
- modul-info.java
module com.example { requires transitive javafx.graphics; }
Csomagok exportálása
A com.example.api csomag látható más modulok számára.
- modul-info.java
module com.example { exports com.example.api; }
Reflektív hozzáférés biztosítása
- modul-info.java
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.
Modulok között szolgáltatás nyújtá (ServiceLoader)
- modul-info.java
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:
- modul-info.java
module com.client { requires com.example; uses com.example.MyService; }
Modulári és nem modulári könyvtárak használata
Ha egy nem moduláris (régi) JAR-t szeretnél használni, akkor:
- Az –add-modules kapcsolóval futtatáskor hozzá lehet adni a modulpath-hoz.
- Az Automatic-Module-Name attribútummal lehet segíteni a kompatibilitást.
Moduláris és nem moduláris alkalmazások közötti különbségek
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 |
Tranzitív függőség
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.