IDEA 搭建 Maven模块化项目

news/2024/11/25 4:57:00/

目录

1.前言

2. 软硬件环境

3.项目搭建

3.1.创建 SpringBoot 父项目

3.2. 构建子项目centerdao

3.3. 构建子项目centerweb

4. 建立父子 Module 依赖

4.1 删除不必要文件

4.2.修改 Parent 项目 packaging

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

4.4.补充说明

5. 项目继承关系

6. 验证项目

7. 结语

参考


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.补充说明

另外说一下 dependencies 和 dependencyManagement 标签做一个讲解

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. 结语

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

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

参考

IDEA 最便捷创建 SpringBoot 父子 Module 项目


http://www.ppmy.cn/news/97455.html

相关文章

外观数列的输出

题目&#xff1a; 给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列&#xff1a; countAndSay(1) "1&q…

Linux-0.11 文件系统read_write.c详解

Linux-0.11 文件系统read_write.c详解 模块简介 该模块实现了文件系统通用的读写的方法read/write/lseek。 根据文件类型的不同&#xff0c;在内部将调用不同的方法。如果是管道文件&#xff0c;则调用pipe.c中的读写方法&#xff0c;如果是字符设备&#xff0c;则会调用cha…

C++ 基础知识引用002

目录 一句话概括:引用是被应用变量的别名 1. 引用的用途以及优势 1.1 用途 1.2 优点

常见开源协议介绍

开源协议是指开放源代码软件的使用、修改和分发的规则。开源协议的出现&#xff0c;使得开发者可以在保护自己的知识产权的同时&#xff0c;也可以让其他人使用、修改和分发自己的代码。本文将介绍几种常见的开源协议。 一、GPL协议 GPL&#xff08;GNU General Public Licens…

RabbitMQ学习-死信队列

死信队列 背&#xff1a;就是三种情况导致消息无法消费就是死信&#xff0c;然后就会转到死信交换机中&#xff0c;死信交换机发送到死信队列中&#xff0c;然后创建个消费者消费死信队列中的东西,再没什么哈哈 死信&#xff0c;顾名思义就是无法被消费的信息&#xff0c;字面…

为什么有了IP地址,还需要MAC地址呢?

不知道大家有没有困惑&#xff1a;为什么有了IP地址&#xff0c;还需要MAC地址呢&#xff1f;他们之间到底有什么联系&#xff1f;又有什么区别&#xff1f;是不是有一个是多余的&#xff1f; 流言传到了“IP地址”和“MAC地址”的耳朵里&#xff0c;他俩也非常苦恼&#xff0c…

我们应该用中文编程

已经有好几年的时间&#xff0c;我经常会想起中文编程这个话题。这两天参加数博会&#xff0c;让我对此又有了一些新的感受和理解。 这几天有不少主流媒体&#xff08;人民日报、央视财经等&#xff09;来采访&#xff0c;虽然他们并不是技术领域的媒体&#xff0c;但对于低代码…

任务28 成绩管理系统

系列文章 任务28 成绩管理系统 1)问题描述 现有学生成绩信息,内容如下: 姓名 学号 语文 数学 英语 张明明 01 67 78 82 李成友 02 78 91 88 张辉灿 03 68 82 56 王露 04 56 45 77 陈东明 05 67 38 47 编写一系统,实现学生信息管理。 2) 基本要求 功能要求: (1)信息维…