Module เป็นคอนเทนเนอร์ของแพ็กเกจ แต่ละโมดูลมี module descriptor รวมถึง module name module dependencies หมายถึงชื่อโมดูลอื่นที่พึ่งพา และชื่อแพ็กเกจที่ export ใช้ได้เฉพาะโมดูลที่พึ่งพา
module com.tutorialspoint.app {
/** Modules upon which this module depends */
requires com.tutorialspoint.services;
/** Packages exposed by this module */
exports com.tutorialspoint.app.util;
}
มี 3 โหมดการคอมไพล์ที่ Java 9 Module ให้มา: Legacy mode Single module mode และ Multi-module mode
โหมดการคอมไพล์ของโมดูล
1. Legacy Mode
- เปิดใช้งานเมื่อ compilation environment (จาก --source, --target, --release) น้อยกว่าหรือเท่ากับ 8
- คอมไพเลอร์ทำงานเหมือน Java 8 (หรือก่อนหน้า) ใช้ traditional options (classpath) แทน module options (--module-path)
- ในโหมดนี้ โค้ดรันเป็น unnamed module ระหว่าง runtime
2. Single Module Mode
- เปิดใช้งานเมื่อ compilation environment เป็น 9 หรือใหม่กว่า และ ไม่ได้ใช้ --module-source-path
- โค้ดจัดโครงสร้างแบบ package hierarchy แบบเดิม มี module-info.java รันบน modulepath ไม่ใช่ classpath
- วาง module-info.java โดยตรงใต้ src directory ไม่สามารถมี module-info.java หลายไฟล์ใน tree เดียวกันได้ → เรียกว่า single module mode
3. Multi-Module Mode
- เปิดใช้งานเมื่อ compilation environment เป็น 9 หรือใหม่กว่า และ ใช้ --module-source-path
- วางหลายโมดูลใต้ source directory เดียวกัน
- ตอน compile ระบุ main source directory ด้วย --module-source-path
- Source tree ของแต่ละโมดูลวางใน subdirectory ของตัวเองภายใต้ main source directory
ตัวอย่างคำสั่งคอมไพล์
Single Module Mode
javac -d out --module-source-path src $(find src -name "*.java")
Multi-Module Mode
# โครงสร้าง:
# src/
# moduleA/
# module-info.java
# com/...
# moduleB/
# module-info.java
# com/...
javac -d out --module-source-path src $(find src -name "*.java")
สรุป
| โหมด | Version | --module-source-path | Module Descriptors | Runtime |
|---|---|---|---|---|
| Legacy | ≤ 8 | ไม่ใช้ | ไม่มี | Unnamed module |
| Single Module | ≥ 9 | ไม่ใช้ | 1 ไฟล์ | Named module |
| Multi-Module | ≥ 9 | ใช้ | หลายไฟล์ | Named modules |