前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot第3集:springboot中创建多个模块创建,关联,后续如何打包呢

springboot第3集:springboot中创建多个模块创建,关联,后续如何打包呢

作者头像
达达前端
发布2023-10-08 17:57:31
6300
发布2023-10-08 17:57:31
举报
文章被收录于专栏:达达前端达达前端

在Spring Boot中,创建多个模块并关联它们的最佳实践是使用Maven或Gradle进行构建。以下是使用Maven先创建父pom.xml:

代码语言:javascript
复制
<groupId>com.example</groupId>
<artifactId>multi-module-project</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<modules>
  <module>module-one</module>
  <module>module-two</module>
</modules>

下面是module-one的pom.xml文件示例:

代码语言:javascript
复制
<parent>
  <groupId>com.example</groupId>
  <artifactId>multi-module-project</artifactId>
  <version>0.0.1</version>
</parent>
<artifactId>module-one</artifactId>
<version>0.0.1</version>

在上述示例中,module-one将其父项目定义为com.example:multi-module-project。

在创建完您的多个模块并将它们关联起来之后,您可以使用以下Maven命令打包所有模块:

代码语言:javascript
复制
mvn clean package

此命令将在每个模块中生成一个单独的JAR文件,您可以将其分发或部署到服务器上。如果您不希望在每个模块中生成单独的JAR文件,则可以在父pom.xml文件中更改打包类型:

代码语言:javascript
复制
<packaging>pom</packaging>

这样,只会生成一个JAR文件,其中包含所有模块。

最后,您可以使用以下命令来安装依赖项并导出JAR文件:

代码语言:javascript
复制
mvn install

此命令将安装所有依赖项,并将最终的JAR文件放在/target目录下。

在Spring Boot中使用多个Maven模块的最佳实践是使用一个父模块来管理它们。父模块是一个Maven项目,它包含多个子模块,并通过声明它们的依赖关系来管理它们。

Spring Boot多模块开发的主要优势是将大型应用程序拆分为相互依赖的小模块,从而简化代码库的管理和维护。然而,多模块的开发方式可能会带来一些挑战和错误,下面是一些Spring Boot多模块开发的排坑指南:

  1. 在父模块中定义通用依赖库

如果多个子模块需要使用同样的依赖库,可以将它们定义在父模块的pom.xml文件中。这样做可以避免重复性的工作,同时简化整个项目结构,提高代码库的易读性和可维护性。

  1. 避免不必要的依赖

在多模块开发中,有时会因为过多的依赖而导致误解和错误。因此,应该仔细规划项目结构,避免依赖交叉,并且应该只引入必要的库,而不是引入每个库。

  1. 确定模块之间的依赖关系

模块之间的依赖关系应该是有意义的。如果子模块之间的依赖关系过于复杂,将会导致代码难以维护,同时也会增加测试和代码重构的难度。因此,应该仔细规划模块之间的依赖关系,确保它们符合逻辑。

  1. 避免模块之间的冲突

当不同的子模块中包含同样的类或库时,可能会发生冲突。这时需要使用类加载器来避免冲突。如果使用Spring Boot的默认配置,多个Spring Boot模块将会共享同一个类加载器,这有可能导致冲突。为了避免这种情况,应该使用独立的类加载器,以避免子模块之间的冲突。

  1. 使用maven profiles来管理不同的环境

多模块Spring Boot应用程序通常在不同的环境中运行,如开发环境、测试环境和生产环境。为了管理不同的环境,可以使用maven profiles管理不同的配置文件。例如,在开发环境下,我们可能需要启用H2数据库,而在生产环境下,我们可能需要使用MySQL数据库。

总之,多模块开发可以显著简化代码库的管理和维护,从而提高应用程序的可读性和可维护性。然而,由于复杂性和错误的潜在风险,多模块开发需要更严格的规划和管理,以确保代码库的整洁和正确性。

  1. 使用Spring Boot插件统一管理多个子模块

使用Spring Boot插件可以使多个子模块统一管理,确保应用程序以相同的方式构建和部署。使用Spring Boot插件也可以轻松部署新子模块,而无需手动更新构建脚本。

  1. 配置文件和环境变量的使用

Spring Boot内置了多种配置文件幸而支持,如通过配置文件application.properties和application.yml等,还支持使用环境变量对应用程序进行配置。在多模块开发中,可以将这些配置信息放在父模块中,子模块可以继承这些配置信息。同时,子模块也可以在自己的配置文件中进行覆盖。

  1. 统一日志框架

在多模块开发中,子模块使用的可能不同的日志框架(如Log4j、Log4j2、slf4j、logback等),使用不同的日志框架可能导致日志记录混乱。因此,最好使用统一的日志框架进行日志记录。在Spring Boot中,使用Slf4j与Logback的组合可以进行统一的日志记录。

  1. 编写单元测试

在多模块的开发过程中,编写单元测试是非常重要的,可以对子模块的正常运行及时进行检测,发现和解决问题。开发者可以在每个子模块中进行单元测试编写。

  1. 模块命名规范

在多模块开发中子模块的命名应该遵守一定的规范和标准。通常,可以在模块名中包含两个部分,分别用“-”分隔。第一部分为业务功能相关的名称,第二部分为模块的类型,例如order-service, user-service等。

首先,Spring Boot多模块开发将应用程序分为多个松散耦合的模块,每个模块具有自己的特定功能和职责,可以分别实现测试、部署和版本控制。

下面是一个简单示例,展示如何用Gradle构建多模块Spring Boot应用程序,包括4个模块:

  • api:包含REST API的接口和实现类。
  • Service:包含业务逻辑和数据存储的实现类。
  • Dao:持久化层接口。
  • Model:实体类
  1. 创建 Gradle项目 使用 Gradle 初始化一个新的项目
  2. 创建模块 创建模块的方法有很多,可以手动创建,也可以使用 Gradle 或者 Maven 等构建工具来自动创建。

在 Intellij IDEA 中,右击项目名称,选择 New -> Module,创建各个模块。

  1. 配置 Gradle 编写 build.gradle 文件,添加所需的依赖项。
代码语言:javascript
复制
buildscript {
    ext {
        springBootVersion = '2.3.0.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}
// 引入所有的 jar 包
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

bootJar {
    archiveFileName = "app.jar"
}
  1. Api模块配置
代码语言:javascript
复制
dependencies {
    implementation project(":model")
    implementation project(":service")
    implementation 'org.springframework.boot:spring-boot-starter-web'
}
  1. Service模块配置
代码语言:javascript
复制
dependencies {
    implementation project(":model")
    implementation project(":dao")
}
  1. Dao模块配置
代码语言:javascript
复制
dependencies {
    implementation project(":model")
}
  1. Model模块配置
代码语言:javascript
复制
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'com.h2database:h2'
}

至此,Spring Boot多模块的基本开发已经完成。

如何创建聚合父工程,如何编写子模块代码,如何运行项目,如何运维部署,如何启动项目呢?

  1. 创建聚合父工程

首先需要创建一个聚合父工程,用于管理多个子模块。聚合父工程的结构类似于下面这样:

代码语言:javascript
复制
my-project/
├── my-project-api
├── my-project-service
└── my-project-dao
└── my-project-web
├── pom.xml

其中,my-project/目录为聚合父工程,my-project-apimy-project-servicemy-project-daomy-project-web为子模块。

在聚合父工程的pom.xml中,需要添加如下内容:

代码语言:javascript
复制
<modules>
    <module>my-project-api</module>
    <module>my-project-service</module>
    <module>my-project-dao</module>
    <module>my-project-web</module>
</modules>

这样就创建了一个聚合父工程,并添加了4个子模块。

  1. 编写子模块代码

my-project-api为例,其代码结构如下:

代码语言:javascript
复制
my-project-api/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── apimodule/
│   │   │               └── controller/
│   │   │                   └── UserController.java
│   │   └── resources/
│   │       └── application.properties
│   └── test/
│       └── java/
│           └── com/
│               └── example/
│                   └── apimodule/
│                       └── controller/
│                           └── UserControllerTest.java
└── pom.xml

其中,UserController为API模块的控制层代码,application.properties为API模块的配置文件,UserControllerTest.java为API模块的测试代码。

  1. 运行项目

在聚合父工程中,可以使用mvn clean install命令打包并运行项目。

  1. 运维部署

多模块打包的操作,需要在聚合父工程的pom.xml中添加如下配置:

代码语言:javascript
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.example.Application</mainClass>
                    </manifest>
                </archive>
                <finalName>${project.artifactId}-${project.version}</finalName>
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这样,在项目根目录下执行mvn clean package命令时,会自动将所有子模块打包成一个可执行的jar包。

  1. 启动项目

在项目根目录下,使用命令java -jar my-project-web/target/my-project-web-1.0.0-SNAPSHOT.jar启动项目,其中my-project-web/target/my-project-web-1.0.0-SNAPSHOT.jar为打包后的可执行jar包路径。

将一个Spring Boot单模块项目改造成多模块项目的过程,大致可以分为以下几个步骤:

  1. 分析项目结构和依赖关系

首先,需要分析单模块项目中的代码和依赖关系,将其拆分成若干个模块。可以根据功能模块或层次模块进行拆分,每个模块需要有自己的职责和功能,并且它们之间需要松耦合,可以单独构建和部署。

  1. 创建聚合父项目

在单模块项目的根目录下创建一个聚合父项目,用于管理所有的子项目。可以使用Maven或Gradle构建工具来创建父项目,这里以Maven为例:

代码语言:javascript
复制
<project>
    <groupId>com.example</groupId>
    <artifactId>my-parent-project</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    ...
</project>

在聚合父项目的pom.xml文件中,需要声明所有的子项目,例如:

代码语言:javascript
复制
<modules>
    <module>my-web-project</module>
    <module>my-service-project</module>
    <module>my-dao-project</module>
</modules>
  1. 创建子项目

在聚合父项目下,使用Maven或Gradle创建所有的子项目。每个子项目有自己的独立目录和pom.xml文件,例如:

代码语言:javascript
复制
<project>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>my-parent-project</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>my-web-project</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    ...
</project>

四个模块的示例结构如下:

代码语言:javascript
复制
my-parent-project/
├── my-web-project/
│   ├── src/main/java/com/example/web/...
│   ├── src/main/resources/...
│   ├── src/test/java/com/example/web/...
│   └── pom.xml
├── my-service-project/
│   ├── src/main/java/com/example/service/...
│   ├── src/main/resources/...
│   ├── src/test/java/com/example/service/...
│   └── pom.xml
├── my-dao-project/
│   ├── src/main/java/com/example/dao/...
│   ├── src/main/resources/...
│   ├── src/test/java/com/example/dao/...
│   └── pom.xml
└── pom.xml
  1. 将代码和资源文件拆分到子项目

根据分析结果,将代码和资源文件拆分到相应的子项目中。例如,将控制器,服务,DAO接口和实现类等拆分到相应的模块中。

  1. 配置各个子项目的依赖关系

根据聚合父项目和子项目之间的依赖关系,打开各个子项目的pom.xml文件,并添加相应的依赖关系,例如:

代码语言:javascript
复制
<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-service-project</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>
  1. 运行和测试

在所有子项目的pom.xml文件中添加必要的插件(例如,Maven的spring-boot-maven-plugin),并使用构建工具编译、打包和运行子项目。可以使用聚合父项目来一次性编译、打包和运行所有子项目。

  1. 部署

在所有子项目成功运行和测试后,使用构建工具将各个子项目打成可执行的jar或war包或者直接部署在应用服务器上。

SpringBoot多模块开发是将整个项目按照功能模块划分为多个模块,每个模块可以独立开发,独立测试,独立部署,模块之间可以随时拼接成一个完整的应用。

下面是一个SpringBoot多模块开发的示例:

我们的项目中有两个功能模块,一个是用户模块,一个是订单模块,那么我们可以将项目划分为如下的两个子模块:

  1. user-module:该模块中包含用户的增删改查功能
  2. order-module:该模块中包含订单的增删改查功能

同时,我们还可以创建一个父模块,用来对子模块进行统一管理:

  1. parent-module:该模块是父模块,主要作用是管理所有子模块的依赖和配置

我们可以将项目的整体结构划分为如下所示的目录结构:

代码语言:javascript
复制
├── parent-module  父模块
    ├── user-module  用户管理模块
    ├── order-module  订单管理模块

在父模块中,我们可以统一管理所有子模块的依赖和配置信息,子模块之间可以通过在父模块中引入彼此的依赖,来实现模块之间的交互。

同时,在子模块中,我们可以独立开发、独立测试、独立部署,这样可以提高我们的开发效率和项目的可维护性。

总之,采用SpringBoot多模块开发,可以有效地解耦各功能模块,提供更高效的协作和更方便的项目管理。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档