Java-Modul-Grundlagen
Einführung in Java-Module
Java-Module, die in Java 9 eingeführt wurden, stellen einen grundlegenden Wandel in Java's Vorgehensweise bei der Verwaltung von Abhängigkeiten und der Verbesserung der Kapselung dar. Sie bieten eine strukturiertere Möglichkeit, den Zugriff zwischen verschiedenen Teilen einer Anwendung zu organisieren und zu steuern.
Kernkonzepte von Java-Modulen
Was ist ein Java-Modul?
Ein Java-Modul ist eine benannte, selbstbeschreibende Sammlung von Code und Daten. Es deklariert explizit:
- Welchen Code es enthält
- Auf welchen externen Code es angewiesen ist
- Welchen Code es anderen Modulen zur Verfügung stellt
Wichtige Modulmerkmale
Merkmal |
Beschreibung |
Explizite Abhängigkeiten |
Module müssen ihre Abhängigkeiten deklarieren |
Starke Kapselung |
Kontrollierte Sichtbarkeit interner Pakete |
Verbesserte Leistung |
Bessere Laufzeitoptimierung |
Moduldeklaration
Ein Modul wird durch eine spezielle module-info.java
-Datei definiert, die sich im Root-Verzeichnis des Moduls befindet:
module com.example.mymodule {
// Module directives go here
requires java.base; // Implicit requirement
requires java.sql; // Explicit dependency
exports com.example.api; // Packages visible to other modules
exports com.example.services to com.example.client; // Restricted exports
}
Modultypen
graph TD
A[Module Types] --> B[Named Modules]
A --> C[Automatic Modules]
A --> D[Unnamed Modules]
B --> B1[Explicitly defined with module-info.java]
C --> C1[Derived from classpath JARs]
D --> D1[Legacy code without module information]
Benannte Module
- Explicit mit einer
module-info.java
definiert
- Vollständige Kontrolle über Abhängigkeiten und Exporte
Automatische Module
- Aus vorhandenen JAR-Dateien auf dem Klassenpfad erstellt
- Automatisch einen Modulnamen basierend auf dem JAR-Dateinamen zugewiesen
Unbenannte Module
- Repräsentieren Legacy-Code oder auf dem Klassenpfad basierende Anwendungen
- Bieten Abwärtskompatibilität
Vorteile von Java-Modulen
- Bessere Kapselung
- Explizite Abhängigkeiten
- Verbesserte Sicherheit
- Verbesserte Leistung
- Klarere Codeorganisation
Praktisches Beispiel
Hier ist eine einfache Modulstruktur für ein LabEx-Projekt:
// module-info.java in src directory
module com.labex.moduleexample {
requires java.base;
requires java.logging;
exports com.labex.core.api;
exports com.labex.core.services;
}
Kompilieren und Ausführen von Modulen
Unter Ubuntu 22.04 können Sie Module wie folgt kompilieren und ausführen:
## Compile modules
javac -d mods --module-source-path src $(find src -name "*.java")
## Run a specific module
java --module-path mods -m com.labex.moduleexample/com.labex.core.Main
Häufige Herausforderungen
- Migration bestehender Projekte zu Modulen
- Verwaltung komplexer Abhängigkeitsgraphen
- Abwägung zwischen Kapselung und Flexibilität