下面从概念 → 创建 → 使用 → 常见问题给你一个实用向的 Java Module(Java 9+ 引入的 JPMS:Java Platform Module System)入门说明。
Java Module 是 Java 9 引入的代码组织方式,用来代替传统的“包 + JAR”松散结构。
✅ 核心目标:
project
│
├── module-a
│ ├── src/main/java
│ │ ├── module-info.java
│ │ └── com/example/a/Hello.java
│
├── module-b
│ ├── src/main/java
│ │ ├── module-info.java
│ │ └── com/example/b/App.java
每个模块必须有一个 module-info.java
module module.a {
exports com.example.a;
}
✅ 含义:
module.acom.example.amodule module.b {
requires module.a;
}
✅ 含义:
module.b 依赖 module.amodule.a 中 exports 的包// module-a/src/main/java/module-info.java
module module.a {
exports com.example.a;
}
// module-a/src/main/java/com/example/a/Hello.java
package com.example.a;
public class Hello {
public String say() {
return "Hello Module";
}
}
// module-b/src/main/java/module-info.java
module module.b {
requires module.a;
}
// module-b/src/main/java/com/example/b/App.java
package com.example.b;
import com.example.a.Hello;
public class App {
public static void main(String[] args) {
Hello hello = new Hello();
System.out.println(hello.say());
}
}
javac \
--module-source-path module-a/src/main/java \
-d out \
$(find module-a -name "*.java")
javac \
--module-path out \
--module-source-path module-b/src/main/java \
-d out \
$(find module-b -name "*.java")
java --module-path out -m module.b/com.example.b.App
| 指令 | 作用 |
|---|---|
module xxx {} |
定义模块 |
exports pkg |
导出包 |
requires module |
依赖模块 |
requires transitive module |
传递依赖 |
opens pkg |
允许反射访问 |
provides ... with ... |
SPI |
uses ... |
使用 SPI |
package com.example.a.internal;
如果没 exports,即使有 requires 也无法访问。
✅ 解决:
exports com.example.a.internal;
Spring / Hibernate 需要反射。
✅ 解决:
opens com.example.a to spring.core;
或(不推荐,完全开放):
open module module.a {
exports com.example.a;
}
✅ 解决方式:
✅ 支持,但大多数项目目前:
例如 Maven:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
✅ 适合:
❌ 不太适合:
Java Module = 更强的包访问控制 + 显式依赖声明
如果你愿意,我可以:
你现在用的是 Java 几?Maven 还是 Gradle?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。