在 Java 9+ 中引入了 Java Platform Module System(JPMS),模块的依赖主要通过 module-info.java 来声明。下面系统地讲一下 Java Module 如何依赖。
模块是 一组包 + 一个模块描述文件 module-info.java。
src/
└── main/
└── java/
├── module-info.java
└── com/example/App.java
requires:声明依赖另一个模块module com.example.app {
requires com.example.util;
}
含义:
com.example.app 依赖 com.example.util模块 A
module com.example.util {
exports com.example.util;
}
模块 B
module com.example.app {
requires com.example.util;
}
module com.example.app {
requires java.sql;
requires java.logging;
}
常见 JDK 模块:
java.base(默认自动依赖,无需声明)java.sqljava.desktopjava.naming✅ java.base 是所有模块的根模块,自动依赖
如果第三方 JAR 不是模块:
java --module-path libs --add-modules commons.lang3
模块名规则:
commons-lang3-3.12.0.jar → commons.lang3module com.example.app {
requires commons.lang3;
}
⚠️ 自动模块:
module com.example.app {
requires com.google.gson;
}
exports:允许其他模块访问module com.example.util {
exports com.example.util;
}
exports ... to(限定导出)module com.example.util {
exports com.example.internal to com.example.app;
}
仅 com.example.app 可访问
requires transitive(传递依赖)module com.example.util {
exports com.example.util;
requires transitive com.example.common;
}
依赖 com.example.util 的模块 自动依赖 com.example.common
module com.example.impl {
provides com.example.Service
with com.example.impl.ServiceImpl;
}
module com.example.app {
uses com.example.Service;
}
代码中使用:
ServiceLoader<Service> loader = ServiceLoader.load(Service.class);
opens(运行时反射)module com.example.app {
opens com.example.model;
}
opens ... to(限定打开)opens com.example.model to spring.core;
| 场景 | 说明 |
|---|---|
| 普通 classpath | 模块系统不生效 |
--module-path |
模块生效 |
| jar 不在 module-path | 当成自动模块 |
| 未 exports | 编译 / 运行期不可访问 |
javac -d out --module-source-path src $(find src -name "*.java")
java --module-path out -m com.example.app/com.example.app.Main
✅ 核心语法
module 模块名 {
requires 模块名;
exports 包名;
}
✅ 依赖本质
如果你愿意,我可以:
你现在是 学习 JPMS 还是 实际项目中使用模块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。