Module เป็น concept สำคัญใน Java 9 ใช้แบ่งโค้ดเป็น components ย่อยเรียกว่า modules แต่ละ module มีหน้าที่ตัวเองและประกาศ dependency บน modules อื่น เพื่อทำงานได้ถูกต้อง ต้องมีไฟล์ module-info.java ที่ root source code
ประเภทของ requires clause
1) requires <module> - Basic Dependency
โดย default module ไม่รู้จัก modules อื่นใน module-path จึงต้องเพิ่ม requires ทุกครั้งที่ต้องการเข้าถึง module อื่น
module com.tutorialspoint.gui {
requires com.tutorialspoint.model;
requires java.desktop;
}
2) requires transitive <module> - Transitive Dependency
กรณี module com.tutorialspoint.model return exported interface types ของ module com.core module ที่ต้องการใช้ model ก็ต้อง requires com.core ด้วย Java 9 ให้ keyword transitive เพื่อบอกว่า dependency นี้ส่งต่อได้ ผู้ใช้ com.tutorialspoint.model เข้าถึง com.core ได้โดยไม่ต้อง requires เอง
module com.tutorialspoint.model {
requires transitive com.core;
}
3) requires static <module> - Optional Dependency (Compile-time only)
requires static แทน optional dependency:
- Mandatory at compile time: compile error ถ้า module ไม่อยู่ใน module path ตอน compile
- Optional at runtime: ไม่ถูกนับใน sanity check ตอน start app เริ่มได้แม้ module หายไป
ตัวอย่าง: รองรับ database หลายตัว (Oracle หรือ H2)
module com.tutorialspoint.model {
requires static ojdbc;
requires static h2database.h2;
}
ตารางเปรียบเทียบ
| Clause | Compile-time | Runtime | Transitive | Use Case |
|---|---|---|---|---|
| requires | Required | Required | No | Normal dependency |
| requires transitive | Required | Required | Yes | API dependency ที่ต้องเผยต่อผู้ใช้ |
| requires static | Required | Optional | No | Optional implementation (SPI, drivers) |
คำสั่งตรวจสอบ
# ดู requires ของ module
jdeps --module-path mods --module com.tutorialspoint.app
# ใน JShell
jshell> ModuleLayer.boot().findModule("com.tutorialspoint.app").get().getDescriptor().requires()
Best Practices
- ใช้
requires transitiveสำหรับ API dependencies ที่ public types เปิดเผย - ใช้
requires staticสำหรับ service providers, database drivers, logging implementations - หลีกเลี่ยง cyclic dependencies
- ประกาศ requires เรียงตาม alphabet เพื่ออ่านง่าย