mcpField
M
multi-module-maven

multi-module-maven

github.com/rrezartprebreza开发328116 次安装6 天前更新
代码仓库

关于 multi-module-maven

为 Java 项目提供多模块 Maven 结构指导,面向编码 Agent,涵盖模块边界、依赖方向及常见 POM 配置问题。

主要功能

  1. 01父 POM 与子模块结构
  2. 02领域层与应用层划分
  3. 03模块依赖方向规则
  4. 04Maven 配置问题说明

适用场景

  1. 01设计新的多模块 Java 项目
  2. 02检查 Maven 模块间依赖
  3. 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.yaml
examples/
bad-parent-pom.xml
good-parent-pom.xml
templates/
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无所有模块
applicationdomaininfrastructure、web
infrastructuredomain、applicationweb
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