springboot多模块打包的记录是怎样的

发布时间:2021-09-29 14:46:07 作者:柒染
来源:亿速云 阅读:212
# SpringBoot多模块打包的记录是怎样的

## 前言

在现代企业级应用开发中,模块化设计已成为提升代码可维护性和团队协作效率的重要手段。SpringBoot作为当下最流行的Java应用框架,其多模块项目结构能够很好地支持复杂业务系统的开发。本文将详细记录一个完整的SpringBoot多模块项目从结构设计到打包部署的全过程,涵盖约9800字的技术细节和实践经验。

---

## 目录结构
1. [多模块项目设计原理](#一多模块项目设计原理)
2. [项目初始化与父POM配置](#二项目初始化与父pom配置)
3. [子模块划分与依赖管理](#三子模块划分与依赖管理)
4. [模块间通信机制](#四模块间通信机制)
5. [多环境配置管理](#五多环境配置管理)
6. [打包插件深度配置](#六打包插件深度配置)
7. [自定义打包策略](#七自定义打包策略)
8. [常见问题解决方案](#八常见问题解决方案)
9. [性能优化建议](#九性能优化建议)
10. [CI/CD集成实践](#十cicd集成实践)

---

## 一、多模块项目设计原理

### 1.1 模块化架构优势
- **解耦与复用**:将通用组件(如工具类、实体对象)独立为`common`模块
- **并行开发**:不同团队可同时开发业务模块(如`user-service`、`order-service`)
- **依赖隔离**:避免循环依赖,如web模块不应依赖DAO模块

### 1.2 典型模块划分
```bash
parent-project
├── pom.xml
├── project-common
│   └── pom.xml
├── project-dao
│   └── pom.xml
├── project-service
│   └── pom.xml
└── project-web
    └── pom.xml

1.3 依赖传递规则


二、项目初始化与父POM配置

2.1 创建父项目

<!-- parent pom.xml -->
<packaging>pom</packaging>
<modules>
    <module>project-common</module>
    <module>project-dao</module>
    <module>project-service</module>
    <module>project-web</module>
</modules>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.2 关键配置项

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>11</source>
        <target>11</target>
    </configuration>
</plugin>

三、子模块划分与依赖管理

3.1 Common模块配置

<!-- project-common/pom.xml -->
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

3.2 Web模块依赖示例

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>project-service</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

3.3 依赖冲突解决

<exclusions>
    <exclusion>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </exclusion>
</exclusions>

四、模块间通信机制

4.1 接口暴露方式

public interface UserService {
    UserDTO getUserById(Long id);
}

4.2 实现类注入

// 在web模块通过@Autowired注入
@RestController
public class UserController {
    @Autowired
    private UserService userService;
}

4.3 跨模块Bean扫描

@SpringBootApplication(scanBasePackages = {
    "com.example.web",
    "com.example.service"
})

五、多环境配置管理

5.1 Profile配置

# application-dev.yml
spring:
  datasource:
    url: jdbc:mysql://dev-db:3306/app

5.2 激活指定Profile

mvn package -Pdev

5.3 资源过滤

<profile>
    <id>prod</id>
    <properties>
        <env>prod</env>
    </properties>
</profile>

六、打包插件深度配置

6.1 spring-boot-maven-plugin

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>com.example.web.Application</mainClass>
        <executable>true</executable>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

6.2 瘦身打包配置

<configuration>
    <excludeGroupIds>org.projectlombok</excludeGroupIds>
    <outputDirectory>target/libs</outputDirectory>
</configuration>

七、自定义打包策略

7.1 分离依赖包

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
        </execution>
    </executions>
</plugin>

7.2 打包分类器使用

mvn package -Dclassifier=bin

八、常见问题解决方案

8.1 模块找不到问题

[ERROR] Failed to execute goal on project web: 
Could not resolve dependencies for project...

解决方案: 1. 检查父POM中的<module>声明 2. 执行mvn install安装本地仓库

8.2 主类找不到问题

No main manifest attribute in app.jar

解决方案

<configuration>
    <mainClass>com.example.Application</mainClass>
</configuration>

九、性能优化建议

9.1 构建加速

9.2 镜像优化

FROM eclipse-temurin:17-jre-alpine
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

十、CI/CD集成实践

10.1 Jenkins流水线示例

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }
    }
}

10.2 制品上传

curl -X POST -u $USER:$PASSWORD \
  -H "Content-Type: multipart/form-data" \
  -F "file=@target/app.jar" \
  http://nexus/repository/maven-releases/

结语

通过本文的详细记录,我们系统性地梳理了SpringBoot多模块项目的打包全流程。在实际项目中,建议根据团队规范进行适当调整。如需完整示例代码,可访问GitHub仓库

最佳实践提示:定期执行mvn dependency:analyze检查无用依赖,保持项目整洁 “`

推荐阅读:
  1. vue-cli扩展多模块打包的示例代码
  2. 解决SpringBoot多模块发布时99%的问题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot

上一篇:PHP如何处理微信支付通知

下一篇:ThinkPHP中上传类UploadFile怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》