返回 导航

SpringBoot / Cloud

hangge.com

SpringBoot - 多模块项目的搭建教程(附详细过程样例)

作者:hangge | 2020-03-17 08:10
    Maven 多模块项目通常由一个父模块和若干个子模块构成,每个模块都对应着一个 pom.xml。它们之间通过继承和聚合(也称作多模块)相互关联。多模块适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。
    本文通过构建一个包含 4 个子模块的项目,来演示 SpringBoot Maven 环境的多模块构建过程。

1,创建父工程

(1)首先,先创建一个 Spring Initializr 工程 hangge 作为 父工程(不添加任何依赖):

(2)删除刚创建工程里不需要的文件, 只保留:.idea 文件夹 、项目 pom 文件、以及一个 *.iml 文件。
注意: 因为父模块只做依赖管理,不需要编写代码,所以 src 文件夹可以直接删除。

(3)删除后结果如下:

2,创建子模块

(1)右键点击父工程,选择 New -> Module... 创建子模块。这里依次创建 hangge-basehangge-daohangge-servicehangge-web 4 个模块。
注意:除了 hangge-web 子模块创建时选择添加 Spring Web 依赖(当然也可以创建时不添加,等后面再手动编辑 pom.xml 文件添加),其他模块暂时不添加依赖。

(2)将 4 个子模块的 mvnwmvnw.cmd 文件及 .mvn 文件夹全部删除。

(3)对于 src 里的内容,只保留 hangge-web 的启动类和配置文件,其他子模块的的启动类和配置文件都删除:

(4)删除后结果如下:

3,编辑父工程 pom.xml 文件

    将父工程 pom.xml 文件修改成如下内容,里面声明该父工程包含的子模块,同时抽取统一的配置信息和依赖版本控制,这样可以方便子 pom 直接引用,简化子 pom 的配置。
  • 多模块项目中,父模块打包类型必须是 pom
  • 因为开发框架是 spring boot,父模块默认继承 spring-boot-starter-parent,因此可以删除 spring-boot-starterspring-boot-starter-test 依赖(祖先已经包含了)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>hangge</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hangge</name>
    <description>Demo project for Spring Boot</description>

    <!-- 父模块打包类型必须为pom -->
    <packaging>pom</packaging>

    <!-- parent指明继承关系,给出被继承的父项目的具体信息-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <!-- 模块说明:这里声明多个子模块 -->
    <modules>
        <module>hangge-base</module>
        <module>hangge-dao</module>
        <module>hangge-service</module>
        <module>hangge-web</module>
    </modules>

    <!-- 版本说明:这里统一管理依赖的版本号 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>hangge-base</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>hangge-dao</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>hangge-service</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>hangge-web</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

4,编辑子模块 pom.xml 文件

(1)子模块 hangge-base pom.xml 文件内容如下,其中 parent 要使用顶层的父模块,同时由于我们项目用到了 Lombok ,所以还添加了 lombok 依赖:
注意:由于子模块的配置信息会继承父模块的,所以子模块原来的 properties 可删掉。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>hangge-base</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hangge-base</name>
    <description>Demo project for Spring Boot</description>

    <!-- 继承本项目的父工程 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>hangge</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
        </dependency>
    </dependencies>
</project>

(2)子模块 hangge-daopom.xml 文件内容如下,同样 parent 要使用顶层的父模块,并添加 hangge-base 子模块,以及数据库相关依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>hangge-dao</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hangge-dao</name>
    <description>Demo project for Spring Boot</description>

    <!-- 继承本项目的父工程 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>hangge</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!-- dao 子模块又依赖 base 子模块 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>hangge-base</artifactId>
        </dependency>
        <!-- Spring Data JPA 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- 数据库驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>
</project>

(3)子模块 hangge-service pom.xml 文件内容如下,同样 parent 要使用顶层的父模块,并添加 hangge-dao 子模块依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
          https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>hangge-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hangge-service</name>
    <description>Demo project for Spring Boot</description>

    <!-- 继承本项目的父工程 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>hangge</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!-- service 子模块又依赖 dao 子模块 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>hangge-dao</artifactId>
        </dependency>
    </dependencies>
</project>

(4)子模块 hangge-webpom.xml 文件内容如下,同样 parent 要使用顶层的父模块,并添加 hangge-service 子模块依赖:
注意: 之前创建这个子模块的时候已经添加了 spring-boot-starter-web 依赖,如果没有则手动添加。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>hangge-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hangge-web</name>
    <description>Demo project for Spring Boot</description>

    <!-- 继承本项目的父工程 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>hangge</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!-- web 子模块又依赖 service 子模块 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>hangge-service</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>

5,移动项目启动类所在的包

(1)目前项目启动类 HanggeWebApplication com.example.hanggeweb 包下面,我们需要将其移动移动到 com.example 包下。
    如果不移动启动类的话,在多模块项目中会可能会碰到一个模块无法通过 @Autowired 注入其他模块里的对象的问题。启动时会报类似如下的错误:
  • Field bookService in com.example.hanggeweb.controller.HelloController required a bean of type 'com.example.hanggeservice.BookService' that could not be found.

(2)移动的方式就是右键点击 HanggeWebApplication 选择 Refactor -> Move...

(3)在弹出框中将 To package 设置成 com.example 后点击 Refactor 按钮移动:

6,开始编码

(1)首先在 hangge-dao 模块中添加一个 Book 实体类:
@Entity(name = "book")
@Setter
@Getter
@NoArgsConstructor
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String author;
    private Float price;
}

(2)接着在 hangge-dao 模块中添加 BookDao 接口,继承 JpaRepository
public interface BookDao extends JpaRepository<Book, Integer> {
}

(3)接着在 hangge-service 模块中添加一个业务实现类 BookService,注入 BookDao 并调用:
@Service
public class BookService {
    @Autowired
    BookDao bookDao;

    public List<Book> allBooks() {
        return bookDao.findAll();
    }
}

(4)然后在 hangge-web 模块中创建一个 Controller,注入 BookService 并调用:
@RestController
public class HelloController {

    @Autowired
    BookService bookService;

    @GetMapping("test")
    public List<Book> test() {
        return bookService.allBooks();
    }
}

(5)最后在 hangge-web 模块的 application.properties 中配置数据库基本信息以及 JPA 相关配置:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/hangge2?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=hangge1234
#是否在控制台打印JPA执行过程生成的SQL
spring.jpa.show-sql=true
#表示JPA对应的数据库是MySQL
spring.jpa.database=mysql
#表示在项目启动时根据实体类更新数据库中的表
spring.jpa.hibernate.ddl-auto=update
#表示使用的数据库方言是MySQL57Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

7,运行测试

(1)运行 hangge-web 模块下的 Application 的启动类:

(2)使用浏览器访问 http://localhost:8080/test 便可查询到相关的数据信息:
评论

全部评论(0)

回到顶部