关于 multi-module-maven
为 Java 项目提供多模块 Maven 结构指导,面向编码 Agent,涵盖模块边界、依赖方向及常见 POM 配置问题。
主要功能
- 01父 POM 与子模块结构
- 02领域层与应用层划分
- 03模块依赖方向规则
- 04Maven 配置问题说明
适用场景
- 01设计新的多模块 Java 项目
- 02检查 Maven 模块间依赖
- 03排查常见 Maven 构建配置错误
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ rrezartprebreza/ spring-boot-skills --skill multi-module-maven安装后在 Claude Code 中输入/multi-module-maven确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlexamples/bad-parent-pom.xmlgood-parent-pom.xmltemplates/parent-pom.xml详细介绍
多模块 Maven
典型结构
my-app/
├── pom.xml ← Parent POM (packaging = pom)
├── my-app-domain/ ← Pure Java domain — no Spring
│ └── pom.xml
├── my-app-application/ ← Use cases — depends on domain
│ └── pom.xml
├── my-app-infrastructure/ ← JPA, Redis, HTTP clients
│ └── pom.xml
└── my-app-web/ ← Spring Boot app, REST — depends on all above
└── pom.xml
父 POM
<project>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>my-app-domain</module>
<module>my-app-application</module>
<module>my-app-infrastructure</module>
<module>my-app-web</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.16</version>
</parent>
<properties>
<java.version>21</java.version>
<mapstruct.version>1.6.3</mapstruct.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-app-domain</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-app-application</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-app-infrastructure</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
子模块 POM(domain — 不含 Spring)
<project>
<parent>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>my-app-domain</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
子模块 POM(web — 可运行的应用)
<project>
<parent>...</parent>
<artifactId>my-app-web</artifactId>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-app-application</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-app-infrastructure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
依赖规则
| 模块 | 可以依赖 | 不能依赖 |
|---|---|---|
domain | 无 | 所有模块 |
application | domain | infrastructure、web |
infrastructure | domain、application | web |
web | 所有模块 | — |
注意事项
- Agent 配置 Lombok 和 MapStruct 处理器时未添加
lombok-mapstruct-binding— 因此构建依赖处理器顺序:如果先运行 MapStruct,生成的映射器会缺少 Lombok 的构建器/Getter,导致编译失败;该绑定可确保顺序无关 - Agent 将
spring-boot-maven-plugin放在父 POM 中 — 该插件只应放在可运行模块中 - Agent 在父 POM 中添加
<dependencies>而非<dependencyManagement>— 这会将依赖添加到所有模块的类路径中 - Agent 在模块之间创建循环依赖 — 应遵循上述依赖方向
- Agent 在
domain模块中导入 Spring — domain 必须与框架无关 - Agent 使用
${project.version}指定模块间版本 — 这是正确的,但更新父版本即可更新所有模块 - Agent 在没有兼容性原因时覆盖 Boot 管理的依赖版本 — 优先使用 Boot BOM 默认值
评论
支持 Markdown