IDEA創(chuàng)建SpringBoot父子Module項(xiàng)目的實(shí)現(xiàn)
前言
作者正在籌備一個(gè)專(zhuān)題 《SpringCloud Alibaba 源碼解析》,會(huì)在正式發(fā)布 SpringCloud Alibaba 源碼系列文章之前,將一些準(zhǔn)備工作先做好
- 創(chuàng)建 SpringBoot 父子模塊項(xiàng)目
- Docker 安裝 Nacos Server 端
- Docker 安裝 RocketMQ 端
- …
本篇文章從第一步開(kāi)始詳細(xì)講解如何 《創(chuàng)建 SpringBoot 父子模塊項(xiàng)目》
如果將 SpringBoot 框架用作與單體項(xiàng)目,可能不存在多模塊的情況
但是并不代表沒(méi)有,因?yàn)楦缸幽K并不局限于微服務(wù),單體項(xiàng)目也可以進(jìn)行明確的職責(zé)劃分
如果是構(gòu)建微服務(wù)項(xiàng)目,基本上會(huì)對(duì)模塊進(jìn)行明確的劃分,比如:
- 抽象定義公共代碼及Util封裝進(jìn)行引用
- 業(yè)務(wù)代碼進(jìn)行單獨(dú)定義模塊
- 數(shù)據(jù)庫(kù)等DB操作相關(guān)抽離單獨(dú)模塊
- 提供外部平臺(tái)調(diào)取的接口單獨(dú)定義模塊
- …
上面的拆分也并非絕對(duì),隨著架構(gòu)師對(duì)于項(xiàng)目結(jié)構(gòu)的不同理解,可能會(huì)衍生出不同的模塊
比較經(jīng)典的就是 Dubbo 將接口 API 進(jìn)行抽離提供生產(chǎn)者接口,打?yàn)?Jar 包供消費(fèi)端調(diào)用
本篇文章也會(huì)從零到一創(chuàng)建 SpringBoot 父子模塊的項(xiàng)目,演示聚合、繼承的項(xiàng)目特性,并針對(duì)不引人注意的知識(shí)點(diǎn)進(jìn)行講解
在這里假設(shè)讀者小伙伴已經(jīng) 掌握了什么是 SpringBoot 概念
1. 軟硬件環(huán)境
- 電腦: McaBook Pro
- 創(chuàng)建項(xiàng)目工具: IDEA 2019.3.4
- JDK 版本: 還能再堅(jiān)持20年的 JDK8
- Maven版本: 3.5.4
2. 創(chuàng)建 SpringBoot 項(xiàng)目
1)首先打開(kāi) IDEA 工具,點(diǎn)擊 + Create New Project
2)選擇 Spring Initializr(初始化),選擇Project SDK 1.8,使用默認(rèn)的 SpringBoot 腳手架即可
大家可以訪問(wèn) Default 的網(wǎng)址,在這個(gè)網(wǎng)址中也可以進(jìn)行 SpringBoot 項(xiàng)目的創(chuàng)建
3)創(chuàng)建項(xiàng)目詳細(xì)信息,會(huì)逐一進(jìn)行講解
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,還是以 Nacos 舉例,因?yàn)樽罱诳此?/p>
Nacos 不同功能組件的 artifactId 各不相同,比如權(quán)限相關(guān)的子模塊就是 nacos-auth,客戶端相關(guān)是 nacos-client,具體到了項(xiàng)目功能組件
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)
最終定義項(xiàng)目選項(xiàng)及配置名稱(chēng)如下,點(diǎn)擊 Next 按鈕繼續(xù)進(jìn)行
4)選擇 SpringBoot 版本信息以及 Pom.xml 文件依賴組件
這里選擇的 SpringBoot 版本是 2.2.10,選擇了 Spring Web 當(dāng)作 Maven 依賴項(xiàng)
后續(xù)會(huì)使用發(fā)布 Web 測(cè)試項(xiàng)目整體是否成功,接下來(lái)點(diǎn)擊 Next 繼續(xù)進(jìn)行下一步
5)這里需要確定項(xiàng)目名稱(chēng)以及項(xiàng)目的存放地址,確認(rèn)無(wú)誤點(diǎn)擊 Finish
6)一個(gè)標(biāo)準(zhǔn)的 SpringBoot 項(xiàng)目就產(chǎn)生了
3. 構(gòu)建子 Module
1)Mac 電腦是點(diǎn)擊菜單欄中 File -> New -> Module,Windos 中可能會(huì)有一點(diǎn)差異
2)這里就是重復(fù)上述在創(chuàng)建 SpringBoot 項(xiàng)目時(shí)的步驟,Next 下一步
3)Group 與 Parent 項(xiàng)目保持一致即可,Artifact 修改為 Module 項(xiàng)目作用域名城即可
4)配置可按照需求進(jìn)行選擇,因?yàn)椴煌?Module 需要引用不同的 Pom 依賴,后面會(huì)與 Parent 保持一個(gè)交互
5)確認(rèn)創(chuàng)建信息,點(diǎn)擊 Finish 生成項(xiàng)目
6)最終結(jié)構(gòu)目錄如下,項(xiàng)目已成功創(chuàng)建,后續(xù)我們要修改其中的 Pom.xml 使其成為真正的父子項(xiàng)目
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
- 修改 Module 項(xiàng)目 Pom.xml 文件依賴 Parent 項(xiàng)目
- 刪除不必要文件并梳理 Pom.xml 依賴上下級(jí)關(guān)系
4.1 修改 Parent 項(xiàng)目 packaging
打開(kāi) Parent 項(xiàng)目的根 Pom.xml 文件,新增下方代碼
<packaging>pom</packaging> <modules> <module>bootdemo-remote-api</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)了聚合的思想
這里把 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.2.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>cn.machen.bootdemo</groupId> <artifactId>bootdemo-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <name>bootdemo-parent</name> <description>創(chuàng)建 SpringBoot 父子模塊項(xiàng)目</description> <packaging>pom</packaging> <modules> <module>bootdemo-remote-api</module> <module>bootdemo-biz</module> </modules> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </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.2 修改 Module Pom.xml 信息
創(chuàng)建后的 Module 項(xiàng)目的 Parent 信息是 SpringBoot 配置,修改后如下
<?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>cn.machen.bootdemo</groupId> <artifactId>bootdemo-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>bootdemo-remote-api</artifactId> <version>0.0.1-SNAPSHOT</version> <name>bootdemo-remote-api</name> <description>SpringBoot Module 項(xiàng)目</description> <properties> <java.version>1.8</java.version> </properties> </project>
4.3 刪除不必要文件
刪除 bootdemo-parent 項(xiàng)目下 src 包,因?yàn)?bootdemo-parent 作為聚合型項(xiàng)目,不會(huì)產(chǎn)生業(yè)務(wù)數(shù)據(jù)以及相關(guān)配置
另外說(shuō)一下 dependencies 和 dependencyManagement 標(biāo)簽做一個(gè)講解
dependencies
如果 Parent 項(xiàng)目中使用 dependencies 標(biāo)簽,標(biāo)簽內(nèi)的依賴默認(rèn)傳遞子 Module,不用子 Module 進(jìn)行顯示書(shū)寫(xiě)依賴
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
<groupId>cn.machen.bootdemo</groupId> <artifactId>bootdemo-biz</artifactId> <version>0.0.1-SNAPSHOT</version>
然后修改 bootdemo-biz 子 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>cn.machen.bootdemo</groupId> <artifactId>bootdemo-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>bootdemo-biz</artifactId> <version>0.0.1-SNAPSHOT</version> <name>bootdemo-biz</name> <description>創(chuàng)建 SpringBoot 父子模塊業(yè)務(wù) Module</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!--繼承bootdemo-remote-api項(xiàng)目--> <dependency> <groupId>cn.machen.bootdemo</groupId> <artifactId>bootdemo-remote-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
通過(guò)繼承關(guān)系的設(shè)置,bootdemo-remote-api 中的代碼就可以被 bootdemo-biz Module 項(xiàng)目進(jìn)行引用
6. 發(fā)布 WEB 服務(wù)
在 Parent 項(xiàng)目 Pom.xml dependencies 標(biāo)簽中定義了 spring-boot-starter-web 依賴,直接使用 web 相關(guān)內(nèi)容即可
我們?cè)?bootdemo-biz 中創(chuàng)建 Controller 控制器
@RestController public class DemoController { @GetMapping("/echo/{name}") public String sayHello(@PathVariable("name") String name) { return "Hello World " + name; } }
啟動(dòng)后端項(xiàng)目成功后,瀏覽器輸入 http://localhost:8080/echo/mahua 請(qǐng)求后端服務(wù)
到此這篇關(guān)于IDEA創(chuàng)建SpringBoot父子Module項(xiàng)目的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)IDEA 創(chuàng)建SpringBoot父子項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Springboot中Mybatis與Mybatis-plus的區(qū)別詳解
MyBatis是一個(gè)優(yōu)秀的持久層框架,它對(duì)JDBC的操作數(shù)據(jù)庫(kù)的過(guò)程進(jìn)行封裝,MyBatisPlus (簡(jiǎn)稱(chēng) MP)是一個(gè) MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,本文將給大家介紹了在Springboot中Mybatis與Mybatis-plus的區(qū)別2023-12-12java數(shù)據(jù)結(jié)構(gòu)與算法之noDups去除重復(fù)項(xiàng)算法示例
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之noDups去除重復(fù)項(xiàng)算法實(shí)現(xiàn)技巧,程序代碼非常簡(jiǎn)單,關(guān)鍵在于循環(huán)與判定,需要的朋友可以參考下2016-08-08關(guān)于ResponseEntity類(lèi)和HttpEntity及跨平臺(tái)路徑問(wèn)題
這篇文章主要介紹了關(guān)于ResponseEntity類(lèi)和HttpEntity及跨平臺(tái)路徑問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07小程序與后端Java接口交互實(shí)現(xiàn)HelloWorld入門(mén)
本文主要介紹了小程序與后端Java接口交互實(shí)現(xiàn)HelloWorld入門(mén) ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07Spring boot通過(guò)切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過(guò)程
這篇文章主要介紹了Spring boot通過(guò)切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java應(yīng)用程序開(kāi)發(fā)學(xué)習(xí)之static關(guān)鍵字應(yīng)用
今天小編就為大家分享一篇關(guān)于Java應(yīng)用程序開(kāi)發(fā)學(xué)習(xí)之static關(guān)鍵字應(yīng)用,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12如何基于springcloud模擬RPC調(diào)用(Feign)
這篇文章主要介紹了如何基于springcloud模擬RPC調(diào)用(Feign),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04