0


IDEA 搭建 Maven模块化项目


1.前言

    为了更好地组织和管理项目代码。通过将一个大型项目分解成多个模块,每个模块都可以独立地编译、测试和部署,从而提高项目的可维护性和可扩展性。多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。

构建微服务项目,基本上会对模块进行明确的划分,比如:

  • 抽象定义公共代码及工具类封装进行引用
  • 业务代码进行单独定义模块
  • 对外提供的接口服务单独定义模块
  • 不同功能系统不同模块
  • ......

上面的拆分也并非绝对,随着架构师对于项目结构的不同理解,可能会衍生出不同的模块

本篇文章会详细演示如何创建 SpringBoot 父子模块的项目,针对部分知识点着重讲解

2. 软硬件环境

电脑: win10

创建项目工具: IDEA 2022.3

JDK 版本:JDK8

Maven版本: 3.6.1

3.项目搭建

3.1.创建 SpringBoot 父项目

1)首先打开 IDEA 工具,创建spring项目 ,点击File ---->new ---> Create New Project

2)选择 Spring Initializr(初始化),选择Project SDK 1.8,类型选择maven,Java语言选择8

Group: 项目组织唯一的标识符,实际对应 Java 的包的结构,是 main 目录里 Java 的目录结构Group 也就是 groupId,分为多个段;一般情况下 第一段为域,第二段为公司,第三段为项目名称。以 Nacos 源码进行举例,Group 为 com.alibaba.nacos:com 为商业组织,alibaba 为公司名称,nacos 就是项目名称

Artifact: 项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称,Artifact 即为 artifactId。

Type: 分为四种不同的类型,日常我们选择默认第一条就行,也就是 Maven Project

Language: 开发语言的话自然就是默认的 Java

Packaging: 打包方式,分为 War 包 和 Jar 包,这里选择 Jar 包

Java Version: 选择 Java 的一个版本,再坚持 20 年的 JDK 1.8

Version: 当前项目的一个版本,SNAPSHOT 为快照的意思

开发时一般使用此类型,因为对于 Maven 仓库的同步较为友好,有不同纬度的同步选择

Name: 定义项目名称

Description: 定义项目描述信息,帮助别人更好的了解项目

Package: 定义 main.java 目录下的结构

3)选择 SpringBoot 版本信息以及 Pom.xml 文件依赖组件

这里选择的 SpringBoot 版本是 2.7.1,jdk8对应2.*版本,点击 Next 继续进行创建项目

4)一个标准的 SpringBoot 项目就产生了

3.2. 构建子项目centerdao

在父项目的基础上直接创建module

1)点击菜单栏中 File -> New -> Module,不同版本中可能会有一点差异

** 2)**这里就是重复上述在创建 SpringBoot 项目时的步骤,Next 下一步

3)配置可按照需求进行选择,因为不同的 Module 需要引用不同的 Pom 依赖,后面会与 Parent 保持一个交互,确认创建信息,点击 Finish 生成项目

4)最终结构目录如下,项目已成功创建,后续我们要修改其中的 Pom.xml 使其成为真正的父子项目

3.3. 构建子项目centerweb

1)创建步骤与上边的centerdao一致

** 2)**添加spring web依赖,web项目作为整个项目的启动项目,继续添加代码简化依赖lombok

**3)最终项目结构如下 **

4. 建立父子 Module 依赖

将建立的 Parent 项目与后面创建的 Module 产生关联,需要改动以下几点

  • 修改 Parent 项目 Pom.xml 的打包方式 packaging 标签打包方式为 pom
  • 删除不必要文件并梳理 Pom.xml 依赖上下级关系
  • 需要新加一个 modules 标签,包含所有子项目,将所有的子模块都引入进去

对于子工程中的 .xml 文件

  • 修改子项目Module 项目 pom.xml中parent 标签为其父工程
  • 添加打包方式为 jar
  • 删除依赖包:继承父工程的依赖包

4.1 删除不必要文件

1)删除父项目红框标注的内容:src 文件是保存源代码的,可是我们的多模块的代码存放在多个架构层中,所以不需要这个 src 来存放代码

2)删除除启动项目centerweb之外的启动文件和配置文件和启动类

删除后的项目结构是这样的:

4.2.修改 Parent 项目 packaging

打开 Parent 项目的根 Pom.xml 文件,新增下方代码

    <!--打包方式-->
    <packaging>pom</packaging>
    <modules>
        <!-- 配置子项目-->
        <!-- 对应artifactId-->
        <module>centerdao</module>
        <module>centerweb</module>
    </modules>

packaging 包含三个值 Jar、War、Pom,默认 Jar的方式

首先来解释下 packaging 为 Pom 的意思,宏观而言即没有代码需要测试或者编译,也没有资源需要处理

Jar: 内部调用或作为服务进行发布使用

War: 需要部署的项目

Pom: 寓意为一个父级项目,一般作为项目聚合和依赖传递使用

modules 代表了 Parent 项目下的子 Module,体现了聚合的思想

这里把 父项目Parent 项目的 Pom.xml 配置复制出来,帮助大家后续排查问题

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.11</version>
        <relativePath/> 
    </parent>
    <groupId>com.ykx.center</groupId>
    <artifactId>centerparent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>centerparent</name>
    <description>SpringBoot 父子模块项目</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <!--打包方式-->
    <packaging>pom</packaging>
    <modules>
        <!-- 配置子项目-->
        <!-- 对应artifactId-->
        <module>centerdao</module>
        <module>centerweb</module>
    </modules>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

spring-boot-maven-plugin 的作用是运行 mvn package 时会将项目打包为可运行的 jar 包,java -jar 运行即可

如果不加这个 pluginsjava -jar xxx.jar 会报出如下错误

xxx/target/bootdemo-remote-api-0.0.1-SNAPSHOT.jar中没有主清单属性

4.3.修改子项目pom.xml 信息

创建后的子项目的 Parent 信息是 SpringBoot 配置,修改后如下

    <parent>
        <groupId>com.ykx.center</groupId>
        <artifactId>centerparent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

4.4.补充说明

另外说一下 dependenciesdependencyManagement 标签做一个讲解

1)dependencies

    如果 Parent 项目中使用 **dependencies** 标签,标签内的依赖默认传递子 Module,不用子 Module 进行显示书写依赖

2)dependencyManagement

** dependencyManagement** 与dependencies 不同的是,标签内的依赖不会默认传递子 Module,其作用只是为了统一版本声明

    如果子 Module 依赖 Parent 项目中 **dependencyManagement** 标签内的 pom 依赖,需要显示在子 Module 的 pom 文件中进行书写

5. 项目继承关系

我们按照《构建子 Module》章节的内容,构建出如下所述的子 Module,如果centerweb项目引用centerdao项目

        <!--引用dao项目-->
        <dependency>
            <groupId>com.ykx</groupId>
            <artifactId>centerdao</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

然后修改centenweb子 Module 的 pom.xml 文件如下

<?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>
    <parent>
        <groupId>com.ykx.center</groupId>
        <artifactId>centerparent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.centerweb</groupId>
    <artifactId>centerweb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>centerweb</name>
    <description>centerweb子项目</description>
    <properties>
        <java.version>1.8</java.version>
        <centerdao.version>0.0.1-SNAPSHOT</centerdao.version>
    </properties>
    <dependencies>
        <!--引用dao项目-->
        <dependency>
            <groupId>com.ykx</groupId>
            <artifactId>centerdao</artifactId>
            <version>${centerdao.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

通过继承关系的设置,centerdao 中的代码就可以被 centerweb 项目进行引用

6. 验证项目

在 Parent 项目 pom.xml中 dependencies 标签中定义了 spring-boot-starter-web 依赖,直接使用 web 相关内容即可,直接可以运行

centerweb中创建 Controller 控制器

@RestController
public class DemoController {

     @RequestMapping("/ok")
    public String test() {   
        return "OK";
    }
}

启动项目

启动后端项目成功后,使用restfultool请求接口

7.异常处理

如果遇到项目搭建后,模块项目无启动类的情况,参考:

https://www.somode.com/softjc/43094.html

8.结语

由于作者水平有限, 希望大家能够反馈指正文章中错误不正确的地方, 感谢 🙏

小伙伴的喜欢就是对我最大的支持 😆 , 希望大家能够 点赞、评论、在看三连

鸣谢

[1].https://blog.csdn.net/qq_37781649/article/details/109321248


本文转载自: https://blog.csdn.net/qq_20957669/article/details/130580983
版权归原作者 月半花开 所有, 如有侵权,请联系我们删除。

“IDEA 搭建 Maven模块化项目”的评论:

还没有评论