高效構(gòu)建Java應(yīng)用:Maven入門和進(jìn)階
一、Maven簡(jiǎn)介和快速入門
1.1 Maven介紹
https://maven.apache.org/what-is-maven.html
Maven 是一款為 Java 項(xiàng)目構(gòu)建管理、依賴管理的工具(軟件),使用 Maven 可以自動(dòng)化構(gòu)建、測(cè)試、打包和發(fā)布項(xiàng)目,大大提高了開(kāi)發(fā)效率和質(zhì)量。
總結(jié):Maven就是一個(gè)軟件,掌握軟件安裝、配置、以及基本功能**(項(xiàng)目構(gòu)建、依賴管理)**使用就是本課程的主要目標(biāo)!
1.2 Maven主要作用理解
-
場(chǎng)景概念
**場(chǎng)景1:**例如我們項(xiàng)目需要第三方庫(kù)(依賴),如Druid連接池、MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)和Jackson等。那么我們可以將需要的依賴項(xiàng)的信息編寫到Maven工程的配置文件,Maven軟件就會(huì)自動(dòng)下載并復(fù)制這些依賴項(xiàng)到項(xiàng)目中,也會(huì)自動(dòng)下載依賴需要的依賴!確保依賴版本正確無(wú)沖突和依賴完整!
**場(chǎng)景2:**項(xiàng)目開(kāi)發(fā)完成后,想要將項(xiàng)目打成.war文件,并部署到服務(wù)器中運(yùn)行,使用Maven軟件,我們可以通過(guò)一行構(gòu)建命令(mvn package)快速項(xiàng)目構(gòu)建和打包!節(jié)省大量時(shí)間!
-
依賴管理:
Maven 可以管理項(xiàng)目的依賴,包括自動(dòng)下載所需依賴庫(kù)、自動(dòng)下載依賴需要的依賴并且保證版本沒(méi)有沖突、依賴版本管理等。通過(guò) Maven,我們可以方便地維護(hù)項(xiàng)目所依賴的外部庫(kù),而我們僅僅需要編寫配置即可。
-
構(gòu)建管理:
項(xiàng)目構(gòu)建是指將源代碼、配置文件、資源文件等轉(zhuǎn)化為能夠運(yùn)行或部署的應(yīng)用程序或庫(kù)的過(guò)程!
Maven 可以管理項(xiàng)目的編譯、測(cè)試、打包、部署等構(gòu)建過(guò)程。通過(guò)實(shí)現(xiàn)標(biāo)準(zhǔn)的構(gòu)建生命周期,Maven 可以確保每一個(gè)構(gòu)建過(guò)程都遵循同樣的規(guī)則和最佳實(shí)踐。同時(shí),Maven 的插件機(jī)制也使得開(kāi)發(fā)者可以對(duì)構(gòu)建過(guò)程進(jìn)行擴(kuò)展和定制。主動(dòng)觸發(fā)構(gòu)建,只需要簡(jiǎn)單的命令操作即可。
1.3 Maven安裝和配置
https://maven.apache.org/docs/history.html
選用版本:
發(fā)布時(shí)間 | maven版本 | jdk最低版本 |
---|---|---|
**2019 - 11 - **25 | **3.6.**3 | Java 7 |
-
安裝
**安裝條件:**maven需要本機(jī)安裝java環(huán)境、必需包含java_home環(huán)境變量!
**軟件安裝:**右鍵解壓即可(綠色免安裝)
軟件結(jié)構(gòu):
-
環(huán)境變量
**環(huán)境變量:**配置maven_home 和 path
-
命令測(cè)試
mvn -v
# 輸出版本信息即可,如果錯(cuò)誤,請(qǐng)仔細(xì)檢查環(huán)境變量即可!
# 友好提示,如果此處錯(cuò)誤,絕大部分原因都是java_home變量的事,請(qǐng)仔細(xì)檢查!!
-
配置文件
我們需要需改maven/conf/settings.xml配置文件,來(lái)修改maven的一些默認(rèn)配置。我們主要休要修改的有三個(gè)配置:1.依賴本地緩存位置(本地倉(cāng)庫(kù)位置)2.maven下載鏡像3.maven選用編譯項(xiàng)目的jdk版本!
- 配置本地倉(cāng)庫(kù)地址
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- conf/settings.xml 55行 -->
<localRepository>D:\repository</localRepository>
? 2. 配置國(guó)內(nèi)阿里鏡像
<!--在mirrors節(jié)點(diǎn)(標(biāo)簽)下添加中央倉(cāng)庫(kù)鏡像 160行附近-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
? 3. 配置jdk17版本項(xiàng)目構(gòu)建
<!--在profiles節(jié)點(diǎn)(標(biāo)簽)下添加jdk編譯版本 268行附近-->
<profile>
<id>jdk-17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>17</jdk>
</activation>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>
-
idea配置本地maven
我們需要將配置好的maven軟件,配置到idea開(kāi)發(fā)工具中即可! 注意:idea工具默認(rèn)自帶maven配置軟件,但是因?yàn)闆](méi)有修改配置,建議替換成本地配置好的maven!
-
打開(kāi)idea配置文件,構(gòu)建工具配置
依次點(diǎn)擊
file / settings / build / build tool / maven
-
-
選中本地maven軟件
-
測(cè)試是否配置成功
注意:如果本地倉(cāng)庫(kù)地址不變化,只有一個(gè)原因,就是maven/conf/settings.xml配置文件編寫錯(cuò)誤!仔細(xì)檢查即可!
二、基于IDEA的Maven工程創(chuàng)建
2.1梳理Maven工程GAVP屬性
Maven工程相對(duì)之前的工程,多出一組gavp屬性,gav需要我們?cè)趧?chuàng)建項(xiàng)目的時(shí)指定,p有默認(rèn)值,后期通過(guò)配置文件修改。既然要填寫的屬性,我們先行了解下這組屬性的含義!
Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四個(gè)屬性的縮寫,其中前三個(gè)是必要的,而 Packaging 屬性為可選項(xiàng)。這四個(gè)屬性主要為每個(gè)項(xiàng)目在maven倉(cāng)庫(kù)總做一個(gè)標(biāo)識(shí),類似人的《姓-名》。有了具體標(biāo)識(shí),方便maven軟件對(duì)項(xiàng)目進(jìn)行管理和互相引用!
GAV遵循一下規(guī)則:
1) GroupID 格式:com.{公司/BU }.業(yè)務(wù)線.[子業(yè)務(wù)線],最多 4 級(jí)。
說(shuō)明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一級(jí);子業(yè)務(wù)線可選。
正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang
2) ArtifactID 格式:產(chǎn)品線名-模塊名。語(yǔ)義不重復(fù)不遺漏,先到倉(cāng)庫(kù)中心去查證一下。
正例:tc-client / uic-api / tair-tool / bookstore
3) Version版本號(hào)格式推薦:主版本號(hào).次版本號(hào).修訂號(hào) 1.0.0
1) 主版本號(hào):當(dāng)做了不兼容的 API 修改,或者增加了能改變產(chǎn)品方向的新功能。
2) 次版本號(hào):當(dāng)做了向下兼容的功能性新增(新增類、接口等)。
3) 修訂號(hào):修復(fù) bug,沒(méi)有修改方法簽名的功能加強(qiáng),保持 API 兼容性。
例如: 初始→1.0.0 修改bug → 1.0.1 功能調(diào)整 → 1.1.1等
Packaging定義規(guī)則:
指示將項(xiàng)目打包為什么類型的文件,idea根據(jù)packaging值,識(shí)別maven項(xiàng)目類型!
packaging 屬性為 jar(默認(rèn)值),代表普通的Java工程,打包以后是.jar結(jié)尾的文件。
packaging 屬性為 war,代表Java的web工程,打包以后.war結(jié)尾的文件。
packaging 屬性為 pom,代表不會(huì)打包,用來(lái)做繼承的父工程。
2.2 Idea構(gòu)建Maven JavaSE工程
注意:此處省略了version,直接給了一個(gè)默認(rèn)值1.0-SNAPSHOT
自己后期可以在項(xiàng)目中隨意修改!
2.3 Idea構(gòu)建Maven JavaEE工程
-
手動(dòng)創(chuàng)建
-
創(chuàng)建一個(gè)javasemaven工程
-
手動(dòng)添加web項(xiàng)目結(jié)構(gòu)文件
注意:結(jié)構(gòu)和命名固定
-
-
修改pom.xml文件打包方式
修改位置:項(xiàng)目下/pom.xml
<groupId>com.xxxx</groupId>
<artifactId>maven_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 新增一列打包方式packaging -->
<packaging>war</packaging>
- 刷新和校驗(yàn)
項(xiàng)目的webapp文件夾出現(xiàn)小藍(lán)點(diǎn),代表成功!!
-
插件方式創(chuàng)建
-
安裝插件JBLJavaToWeb
file / settings / plugins / marketplace
-
2. 創(chuàng)建一個(gè)javasemaven工程
- 右鍵、使用插件快速補(bǔ)全web項(xiàng)目
2.4 Maven工程項(xiàng)目結(jié)構(gòu)說(shuō)明
Maven 是一個(gè)強(qiáng)大的構(gòu)建工具,它提供一種標(biāo)準(zhǔn)化的項(xiàng)目結(jié)構(gòu),可以幫助開(kāi)發(fā)者更容易地管理項(xiàng)目的依賴、構(gòu)建、測(cè)試和發(fā)布等任務(wù)。以下是 Maven Web 程序的文件結(jié)構(gòu)及每個(gè)文件的作用:
|-- pom.xml # Maven 項(xiàng)目管理文件
|-- src
|-- main # 項(xiàng)目主要代碼
| |-- java # Java 源代碼目錄
| | `-- com/example/myapp # 開(kāi)發(fā)者代碼主目錄
| | |-- controller # 存放 Controller 層代碼的目錄
| | |-- service # 存放 Service 層代碼的目錄
| | |-- dao # 存放 DAO 層代碼的目錄
| | `-- model # 存放數(shù)據(jù)模型的目錄
| |-- resources # 資源目錄,存放配置文件、靜態(tài)資源等
| | |-- log4j.properties # 日志配置文件
| | |-- spring-mybatis.xml # Spring Mybatis 配置文件
| | `-- static # 存放靜態(tài)資源的目錄
| | |-- css # 存放 CSS 文件的目錄
| | |-- js # 存放 JavaScript 文件的目錄
| | `-- images # 存放圖片資源的目錄
| `-- webapp # 存放 WEB 相關(guān)配置和資源
| |-- WEB-INF # 存放 WEB 應(yīng)用配置文件
| | |-- web.xml # Web 應(yīng)用的部署描述文件
| | `-- classes # 存放編譯后的 class 文件
| `-- index.html # Web 應(yīng)用入口頁(yè)面
`-- test # 項(xiàng)目測(cè)試代碼
|-- java # 單元測(cè)試目錄
`-- resources # 測(cè)試資源目錄
- pom.xml:Maven 項(xiàng)目管理文件,用于描述項(xiàng)目的依賴和構(gòu)建配置等信息。
- src/main/java:存放項(xiàng)目的 Java 源代碼。
- src/main/resources:存放項(xiàng)目的資源文件,如配置文件、靜態(tài)資源等。
- src/main/webapp/WEB-INF:存放 Web 應(yīng)用的配置文件。
- src/main/webapp/index.html:Web 應(yīng)用的入口頁(yè)面。
- src/test/java:存放項(xiàng)目的測(cè)試代碼。
- src/test/resources:存放測(cè)試相關(guān)的資源文件,如測(cè)試配置文件等。
三、Maven核心功能依賴和構(gòu)建管理
3.1 依賴管理和配置
Maven 依賴管理是 Maven 軟件中最重要的功能之一。Maven 的依賴管理能夠幫助開(kāi)發(fā)人員自動(dòng)解決軟件包依賴問(wèn)題,使得開(kāi)發(fā)人員能夠輕松地將其他開(kāi)發(fā)人員開(kāi)發(fā)的模塊或第三方框架集成到自己的應(yīng)用程序或模塊中,避免出現(xiàn)版本沖突和依賴缺失等問(wèn)題。
我們通過(guò)定義 POM 文件,Maven 能夠自動(dòng)解析項(xiàng)目的依賴關(guān)系,并通過(guò) Maven 倉(cāng)庫(kù)自動(dòng)下載和管理依賴,從而避免了手動(dòng)下載和管理依賴的繁瑣工作和可能引發(fā)的版本沖突問(wèn)題。
重點(diǎn): 編寫pom.xml文件!
maven項(xiàng)目信息屬性配置和讀?。?/p>
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者組織的唯一標(biāo)志,并且配置時(shí)生成的路徑也是由此生成, 如com.companyname.project-group,maven會(huì)將該項(xiàng)目打成的jar包放本地路徑:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 項(xiàng)目的唯一ID,一個(gè)groupId下面可能多個(gè)項(xiàng)目,就是靠artifactId來(lái)區(qū)分的 -->
<artifactId>project</artifactId>
<!-- 版本號(hào) -->
<version>1.0.0</version>
<!--打包方式
默認(rèn):jar
jar指的是普通的java項(xiàng)目打包方式! 項(xiàng)目打成jar包!
war指的是web項(xiàng)目打包方式!項(xiàng)目打成war包!
pom不會(huì)講項(xiàng)目打包!這個(gè)項(xiàng)目作為父工程,被其他工程聚合或者繼承!后面會(huì)講解兩個(gè)概念
-->
<packaging>jar/pom/war</packaging>
依賴管理和添加:
<!--
通過(guò)編寫依賴jar包的gav必要屬性,引入第三方依賴!
scope屬性是可選的,可以指定依賴生效范圍!
依賴信息查詢方式:
1. maven倉(cāng)庫(kù)信息官網(wǎng) https://mvnrepository.com/
2. mavensearch插件搜索
-->
<dependencies>
<!-- 引入具體的依賴包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<!--
生效范圍
- compile :main目錄 test目錄 打包打包 [默認(rèn)]
- provided:main目錄 test目錄 Servlet
- runtime: 打包運(yùn)行 MySQL
- test: test目錄 junit
-->
<scope>runtime</scope>
</dependency>
</dependencies>
依賴版本提取和維護(hù):
<!--聲明版本-->
<properties>
<!--命名隨便,內(nèi)部制定版本號(hào)即可!-->
<junit.version>4.11</junit.version>
<!-- 也可以通過(guò) maven規(guī)定的固定的key,配置maven的參數(shù)!如下配置編碼格式!-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--引用properties聲明版本 -->
<version>${junit.version}</version>
</dependency>
</dependencies>
3.2依賴傳遞和沖突
依賴傳遞指的是當(dāng)一個(gè)模塊或庫(kù) A 依賴于另一個(gè)模塊或庫(kù) B,而 B 又依賴于模塊或庫(kù) C,那么 A 會(huì)間接依賴于 C。這種依賴傳遞結(jié)構(gòu)可以形成一個(gè)依賴樹(shù)。當(dāng)我們引入一個(gè)庫(kù)或框架時(shí),構(gòu)建工具(如 Maven、Gradle)會(huì)自動(dòng)解析和加載其所有的直接和間接依賴,確保這些依賴都可用。
依賴傳遞的作用是:
- 減少重復(fù)依賴:當(dāng)多個(gè)項(xiàng)目依賴同一個(gè)庫(kù)時(shí),Maven 可以自動(dòng)下載并且只下載一次該庫(kù)。這樣可以減少項(xiàng)目的構(gòu)建時(shí)間和磁盤空間。
- 自動(dòng)管理依賴: Maven 可以自動(dòng)管理依賴項(xiàng),使用依賴傳遞,簡(jiǎn)化了依賴項(xiàng)的管理,使項(xiàng)目構(gòu)建更加可靠和一致。
- 確保依賴版本正確性:通過(guò)依賴傳遞的依賴,之間都不會(huì)存在版本兼容性問(wèn)題,確實(shí)依賴的版本正確性!
依賴傳遞演示:
項(xiàng)目中,需要導(dǎo)入jackson相關(guān)的依賴,通過(guò)之前導(dǎo)入經(jīng)驗(yàn),jackson需要導(dǎo)入三個(gè)依賴,分別為:
通過(guò)查看網(wǎng)站介紹的依賴傳遞特性:data-bind中,依賴其他兩個(gè)依賴
最佳導(dǎo)入:直接可以導(dǎo)入data-bind,自動(dòng)依賴傳遞需要的依賴
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
依賴沖突演示:
當(dāng)直接引用或者間接引用出現(xiàn)了相同的jar包! 這時(shí)呢,一個(gè)項(xiàng)目就會(huì)出現(xiàn)相同的重復(fù)jar包,這就算作沖突!依賴沖突避免出現(xiàn)重復(fù)依賴,并且終止依賴傳遞!
maven自動(dòng)解決依賴沖突問(wèn)題能力,會(huì)按照自己的原則,進(jìn)行重復(fù)依賴選擇。同時(shí)也提供了手動(dòng)解決的沖突的方式,不過(guò)不推薦!
解決依賴沖突(如何選擇重復(fù)依賴)方式:
-
自動(dòng)選擇原則
-
短路優(yōu)先原則(第一原則)
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
則A依賴于X(version 0.0.2)。
-
依賴路徑長(zhǎng)度相同情況下,則“先聲明優(yōu)先”(第二原則)
A—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
在中,先聲明的,路徑相同,會(huì)優(yōu)先選擇!
-
小思考:
前提:
A 1.1 -> B 1.1 -> C 1.1
F 2.2 -> B 2.2
pom聲明:
F 2.2
A 1.1
B 2.2
3.3 依賴導(dǎo)入失敗場(chǎng)景和解決方案
在使用 Maven 構(gòu)建項(xiàng)目時(shí),可能會(huì)發(fā)生依賴項(xiàng)下載錯(cuò)誤的情況,主要原因有以下幾種:
- 下載依賴時(shí)出現(xiàn)網(wǎng)絡(luò)故障或倉(cāng)庫(kù)服務(wù)器宕機(jī)等原因,導(dǎo)致無(wú)法連接至 Maven 倉(cāng)庫(kù),從而無(wú)法下載依賴。
- 依賴項(xiàng)的版本號(hào)或配置文件中的版本號(hào)錯(cuò)誤,或者依賴項(xiàng)沒(méi)有正確定義,導(dǎo)致 Maven 下載的依賴項(xiàng)與實(shí)際需要的不一致,從而引發(fā)錯(cuò)誤。
- 本地 Maven 倉(cāng)庫(kù)或緩存被污染或損壞,導(dǎo)致 Maven 無(wú)法正確地使用現(xiàn)有的依賴項(xiàng),并且也無(wú)法重新下載!
解決方案:
-
檢查網(wǎng)絡(luò)連接和 Maven 倉(cāng)庫(kù)服務(wù)器狀態(tài)。
-
確保依賴項(xiàng)的版本號(hào)與項(xiàng)目對(duì)應(yīng)的版本號(hào)匹配,并檢查 POM 文件中的依賴項(xiàng)是否正確。
-
清除本地 Maven 倉(cāng)庫(kù)緩存(lastUpdated 文件),因?yàn)橹灰嬖趌astupdated緩存文件,刷新也不會(huì)重新下載。本地倉(cāng)庫(kù)中,根據(jù)依賴的gav屬性依次向下查找文件夾,最終刪除內(nèi)部的文件,刷新重新下載即可!
例如: pom.xml依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
? 文件:
腳本使用:
使用記事本打開(kāi)
set REPOSITORY_PATH=D:\repository 改成你本地倉(cāng)庫(kù)地址即可!
點(diǎn)擊運(yùn)行腳本,即可自動(dòng)清理本地錯(cuò)誤緩存文件??!
3.4 擴(kuò)展構(gòu)建管理和插件配置
構(gòu)建概念:
項(xiàng)目構(gòu)建是指將源代碼、依賴庫(kù)和資源文件等轉(zhuǎn)換成可執(zhí)行或可部署的應(yīng)用程序的過(guò)程,在這個(gè)過(guò)程中包括編譯源代碼、鏈接依賴庫(kù)、打包和部署等多個(gè)步驟。
主動(dòng)觸發(fā)場(chǎng)景:
- 重新編譯 : 編譯不充分, 部分文件沒(méi)有被編譯!
- 打包 : 獨(dú)立部署到外部服務(wù)器軟件,打包部署
- 部署本地或者私服倉(cāng)庫(kù) : maven工程加入到本地或者私服倉(cāng)庫(kù),供其他工程使用
命令方式構(gòu)建:
語(yǔ)法: mvn 構(gòu)建命令 構(gòu)建命令…
命令 | 描述 |
---|---|
mvn clean | 清理編譯或打包后的項(xiàng)目結(jié)構(gòu),刪除target文件夾 |
mvn compile | 編譯項(xiàng)目,生成target文件 |
mvn test | 執(zhí)行測(cè)試源碼 (測(cè)試) |
mvn site | 生成一個(gè)項(xiàng)目依賴信息的展示頁(yè)面 |
mvn package | 打包項(xiàng)目,生成war / jar 文件 |
mvn install | 打包后上傳到maven本地倉(cāng)庫(kù)(本地部署) |
mvn deploy | 只打包,上傳到maven私服倉(cāng)庫(kù)(私服部署) |
可視化方式構(gòu)建:
構(gòu)建命令周期:
構(gòu)建生命周期可以理解成是一組固定構(gòu)建命令的有序集合,觸發(fā)周期后的命令,會(huì)自動(dòng)觸發(fā)周期前的命令!也是一種簡(jiǎn)化構(gòu)建的思路!
-
清理周期:主要是對(duì)項(xiàng)目編譯生成文件進(jìn)行清理
包含命令:clean
-
默認(rèn)周期:定義了真正構(gòu)件時(shí)所需要執(zhí)行的所有步驟,它是生命周期中最核心的部分
包含命令:compile - test - package - install / deploy
-
報(bào)告周期
包含命令:site
打包: mvn clean package 本地倉(cāng)庫(kù): mvn clean install
最佳使用方案:
打包: mvn clean package
重新編譯: mvn clean compile
本地部署: mvn clean install
周期,命令和插件:
周期→包含若干命令→包含若干插件!
使用周期命令構(gòu)建,簡(jiǎn)化構(gòu)建過(guò)程!
最終進(jìn)行構(gòu)建的是插件!
插件配置:
<build>
<!-- jdk17 和 war包版本插件不匹配 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
四、Maven繼承和聚合特性
4.1 Maven工程繼承關(guān)系
-
繼承概念
Maven 繼承是指在 Maven 的項(xiàng)目中,讓一個(gè)項(xiàng)目從另一個(gè)項(xiàng)目中繼承配置信息的機(jī)制。繼承可以讓我們?cè)诙鄠€(gè)項(xiàng)目中共享同一配置信息,簡(jiǎn)化項(xiàng)目的管理和維護(hù)工作。
-
繼承作用
作用:在父工程中統(tǒng)一管理項(xiàng)目中的依賴信息,進(jìn)行統(tǒng)一版本管理!
它的背景是:
- 對(duì)一個(gè)比較大型的項(xiàng)目進(jìn)行了模塊拆分。
- 一個(gè) project 下面,創(chuàng)建了很多個(gè) module。
- 每一個(gè) module 都需要配置自己的依賴信息。
它背后的需求是:
- 多個(gè)模塊要使用同一個(gè)框架,它們應(yīng)該是同一個(gè)版本,所以整個(gè)項(xiàng)目中使用的框架版本需要統(tǒng)一管理。
- 使用框架時(shí)所需要的 jar 包組合(或者說(shuō)依賴信息組合)需要經(jīng)過(guò)長(zhǎng)期摸索和反復(fù)調(diào)試,最終確定一個(gè)可用組合。這個(gè)耗費(fèi)很大精力總結(jié)出來(lái)的方案不應(yīng)該在新的項(xiàng)目中重新摸索。
通過(guò)在父工程中為整個(gè)項(xiàng)目維護(hù)依賴信息的組合既保證了整個(gè)項(xiàng)目使用規(guī)范、準(zhǔn)確的 jar 包;又能夠?qū)⒁酝慕?jīng)驗(yàn)沉淀下來(lái),節(jié)約時(shí)間和精力。
-
繼承語(yǔ)法
- 父工程
<groupId>com.xxxx.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 當(dāng)前工程作為父工程,它要去管理子工程,所以打包方式必須是 pom -->
<packaging>pom</packaging>
? - 子工程
<!-- 使用parent標(biāo)簽指定當(dāng)前工程的父工程 -->
<parent>
<!-- 父工程的坐標(biāo) -->
<groupId>com.xxxx.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 子工程的坐標(biāo) -->
<!-- 如果子工程坐標(biāo)中的groupId和version與父工程一致,那么可以省略 -->
<!-- <groupId>com.xxxx.maven</groupId> -->
<artifactId>pro04-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->
- 父工程依賴統(tǒng)一管理
- 父工程聲明版本
<!-- 使用dependencyManagement標(biāo)簽配置對(duì)依賴的管理 -->
<!-- 被管理的依賴并沒(méi)有真正被引入到工程 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
? - 子工程引用版本
<!-- 子工程引用父工程中的依賴信息時(shí),可以把版本號(hào)去掉。 -->
<!-- 把版本號(hào)去掉就表示子工程中這個(gè)依賴的版本由父工程決定。 -->
<!-- 具體來(lái)說(shuō)是由父工程的dependencyManagement來(lái)決定。 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
</dependencies>
4.2 Maven工程聚合關(guān)系
-
聚合概念
Maven 聚合是指將多個(gè)項(xiàng)目組織到一個(gè)父級(jí)項(xiàng)目中,通過(guò)觸發(fā)父工程的構(gòu)建,統(tǒng)一按順序觸發(fā)子工程構(gòu)建的過(guò)程!!
-
聚合作用
- 統(tǒng)一管理子項(xiàng)目構(gòu)建:通過(guò)聚合,可以將多個(gè)子項(xiàng)目組織在一起,方便管理和維護(hù)。
- 優(yōu)化構(gòu)建順序:通過(guò)聚合,可以對(duì)多個(gè)項(xiàng)目進(jìn)行順序控制,避免出現(xiàn)構(gòu)建依賴混亂導(dǎo)致構(gòu)建失敗的情況。
-
聚合語(yǔ)法
父項(xiàng)目中包含的子項(xiàng)目列表。
<project>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<modules>
<module>child-project1</module>
<module>child-project2</module>
</modules>
</project>
-
聚合演示
通過(guò)觸發(fā)父工程構(gòu)建命令、引發(fā)所有子模塊構(gòu)建!產(chǎn)生反應(yīng)堆!
五、Maven實(shí)戰(zhàn)案例:搭建微服務(wù)Maven工程架構(gòu)
5.1 項(xiàng)目需求和結(jié)構(gòu)分析
需求案例:搭建一個(gè)電商平臺(tái)項(xiàng)目,該平臺(tái)包括用戶服務(wù)、訂單服務(wù)、通用工具模塊等。
項(xiàng)目架構(gòu):
- 用戶服務(wù):負(fù)責(zé)處理用戶相關(guān)的邏輯,例如用戶信息的管理、用戶注冊(cè)、登錄等。
- 訂單服務(wù):負(fù)責(zé)處理訂單相關(guān)的邏輯,例如訂單的創(chuàng)建、訂單支付、退貨、訂單查看等。
- 通用模塊:負(fù)責(zé)存儲(chǔ)其他服務(wù)需要通用工具類,其他服務(wù)依賴此模塊。
服務(wù)依賴:
- 用戶服務(wù) (1.0.1)
- spring-context 6.0.6
- spring-core 6.0.6
- spring-beans 6.0.6
- jackson-databind / jackson-core / jackson-annotations 2.15.0
- 訂單服務(wù) (1.0.1)
- shiro-core 1.10.1
- spring-context 6.0.6
- spring-core 6.0.6
- spring-beans 6.0.6
- 通用模塊 (1.0.1)
- commons-io 2.11.0
5.2項(xiàng)目搭建和統(tǒng)一構(gòu)建
- 父模塊搭建 (micro-shop)
- 創(chuàng)建父工程
- 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxxx</groupId>
<artifactId>micro-shop</artifactId>
<version>1.0.1</version>
<!-- 父工程不打包,所以選擇pom值-->
<packaging>pom</packaging>
<properties>
<spring.version>6.0.6</spring.version>
<jackson.version>2.15.0</jackson.version>
<shiro.version>1.10.1</shiro.version>
<commons.version>2.11.0</commons.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依賴管理 -->
<dependencyManagement>
<dependencies>
<!-- spring-context會(huì)依賴傳遞core/beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- jackson-databind會(huì)依賴傳遞core/annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- shiro-core -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 父工程添加依賴,會(huì)自動(dòng)傳遞給所有子工程,不推薦! -->
</dependencies>
<!-- 統(tǒng)一更新子工程打包插件-->
<build>
<!-- jdk17 和 war包版本插件不匹配 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
</project>
- 通用模塊 (common-service)
- 創(chuàng)建模塊
- 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xxxx</groupId>
<artifactId>micro-shop</artifactId>
<version>1.0.1</version>
</parent>
<artifactId>common-service</artifactId>
<!-- 打包方式默認(rèn)就是jar! -->
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 聲明commons-io,繼承父工程版本 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
</dependencies>
</project>
- 用戶模塊 (user-service)
- 創(chuàng)建模塊
- 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xxxx</groupId>
<artifactId>micro-shop</artifactId>
<version>1.0.1</version>
</parent>
<artifactId>user-service</artifactId>
<packaging>war</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 添加spring-context 自動(dòng)傳遞 core / beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!-- 添加jackson-databind 自動(dòng)傳遞 core / annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
- 訂單模塊 (order-service)
- 創(chuàng)建模塊
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-786138.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-786138.html
- 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xxxx</groupId>
<artifactId>micro-shop</artifactId>
<version>1.0.1</version>
</parent>
<artifactId>order-service</artifactId>
<packaging>war</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 繼承父工程依賴版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!-- 繼承父工程依賴版本 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
</dependency>
</dependencies>
</project>
六、Maven核心掌握總結(jié)
核心點(diǎn) | 掌握目標(biāo) |
---|---|
安裝 | maven安裝、環(huán)境變量、maven配置文件修改 |
工程創(chuàng)建 | gavp屬性理解、JavaSE/EE工程創(chuàng)建、項(xiàng)目結(jié)構(gòu) |
依賴管理 | 依賴添加、依賴傳遞、版本提取、導(dǎo)入依賴錯(cuò)誤解決 |
構(gòu)建管理 | 構(gòu)建過(guò)程、構(gòu)建場(chǎng)景、構(gòu)建周期等 |
繼承和聚合 | 理解繼承和聚合作用、繼承語(yǔ)法和實(shí)踐、聚合語(yǔ)法和實(shí)踐 |
到了這里,關(guān)于高效構(gòu)建Java應(yīng)用:Maven入門和進(jìn)階的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!