idea創(chuàng)建springboot父子module項(xiàng)目的實(shí)現(xiàn)方法
本文講解"idea創(chuàng)建springboot父子module項(xiàng)目的實(shí)現(xiàn)方法",希望能夠解決相關(guān)問(wèn)題。
目錄- 前言
- 1. 軟硬件環(huán)境
- 2. 創(chuàng)建 springboot 項(xiàng)目
- 3. 構(gòu)建子 module
- 4. 建立父子 module 依賴(lài)
- 4.1 修改 parent 項(xiàng)目 packaging
- 4.2 修改 module pom.xml 信息
- 4.3 刪除不必要文件
- 5. 項(xiàng)目繼承關(guān)系
- 6. 發(fā)布 web 服務(wù)
前言
作者正在籌備一個(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,客戶(hù)端相關(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 文件依賴(lài)組件
這里選擇的 springboot 版本是 2.2.10,選擇了 spring web 當(dāng)作 maven 依賴(lài)項(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 依賴(lài),后面會(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 依賴(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
- 修改 module 項(xiàng)目 pom.xml 文件依賴(lài) parent 項(xiàng)目
- 刪除不必要文件并梳理 pom.xml 依賴(lài)上下級(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)目聚合和依賴(lài)傳遞使用
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)的依賴(lài)默認(rèn)傳遞子 module,不用子 module 進(jìn)行顯示書(shū)寫(xiě)依賴(lài)
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
<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 依賴(lài),直接使用 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)方法" 就介紹到此。希望多多支持碩編程。