IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn)
1.前言
為了更好地組織和管理項(xiàng)目代碼。通過(guò)將一個(gè)大型項(xiàng)目分解成多個(gè)模塊,每個(gè)模塊都可以獨(dú)立地編譯、測(cè)試和部署,從而提高項(xiàng)目的可維護(hù)性和可擴(kuò)展性。多模塊項(xiàng)目,適用于一些比較大的項(xiàng)目,通過(guò)合理的模塊拆分,實(shí)現(xiàn)代碼的復(fù)用,便于維護(hù)和管理。尤其是一些開(kāi)源框架,也是采用多模塊的方式,提供插件集成,用戶(hù)可以根據(jù)需要配置指定的模塊。
構(gòu)建微服務(wù)項(xiàng)目,基本上會(huì)對(duì)模塊進(jìn)行明確的劃分,比如:
- 抽象定義公共代碼及工具類(lèi)封裝進(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)首先打開(kāi) IDEA 工具,創(chuàng)建spring項(xiàng)目 ,點(diǎn)擊File ---->new ---> Create New Project

2)選擇 Spring Initializr(初始化),選擇Project SDK 1.8,類(lèi)型選擇maven,Java語(yǔ)言選擇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)目名稱(chēng)。以 Nacos 源碼進(jìn)行舉例,Group 為 com.alibaba.nacos:com 為商業(yè)組織,alibaba 為公司名稱(chēng),nacos 就是項(xiàng)目名稱(chēng)
Artifact: 項(xiàng)目的唯一的標(biāo)識(shí)符,實(shí)際對(duì)應(yīng)項(xiàng)目的名稱(chēng),就是項(xiàng)目根目錄的名稱(chēng),Artifact 即為 artifactId。
Type: 分為四種不同的類(lèi)型,日常我們選擇默認(rèn)第一條就行,也就是 Maven Project
Language: 開(kāi)發(fā)語(yǔ)言的話自然就是默認(rèn)的 Java
Packaging: 打包方式,分為 War 包 和 Jar 包,這里選擇 Jar 包
Java Version: 選擇 Java 的一個(gè)版本,再堅(jiān)持 20 年的 JDK 1.8
Version: 當(dāng)前項(xiàng)目的一個(gè)版本,SNAPSHOT 為快照的意思
開(kāi)發(fā)時(shí)一般使用此類(lèi)型,因?yàn)閷?duì)于 Maven 倉(cāng)庫(kù)的同步較為友好,有不同緯度的同步選擇
Name: 定義項(xiàng)目名稱(chēng)
Description: 定義項(xiàng)目描述信息,幫助別人更好的了解項(xiàng)目
Package: 定義 main.java 目錄下的結(jié)構(gòu)
3)選擇 SpringBoot 版本信息以及 Pom.xml 文件依賴(lài)組件
這里選擇的 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 依賴(lài),后面會(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依賴(lài),web項(xiàng)目作為整個(gè)項(xiàng)目的啟動(dòng)項(xiàng)目,繼續(xù)添加代碼簡(jiǎn)化依賴(lài)lombok

3)最終項(xiàng)目結(jié)構(gòu)如下

4. 建立父子 Module 依賴(lài)
將建立的 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 依賴(lài)上下級(jí)關(guān)系需要新加一個(gè) modules 標(biāo)簽,包含所有子項(xiàng)目,將所有的子模塊都引入進(jìn)去
對(duì)于子工程中的 .xml 文件
修改子項(xiàng)目Module 項(xiàng)目 pom.xml中parent 標(biāo)簽為其父工程添加打包方式為 jar刪除依賴(lài)包:繼承父工程的依賴(lài)包
4.1 刪除不必要文件
1)刪除父項(xiàng)目紅框標(biāo)注的內(nèi)容:src 文件是保存源代碼的,可是我們的多模塊的代碼存放在多個(gè)架構(gòu)層中,所以不需要這個(gè) src 來(lái)存放代碼
2)刪除除啟動(dòng)項(xiàng)目centerweb之外的啟動(dòng)文件和配置文件和啟動(dòng)類(lèi)

刪除后的項(xiàng)目結(jié)構(gòu)是這樣的:

4.2.修改 Parent 項(xiàng)目 packaging
打開(kāi) 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的方式
首先來(lái)解釋下 packaging 為 Pom 的意思,宏觀而言即沒(méi)有代碼需要測(cè)試或者編譯,也沒(méi)有資源需要處理
Jar: 內(nèi)部調(diào)用或作為服務(wù)進(jìn)行發(fā)布使用
War: 需要部署的項(xiàng)目
Pom: 寓意為一個(gè)父級(jí)項(xiàng)目,一般作為項(xiàng)目聚合和依賴(lài)傳遞使用
modules 代表了 Parent 項(xiàng)目下的子 Module,體現(xiàn)了聚合的思想
這里把 父項(xiàng)目Parent 項(xiàng)目的 Pom.xml 配置復(fù)制出來(lái),幫助大家后續(xù)排查問(wèn)題
<?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中沒(méi)有主清單屬性
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ǔ)充說(shuō)明
另外說(shuō)一下 dependencies 和 dependencyManagement 標(biāo)簽做一個(gè)講解
1)dependencies
如果 Parent 項(xiàng)目中使用 dependencies 標(biāo)簽,標(biāo)簽內(nèi)的依賴(lài)默認(rèn)傳遞子 Module,不用子 Module 進(jìn)行顯示書(shū)寫(xiě)依賴(lài)
2)dependencyManagement
dependencyManagement 與dependencies 不同的是,標(biāo)簽內(nèi)的依賴(lài)不會(huì)默認(rèn)傳遞子 Module,其作用只是為了統(tǒng)一版本聲明
如果子 Module 依賴(lài) Parent 項(xiàng)目中 dependencyManagement 標(biāo)簽內(nèi)的 pom 依賴(lài),需要顯示在子 Module 的 pom 文件中進(jìn)行書(shū)寫(xiě)
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ò)繼承關(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 依賴(lài),直接使用 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請(qǐng)求接口

參考
IDEA 最便捷創(chuàng)建 SpringBoot 父子 Module 項(xiàng)目
到此這篇關(guān)于IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)IDEA搭建Maven模塊化項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Stream流對(duì)多個(gè)字段進(jìn)行排序的方法
我們?cè)谔幚頂?shù)據(jù)的時(shí)候經(jīng)常會(huì)需要進(jìn)行排序后再返回給前端調(diào)用,比如按照時(shí)間升序排序,前端展示數(shù)據(jù)就是按時(shí)間先后進(jìn)行排序,下面這篇文章主要給大家介紹了關(guān)于Java中Stream流對(duì)多個(gè)字段進(jìn)行排序的相關(guān)資料,需要的朋友可以參考下2023-10-10
java面向?qū)ο?API(接口)與集合(ArrayList)
這篇文章主要介紹了Java語(yǔ)言面向?qū)ο蟮腁PI與集合,還是十分不錯(cuò)的,這里給大家分享下,需要的朋友可以參考,希望能夠給你帶來(lái)幫助2021-08-08
在Spring應(yīng)用中進(jìn)行單元測(cè)試的解析和代碼演示
在Spring應(yīng)用中進(jìn)行單元測(cè)試通常涉及到Spring TestContext Framework,它提供了豐富的注解和工具來(lái)支持單元測(cè)試和集成測(cè)試,以下是如何在Spring應(yīng)用中進(jìn)行單元測(cè)試的詳細(xì)解析和代碼演示,需要的朋友可以參考下2024-06-06
Java 實(shí)戰(zhàn)項(xiàng)目錘煉之網(wǎng)上圖書(shū)館管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java+jsp+servlet+mysql+ajax實(shí)現(xiàn)一個(gè)網(wǎng)上圖書(shū)館管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
spring?cloud?Gateway如何處理跨域問(wèn)題
這篇文章主要介紹了spring?cloud?Gateway如何處理跨域問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
java開(kāi)源好用的簡(jiǎn)繁轉(zhuǎn)換類(lèi)庫(kù)推薦
這篇文章主要為大家介紹了java開(kāi)源好用的簡(jiǎn)繁轉(zhuǎn)換類(lèi)庫(kù)推薦,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08

