java生成标准模块化结构需maven与jpms协同:maven组织多模块骨架(父pom设packaging=pom并声明modules),各子模块在src/main/java顶层放置module-info.java明确定义模块名、requires依赖和exports包,确保jdk≥9且maven-compiler-plugin启用模块支持,最终产出含module-info.class的命名模块jar。

Java 生成标准模块化结构,核心在于两层协同:一是用构建工具(如 Maven)组织多模块项目骨架,二是按 Java Platform Module System(JPMS)规范在每个模块中声明 module-info.java。两者缺一不可——Maven 管理模块划分与依赖传递,JPMS 负责运行时的封装、导出和依赖验证。
用 Maven 搭建多模块项目骨架
Maven 是目前最主流的 Java 构建工具,适合定义清晰的父子模块关系:
- 创建一个空目录作为根项目,在其中编写顶层
pom.xml,packaging 必须设为pom,并在<modules></modules>中列出子模块路径,例如:<modules><br><module>core</module><br><module>api</module><br></modules>
- 每个子模块(如
core)是一个独立目录,含自己的pom.xml,其中通过<parent></parent>显式指向根 POM,并设置artifactId和version;无需额外插件即可继承父级依赖与插件配置 - 推荐目录结构保持语义一致:根目录下只有
pom.xml和子模块文件夹;各子模块内含src/main/java、src/test/java及module-info.java
在每个模块中添加 module-info.java
这是 JPMS 的强制入口文件,必须放在 src/main/java 的最顶层(与包同级),不能嵌套在任何包里:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 文件内容需明确定义模块名、所依赖的其他模块(
requires)、对外导出的包(exports),例如:module com.example.core {<br> requires java.base;<br> requires com.fasterxml.jackson.databind;<br> exports com.example.core.service;<br>} - 若模块仅供内部使用(如工具类模块),可不
exports任何包;若需被其他模块调用,则只导出 API 包,隐藏internal或impl包 - Maven 编译时默认支持模块路径(
--module-path),但需确保 JDK 版本 ≥ 9,且在maven-compiler-plugin中显式启用模块支持:<configuration><br><release>17</release><br></configuration>
打包与验证模块化结构
生成的产物要体现模块化语义,不能退化为传统 JAR:
- 使用
mvn clean package构建后,每个模块输出的是 模块化 JAR(即含module-info.class的 JAR),可通过jar --file=target/core-1.0.jar --describe-module验证是否识别为命名模块 - 若需运行模块化程序,必须用
--module-path替代-cp,并用--module指定主模块和主类,例如:java --module-path libs --module com.example.api/com.example.api.Main - 建议在根 POM 中统一配置
maven-jar-plugin,自动写入Automatic-Module-Name(兼容非模块化依赖)或确保module-info.java存在时跳过该属性
配套工具链增强模块化体验
构建只是起点,配合工具才能发挥模块系统优势:
- 用
javadoc命令加--module和--module-path参数,可按模块生成隔离的 API 文档,避免跨模块引用污染 - 结合
jlink工具,基于模块依赖图构建最小化自定义 JRE,剔除未使用的 JDK 模块,显著减小部署体积 - 若项目需动态加载能力(如插件场景),可在模块化基础上引入 TITAN 或 Jigsaw 动态 API,但注意:标准 Maven 构建本身不处理运行时模块层(
ModuleLayer)操作,那是应用层逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










