目錄
1.前言
2. 軟硬件環(huán)境
3.項(xiàng)目搭建
3.1.創(chuàng)建 SpringBoot 父項(xiàng)目
3.2. 構(gòu)建子項(xiàng)目centerdao
3.3. 構(gòu)建子項(xiàng)目centerweb
4. 建立父子 Module 依賴
4.1 刪除不必要文件
4.2.修改 Parent 項(xiàng)目 packaging
4.3.修改子項(xiàng)目pom.xml 信息
4.4.補(bǔ)充說明
5. 項(xiàng)目繼承關(guān)系
6. 驗(yàn)證項(xiàng)目
7.異常處理?
8.結(jié)語
鳴謝
1.前言
????????為了更好地組織和管理項(xiàng)目代碼。通過將一個(gè)大型項(xiàng)目分解成多個(gè)模塊,每個(gè)模塊都可以獨(dú)立地編譯、測試和部署,從而提高項(xiàng)目的可維護(hù)性和可擴(kuò)展性。多模塊項(xiàng)目,適用于一些比較大的項(xiàng)目,通過合理的模塊拆分,實(shí)現(xiàn)代碼的復(fù)用,便于維護(hù)和管理。尤其是一些開源框架,也是采用多模塊的方式,提供插件集成,用戶可以根據(jù)需要配置指定的模塊。
構(gòu)建微服務(wù)項(xiàng)目,基本上會(huì)對(duì)模塊進(jìn)行明確的劃分,比如:
- 抽象定義公共代碼及工具類封裝進(jìn)行引用
- 業(yè)務(wù)代碼進(jìn)行單獨(dú)定義模塊
- 對(duì)外提供的接口服務(wù)單獨(dú)定義模塊
- 不同功能系統(tǒng)不同模塊
- ......
上面的拆分也并非絕對(duì),隨著架構(gòu)師對(duì)于項(xiàng)目結(jié)構(gòu)的不同理解,可能會(huì)衍生出不同的模塊
本篇文章會(huì)詳細(xì)演示如何創(chuàng)建 SpringBoot 父子模塊的項(xiàng)目,針對(duì)部分知識(shí)點(diǎn)著重講解
2. 軟硬件環(huán)境
電腦:?win10
創(chuàng)建項(xiàng)目工具:?IDEA 2022.3
JDK 版本:JDK8
Maven版本:?3.6.1
3.項(xiàng)目搭建
3.1.創(chuàng)建 SpringBoot 父項(xiàng)目
1)首先打開 IDEA 工具,創(chuàng)建spring項(xiàng)目 ,點(diǎn)擊File ---->new --->?Create New Project
2)選擇 Spring Initializr(初始化),選擇Project SDK 1.8,類型選擇maven,Java語言選擇8
Group:?項(xiàng)目組織唯一的標(biāo)識(shí)符,實(shí)際對(duì)應(yīng) Java 的包的結(jié)構(gòu),是 main 目錄里 Java 的目錄結(jié)構(gòu)Group 也就是 groupId,分為多個(gè)段;一般情況下?第一段為域,第二段為公司,第三段為項(xiàng)目名稱。以?Nacos?源碼進(jìn)行舉例,Group 為 com.alibaba.nacos:com 為商業(yè)組織,alibaba 為公司名稱,nacos 就是項(xiàng)目名稱
Artifact:?項(xiàng)目的唯一的標(biāo)識(shí)符,實(shí)際對(duì)應(yīng)項(xiàng)目的名稱,就是項(xiàng)目根目錄的名稱,Artifact 即為 artifactId。
Type:?分為四種不同的類型,日常我們選擇默認(rèn)第一條就行,也就是 Maven Project
Language:?開發(fā)語言的話自然就是默認(rèn)的 Java
Packaging:?打包方式,分為 War 包 和 Jar 包,這里選擇 Jar 包
Java Version:?選擇 Java 的一個(gè)版本,再堅(jiān)持 20 年的 JDK 1.8
Version:?當(dāng)前項(xiàng)目的一個(gè)版本,SNAPSHOT 為快照的意思
開發(fā)時(shí)一般使用此類型,因?yàn)閷?duì)于 Maven 倉庫的同步較為友好,有不同緯度的同步選擇
Name:?定義項(xiàng)目名稱
Description:?定義項(xiàng)目描述信息,幫助別人更好的了解項(xiàng)目
Package:?定義 main.java 目錄下的結(jié)構(gòu)
3)選擇 SpringBoot 版本信息以及 Pom.xml 文件依賴組件
這里選擇的 SpringBoot 版本是?2.7.1,jdk8對(duì)應(yīng)2.*版本,點(diǎn)擊 Next 繼續(xù)進(jìn)行創(chuàng)建項(xiàng)目
4)一個(gè)標(biāo)準(zhǔn)的 SpringBoot 項(xiàng)目就產(chǎn)生了
3.2. 構(gòu)建子項(xiàng)目centerdao
在父項(xiàng)目的基礎(chǔ)上直接創(chuàng)建module
1)點(diǎn)擊菜單欄中?File -> New -> Module,不同版本中可能會(huì)有一點(diǎn)差異
?2)這里就是重復(fù)上述在創(chuàng)建 SpringBoot 項(xiàng)目時(shí)的步驟,Next 下一步
3)配置可按照需求進(jìn)行選擇,因?yàn)椴煌?Module 需要引用不同的 Pom 依賴,后面會(huì)與 Parent 保持一個(gè)交互,確認(rèn)創(chuàng)建信息,點(diǎn)擊?Finish?生成項(xiàng)目
4)最終結(jié)構(gòu)目錄如下,項(xiàng)目已成功創(chuàng)建,后續(xù)我們要修改其中的 Pom.xml 使其成為真正的父子項(xiàng)目
3.3. 構(gòu)建子項(xiàng)目centerweb
1)創(chuàng)建步驟與上邊的centerdao一致
?2)添加spring web依賴,web項(xiàng)目作為整個(gè)項(xiàng)目的啟動(dòng)項(xiàng)目,繼續(xù)添加代碼簡化依賴lombok
3)最終項(xiàng)目結(jié)構(gòu)如下?
4. 建立父子 Module 依賴
將建立的 Parent 項(xiàng)目與后面創(chuàng)建的 Module 產(chǎn)生關(guān)聯(lián),需要改動(dòng)以下幾點(diǎn)
- 修改 Parent 項(xiàng)目 Pom.xml 的打包方式 packaging 標(biāo)簽打包方式為 pom
- 刪除不必要文件并梳理 Pom.xml 依賴上下級(jí)關(guān)系
- 需要新加一個(gè) modules 標(biāo)簽,包含所有子項(xiàng)目,將所有的子模塊都引入進(jìn)去
對(duì)于子工程中的 .xml 文件
- 修改子項(xiàng)目Module 項(xiàng)目 pom.xml中parent 標(biāo)簽為其父工程
- 添加打包方式為 jar
- 刪除依賴包:繼承父工程的依賴包
4.1 刪除不必要文件
1)刪除父項(xiàng)目紅框標(biāo)注的內(nèi)容:src 文件是保存源代碼的,可是我們的多模塊的代碼存放在多個(gè)架構(gòu)層中,所以不需要這個(gè) src 來存放代碼
2)刪除除啟動(dòng)項(xiàng)目centerweb之外的啟動(dòng)文件和配置文件和啟動(dòng)類
刪除后的項(xiàng)目結(jié)構(gòu)是這樣的:?
4.2.修改 Parent 項(xiàng)目 packaging
打開 Parent 項(xiàng)目的根 Pom.xml 文件,新增下方代碼
<!--打包方式-->
<packaging>pom</packaging>
<modules>
<!-- 配置子項(xiàng)目-->
<!-- 對(duì)應(yīng)artifactId-->
<module>centerdao</module>
<module>centerweb</module>
</modules>
packaging 包含三個(gè)值?Jar、War、Pom,默認(rèn) Jar的方式
首先來解釋下 packaging 為 Pom 的意思,宏觀而言即沒有代碼需要測試或者編譯,也沒有資源需要處理
Jar:?內(nèi)部調(diào)用或作為服務(wù)進(jìn)行發(fā)布使用
War:?需要部署的項(xiàng)目
Pom:?寓意為一個(gè)父級(jí)項(xiàng)目,一般作為項(xiàng)目聚合和依賴傳遞使用
modules 代表了 Parent 項(xiàng)目下的子 Module,體現(xiàn)了聚合的思想
這里把 父項(xiàng)目Parent 項(xiàng)目的 Pom.xml 配置復(fù)制出來,幫助大家后續(xù)排查問題
<?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 父子模塊項(xiàng)目</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!--打包方式-->
<packaging>pom</packaging>
<modules>
<!-- 配置子項(xiàng)目-->
<!-- 對(duì)應(yīng)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?的作用是運(yùn)行?mvn package?時(shí)會(huì)將項(xiàng)目打包為可運(yùn)行的 jar 包,java -jar?運(yùn)行即可
如果不加這個(gè)?plugins,java -jar xxx.jar?會(huì)報(bào)出如下錯(cuò)誤
xxx/target/bootdemo-remote-api-0.0.1-SNAPSHOT.jar中沒有主清單屬性
4.3.修改子項(xiàng)目pom.xml 信息
創(chuàng)建后的子項(xiàng)目的 Parent 信息是 SpringBoot 配置,修改后如下
<parent>
<groupId>com.ykx.center</groupId>
<artifactId>centerparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
4.4.補(bǔ)充說明
另外說一下?dependencies?和?dependencyManagement?標(biāo)簽做一個(gè)講解
1)dependencies
????????如果 Parent 項(xiàng)目中使用?dependencies?標(biāo)簽,標(biāo)簽內(nèi)的依賴默認(rèn)傳遞子 Module,不用子 Module 進(jìn)行顯示書寫依賴
2)dependencyManagement
????????dependencyManagement?與dependencies?不同的是,標(biāo)簽內(nèi)的依賴不會(huì)默認(rèn)傳遞子 Module,其作用只是為了統(tǒng)一版本聲明????????
????????如果子 Module 依賴 Parent 項(xiàng)目中?dependencyManagement?標(biāo)簽內(nèi)的 pom 依賴,需要顯示在子 Module 的 pom 文件中進(jìn)行書寫
例如
在父項(xiàng)目的POM.xml中配置:
<dependencyManagement>
? ? ? ? <dependencies>
? ? ? ? ? ? <dependency>
? ? ? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? ? ? <artifactId>spring-boot-starter-web</artifactId>
? ? ? ? ? ? ? ? <version>1.2.3.RELEASE</version>
? ? ? ? ? ? </dependency>
? ? ? ? </dependencies>
? ? </dependencyManagement>
此配置即生命了spring-boot的版本信息。
子項(xiàng)目則無需指定版本信息:
<dependency>
? ? <groupId>org.springframework.boot</groupId>
? ? <artifactId>spring-boot-starter-web</artifactId>
</dependency>
5. 項(xiàng)目繼承關(guān)系
我們按照《構(gòu)建子 Module》章節(jié)的內(nèi)容,構(gòu)建出如下所述的子 Module,如果centerweb項(xiàng)目引用centerdao項(xiàng)目
<!--引用dao項(xiàng)目-->
<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子項(xiàng)目</description>
<properties>
<java.version>1.8</java.version>
<centerdao.version>0.0.1-SNAPSHOT</centerdao.version>
</properties>
<dependencies>
<!--引用dao項(xiàng)目-->
<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>
通過繼承關(guān)系的設(shè)置,centerdao?中的代碼就可以被?centerweb? 項(xiàng)目進(jìn)行引用
6. 驗(yàn)證項(xiàng)目
在 Parent 項(xiàng)目 pom.xml中 dependencies 標(biāo)簽中定義了?spring-boot-starter-web?依賴,直接使用 web 相關(guān)內(nèi)容即可,直接可以運(yùn)行
在centerweb中創(chuàng)建 Controller 控制器
@RestController
public class DemoController {
@RequestMapping("/ok")
public String test() {
return "OK";
}
}
啟動(dòng)項(xiàng)目
啟動(dòng)后端項(xiàng)目成功后,使用restfultool請求接口
7.異常處理?
如果遇到項(xiàng)目搭建后,模塊項(xiàng)目無啟動(dòng)類的情況,參考:
https://www.somode.com/softjc/43094.html
8.結(jié)語
由于作者水平有限, 希望大家能夠反饋指正文章中錯(cuò)誤不正確的地方, 感謝 ??
小伙伴的喜歡就是對(duì)我最大的支持 ?? , 希望大家能夠?點(diǎn)贊、評(píng)論、在看三連文章來源:http://www.zghlxwxcb.cn/news/detail-440167.html
鳴謝
[1].https://blog.csdn.net/qq_37781649/article/details/109321248文章來源地址http://www.zghlxwxcb.cn/news/detail-440167.html
到了這里,關(guān)于IDEA 搭建 Maven模塊化項(xiàng)目的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!