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)源框架,也是采用多模塊的方式,提供插件集成,用戶可以根據(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)首先打開(kāi) IDEA 工具,創(chuàng)建spring項(xiàng)目 ,點(diǎn)擊File ---->new ---> Create New Project
2)選擇 Spring Initializr(初始化),選擇Project SDK 1.8,類型選擇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)目名稱。以 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: 開(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í)一般使用此類型,因?yàn)閷?duì)于 Maven 倉(cāng)庫(kù)的同步較為友好,有不同緯度的同步選擇
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ù)添加代碼簡(jiǎn)化依賴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 來(lái)存放代碼
2)刪除除啟動(dòng)項(xiàng)目centerweb之外的啟動(dòng)文件和配置文件和啟動(dòng)類
刪除后的項(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)目聚合和依賴傳遞使用
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)的依賴默認(rèn)傳遞子 Module,不用子 Module 進(jìn)行顯示書(shū)寫(xiě)依賴
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)行書(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 依賴,直接使用 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 Spring動(dòng)態(tài)生成Mysql存儲(chǔ)過(guò)程詳解
這篇文章主要介紹了Java Spring動(dòng)態(tài)生成Mysql存儲(chǔ)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java使用Runnable和Callable實(shí)現(xiàn)多線程的區(qū)別詳解
這篇文章主要為大家詳細(xì)介紹了Java使用Runnable和Callable實(shí)現(xiàn)多線程的區(qū)別之處,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-07-07SpringBoot+vue+Axios實(shí)現(xiàn)Token令牌的詳細(xì)過(guò)程
Token是在服務(wù)端產(chǎn)生的,前端可以使用用戶名/密碼向服務(wù)端請(qǐng)求認(rèn)證(登錄),服務(wù)端認(rèn)證成功,服務(wù)端會(huì)返回?Token?給前端,Token可以使用自己的算法自定義,本文給大家介紹SpringBoot+vue+Axios實(shí)現(xiàn)Token令牌,感興趣的朋友一起看看吧2023-10-10mybatis-generator自動(dòng)生成dao、mapping、bean配置操作
這篇文章主要介紹了mybatis-generator自動(dòng)生成dao、mapping、bean配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08SpringBoot項(xiàng)目如何打war包問(wèn)題詳解
傳統(tǒng)的部署方式:將項(xiàng)目打成war包,放入tomcat的webapps目錄下面,啟動(dòng)tomcat,即可訪問(wèn).文中有非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)springboot的小伙伴很有幫助,需要的朋友可以參考下2021-05-05Java?8?Stream?處理數(shù)據(jù)方法匯總
這篇文章主要介紹了Java?8?Stream處理數(shù)據(jù),Stream是Java?8?新引入的一個(gè)包它讓我們能用聲明式的方式處理數(shù)據(jù),Stream流式處理相較于傳統(tǒng)方法簡(jiǎn)潔高效,也便于進(jìn)行并發(fā)編程,更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容2022-06-06JAVA JDK8 List分組的實(shí)現(xiàn)和用法
今天小編就為大家分享一篇關(guān)于JAVA JDK8 List分組的實(shí)現(xiàn)和用法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12