IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn)
1.前言
為了更好地組織和管理項(xiàng)目代碼。通過將一個大型項(xiàng)目分解成多個模塊,每個模塊都可以獨(dú)立地編譯、測試和部署,從而提高項(xiàng)目的可維護(hù)性和可擴(kuò)展性。多模塊項(xiàng)目,適用于一些比較大的項(xiàng)目,通過合理的模塊拆分,實(shí)現(xiàn)代碼的復(fù)用,便于維護(hù)和管理。尤其是一些開源框架,也是采用多模塊的方式,提供插件集成,用戶可以根據(jù)需要配置指定的模塊。
構(gòu)建微服務(wù)項(xiàng)目,基本上會對模塊進(jìn)行明確的劃分,比如:
- 抽象定義公共代碼及工具類封裝進(jìn)行引用
- 業(yè)務(wù)代碼進(jìn)行單獨(dú)定義模塊
- 對外提供的接口服務(wù)單獨(dú)定義模塊
- 不同功能系統(tǒng)不同模塊
- ......
上面的拆分也并非絕對,隨著架構(gòu)師對于項(xiàng)目結(jié)構(gòu)的不同理解,可能會衍生出不同的模塊
本篇文章會詳細(xì)演示如何創(chuàng)建 SpringBoot 父子模塊的項(xiàng)目,針對部分知識點(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í)際對應(yīng) Java 的包的結(jié)構(gòu),是 main 目錄里 Java 的目錄結(jié)構(gòu)Group 也就是 groupId,分為多個段;一般情況下 第一段為域,第二段為公司,第三段為項(xiàng)目名稱。以 Nacos 源碼進(jìn)行舉例,Group 為 com.alibaba.nacos:com 為商業(yè)組織,alibaba 為公司名稱,nacos 就是項(xiàng)目名稱
Artifact: 項(xiàng)目的唯一的標(biāo)識符,實(shí)際對應(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 的一個版本,再堅(jiān)持 20 年的 JDK 1.8
Version: 當(dāng)前項(xiàng)目的一個版本,SNAPSHOT 為快照的意思
開發(fā)時一般使用此類型,因?yàn)閷τ?Maven 倉庫的同步較為友好,有不同緯度的同步選擇
Name: 定義項(xiàng)目名稱
Description: 定義項(xiàng)目描述信息,幫助別人更好的了解項(xiàng)目
Package: 定義 main.java 目錄下的結(jié)構(gòu)
3)選擇 SpringBoot 版本信息以及 Pom.xml 文件依賴組件
這里選擇的 SpringBoot 版本是 2.7.1,jdk8對應(yīng)2.*版本,點(diǎn)擊 Next 繼續(xù)進(jìn)行創(chuàng)建項(xiàng)目
4)一個標(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,不同版本中可能會有一點(diǎn)差異
2)這里就是重復(fù)上述在創(chuàng)建 SpringBoot 項(xiàng)目時的步驟,Next 下一步
3)配置可按照需求進(jìn)行選擇,因?yàn)椴煌?Module 需要引用不同的 Pom 依賴,后面會與 Parent 保持一個交互,確認(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)目作為整個項(xià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),需要改動以下幾點(diǎn)
修改 Parent 項(xiàng)目 Pom.xml 的打包方式 packaging 標(biāo)簽打包方式為 pom刪除不必要文件并梳理 Pom.xml 依賴上下級關(guān)系需要新加一個 modules 標(biāo)簽,包含所有子項(xiàng)目,將所有的子模塊都引入進(jìn)去
對于子工程中的 .xml 文件
修改子項(xiàng)目Module 項(xiàng)目 pom.xml中parent 標(biāo)簽為其父工程添加打包方式為 jar刪除依賴包:繼承父工程的依賴包
4.1 刪除不必要文件
1)刪除父項(xiàng)目紅框標(biāo)注的內(nèi)容:src 文件是保存源代碼的,可是我們的多模塊的代碼存放在多個架構(gòu)層中,所以不需要這個 src 來存放代碼
2)刪除除啟動項(xiàng)目centerweb之外的啟動文件和配置文件和啟動類
刪除后的項(xiàng)目結(jié)構(gòu)是這樣的:
4.2.修改 Parent 項(xiàng)目 packaging
打開 Parent 項(xiàng)目的根 Pom.xml 文件,新增下方代碼
<!--打包方式--> <packaging>pom</packaging> <modules> <!-- 配置子項(xiàng)目--> <!-- 對應(yīng)artifactId--> <module>centerdao</module> <module>centerweb</module> </modules>
packaging 包含三個值 Jar、War、Pom,默認(rèn) Jar的方式
首先來解釋下 packaging 為 Pom 的意思,宏觀而言即沒有代碼需要測試或者編譯,也沒有資源需要處理
Jar: 內(nèi)部調(diào)用或作為服務(wù)進(jìn)行發(fā)布使用
War: 需要部署的項(xiàng)目
Pom: 寓意為一個父級項(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)目--> <!-- 對應(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 時會將項(xiàng)目打包為可運(yùn)行的 jar 包,java -jar 運(yùn)行即可
如果不加這個 plugins,java -jar xxx.jar 會報(bào)出如下錯誤
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)簽做一個講解
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)的依賴不會默認(rèn)傳遞子 Module,其作用只是為了統(tǒng)一版本聲明
如果子 Module 依賴 Parent 項(xiàng)目中 dependencyManagement 標(biāo)簽內(nèi)的 pom 依賴,需要顯示在子 Module 的 pom 文件中進(jìn)行書寫
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"; } }
啟動項(xiàng)目
啟動后端項(xiàng)目成功后,使用restfultool請求接口
參考
IDEA 最便捷創(chuàng)建 SpringBoot 父子 Module 項(xiàng)目
到此這篇關(guān)于IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)IDEA搭建Maven模塊化項(xiàng)目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Spring動態(tài)生成Mysql存儲過程詳解
這篇文章主要介紹了Java Spring動態(tài)生成Mysql存儲過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下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ì)過程
Token是在服務(wù)端產(chǎn)生的,前端可以使用用戶名/密碼向服務(wù)端請求認(rèn)證(登錄),服務(wù)端認(rèn)證成功,服務(wù)端會返回?Token?給前端,Token可以使用自己的算法自定義,本文給大家介紹SpringBoot+vue+Axios實(shí)現(xiàn)Token令牌,感興趣的朋友一起看看吧2023-10-10mybatis-generator自動生成dao、mapping、bean配置操作
這篇文章主要介紹了mybatis-generator自動生成dao、mapping、bean配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08SpringBoot項(xiàng)目如何打war包問題詳解
傳統(tǒng)的部署方式:將項(xiàng)目打成war包,放入tomcat的webapps目錄下面,啟動tomcat,即可訪問.文中有非常詳細(xì)的介紹,對正在學(xué)習(xí)springboot的小伙伴很有幫助,需要的朋友可以參考下2021-05-05Java?8?Stream?處理數(shù)據(jù)方法匯總
這篇文章主要介紹了Java?8?Stream處理數(shù)據(jù),Stream是Java?8?新引入的一個包它讓我們能用聲明式的方式處理數(shù)據(jù),Stream流式處理相較于傳統(tǒng)方法簡潔高效,也便于進(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)和用法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12