日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile

發(fā)布時(shí)間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

maven是當(dāng)前Java項(xiàng)目中用到最多的依賴管理工具。最開始的項(xiàng)目比較小引入的依賴包也少所以可以通過手動(dòng)加載jar包的方式來管理依賴包;但隨著項(xiàng)目越來越復(fù)雜各種大小框架層出不窮,一個(gè)項(xiàng)目的開發(fā)往往依賴的jar包成百上千,此時(shí)再去手動(dòng)依賴找到這些jar包并且找到它們相互依賴的版本無疑是一個(gè)巨大的工程,此時(shí)需要一個(gè)能夠簡單解決掉這些依賴關(guān)系的工具;maven就解決了這一類的難題,并且maven還可以做項(xiàng)目構(gòu)建,比如一個(gè)spring boot項(xiàng)目打包成一個(gè)jar包給項(xiàng)目部署也帶了極大的方便。

一、POM文件解析

下面的示例文件列舉了大部分常用的pom.xml的標(biāo)簽,不一定每個(gè)項(xiàng)目都會(huì)用到所有的標(biāo)簽
三者關(guān)系:
my-test-member 是父工程/總工程(聚合角度)
my-test-member-apimy-test-member-biz 都是子工程/聚合工程(聚合角度)

my-test-member 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>org.my.test.member</groupId><artifactId>my-test-member</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version> <!-- modules:配置工程聚合--><modules><!-- module:配置一個(gè)具體的聚合模塊 --><module>my-test-member-api</module><module>my-test-member-biz</module></modules><!-- properties:定義屬性值 --><properties><!-- 自定義屬性mysql版本號,對于自定義屬性來說名稱自己寫 --><mysql.version>8.0.17</mysql.version><swagger.version>2.8.0</swagger.version><mybatis.plus.version>3.3.2</mybatis.plus.version><spring.boot.version>2.3.5.RELEASE</spring.boot.version></properties><!-- 使用dependencyManagement標(biāo)簽配置對依賴的管理 --><!-- 被管理的依賴并沒有真正被引入到工程 --><dependencyManagement><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><!-- 使用properties中自定義的屬性值mysql版本號,好處是如果有多處使用該版本號,直接修改properties中的mysql版本號屬性值即可 --><version>${mysql.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis.plus.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring.boot.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>${spring.boot.version}</version></dependency></dependencies></dependencyManagement><build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring.boot.version}</version></plugin></plugins></pluginManagement></build></project>

my-test-member-api 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"><parent><artifactId>my-test-member</artifactId><groupId>org.my.test.member</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>org.my.test.member.api</groupId><artifactId>my-test-member-api</artifactId><dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency></dependencies> </project>

my-test-member-biz pom.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- project:根標(biāo)簽,表示對當(dāng)前工程進(jìn)行配置、管理 --> <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"><!-- parent:給當(dāng)前工程配置父工程 --><parent><!-- 通過坐標(biāo)信息定位父工程 --><artifactId>my-test-member</artifactId><groupId>org.my.test.member</groupId><version>1.0-SNAPSHOT</version></parent><!-- modelVersion:從maven2.x版本開始固定4.0.0,代表當(dāng)前pom.xml所采用的標(biāo)簽結(jié)構(gòu) --><modelVersion>4.0.0</modelVersion><!-- 當(dāng)前Maven工程的坐標(biāo)信息,其他項(xiàng)目如果要依賴當(dāng)前maven項(xiàng)目則使用以下的坐標(biāo)信息 --><!-- groupId:一般表示公司或組織開發(fā)的某個(gè)項(xiàng)目 --><!-- artifactId:一般表示項(xiàng)目下的某個(gè)模塊 --><!-- version:當(dāng)前模塊的版本 --><!-- 也是安裝該jar包后在本地倉庫中的路徑 如:com\my\test\member\my-test-product-biz\0.0.1-SNAPSHOT\my-test-member-biz-0.0.1-SNAPSHOT.jar --><!-- 如果配置了父工程(parent標(biāo)簽),如果groupId和父工程一樣則可以不寫groupId,如果version和父工程一樣也可以不寫version,但是artifactId必須要寫 --><groupId>com.my.test.member</groupId><artifactId>my-test-member-biz</artifactId><version>0.0.1-SNAPSHOT</version><!-- 當(dāng)前Maven工程的打包方式,可選值有下面四種:默認(rèn)值jar --><!-- jar:表示這個(gè)工程是一個(gè)Java工程,打包結(jié)果jar包,創(chuàng)建Java工程命令:mvn archetype:generate --><!-- war:表示這個(gè)工程是一個(gè)Web工程(傳統(tǒng)的jsp工程),打包結(jié)果war包,創(chuàng)建Web工程命令:mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4選擇創(chuàng)建方式編號比如quickstart,會(huì)提示輸入groupId、artifactId、version等,會(huì)生成web.xml、WEB-INF、index.jsp等文件或目錄,如果沒有java目錄的話,需要自己在main目錄下創(chuàng)建java目錄;Web工程可依賴Java工程,也就是war包里面可以依賴jar包,不能jar包依賴war包 --><!-- pom:表示這個(gè)工程是“管理其他工程”的工程,比如該工程是一個(gè)父級工程則定義為pom,創(chuàng)建命令:mvn archetype:generate但是packaging時(shí)jar需要改成pom --><!-- maven-plugin:定義當(dāng)前工程為maven插件即自定義maven插件的時(shí)候用到,但是基本不會(huì)有自定義插件的場景 --><packaging>jar</packaging><!-- name:當(dāng)前工程的名稱 --><name>my-test-member-biz</name><!-- url:maven官網(wǎng)地址 --><url>http://maven.apache.org</url><!-- description:當(dāng)前工程的說明 --><description>測試微服務(wù)用戶服務(wù)</description><!-- properties:在maven中定義屬性值,可以是指定maven自帶的屬性值,也可以是自定義屬性值;標(biāo)簽中間是屬性值,標(biāo)簽本身是屬性 --><properties><java.version>1.8</java.version></properties><!-- dependencies:指定依賴信息 --><dependencies><!-- dependency:指定一個(gè)具體的依賴信息,通過maven的坐標(biāo)信息指定 --><dependency><groupId>org.my.test.member.api</groupId><artifactId>my-test-member-api</artifactId><version>1.0-SNAPSHOT</version></dependency><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:指定當(dāng)前依賴的范圍,默認(rèn)值compile,總共以下6種可選值:compile/test/provided/system/runtime/import--><!-- compile:默認(rèn)值,compile范圍的jar包,可以在開發(fā)時(shí)正常使用該jar包里面的類方法等(可以在main/test目錄下的程序中正常使用),并且項(xiàng)目打包的時(shí)候會(huì)將該jar包打入到項(xiàng)目生成的jar或war包中,即該jar包會(huì)被main目錄中的程序使用且不屬于provided的情況如:spring-boot-starter --><!-- test:test范圍的jar包,開發(fā)時(shí)可以在test目錄下的程序正常使用該jar包里面的類方法等,但是main目錄下的程序不能正常使用,并且項(xiàng)目打包的時(shí)候不會(huì)將該jar包打入到項(xiàng)目生成的jar或war包中,即僅作測試用的jar包定義該范圍如:junit --><!-- provided:provided范圍的jar包, 可以在開發(fā)時(shí)正常使用該jar包里面的類方法等(可以在main/test目錄下的程序中正常使用),并且項(xiàng)目打包的時(shí)候不會(huì)將該jar包打入到項(xiàng)目生成的jar或war包中,一般對于服務(wù)器已提供的jar包,但是開發(fā)過程中又需要用到該jar包則定義為provided(因?yàn)榉?wù)器本身已有該jar包,所以不需要在打包時(shí)帶入,以避免包臃腫和版本沖突),比如:servlet-api、jsp-api --><!-- system:本文后面有介紹 --><!-- runtime:本文后面有介紹 --><!-- import:本文后面有介紹 --><scope>test</scope><!-- excludes標(biāo)簽配置依賴的排除 --><exclusions><!-- exclude標(biāo)簽中配置一個(gè)具體的依賴排除 --><exclusion><!-- 指定要排除的依賴的坐標(biāo)(不需要寫version) --><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><!-- 此處不寫版本在于父工程my-test-member中dependencyManagement中定義了該包的版本信息,如果寫上版本號則使用該pom中定義的版本,不寫則使用父工程定義的版本 --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!-- configuration 標(biāo)簽:配置 spring-boot-maven-plugin 插件 --><configuration><!-- 具體配置信息會(huì)因?yàn)椴寮煌⑿枨蟛煌兴町?--><!-- source:要求編譯器使用指定的jdk版本來兼容寫的源代碼 --><source>1.8</source><!-- target:源文件編譯后,生成的 *.class 字節(jié)碼文件要符合指定的 JVM 版本 --><target>1.8</target><!-- encoding:工程構(gòu)建過程中讀取源碼時(shí)使用的字符集 --><encoding>UTF-8</encoding></configuration></plugin></plugins></build></project>

約定優(yōu)于配置

maven可以做依賴管理與項(xiàng)目構(gòu)建,其中的項(xiàng)目構(gòu)建的方便得益于maven提供的約定優(yōu)于配置,比如項(xiàng)目打包需要編譯源文件、測試等等,那么需要知道源文件在哪、測試類在哪,這就體現(xiàn)了maven本身對于項(xiàng)目目錄結(jié)構(gòu)的一個(gè)約定

約定優(yōu)于配置優(yōu)于編碼

二、maven常用命令

注意:使用 Maven 構(gòu)建操作相關(guān)的命令時(shí),必須進(jìn)入到 pom.xml 所在的目錄。如果沒有在 pom.xml 所在的目錄運(yùn)行 Maven 的構(gòu)建命令,則會(huì)報(bào)錯(cuò)(mvn -v這種和構(gòu)建操作無關(guān)的命令則配置了PATH之后可以在任何目錄執(zhí)行):

如果一個(gè)項(xiàng)目中有多個(gè)pom.xml則在哪個(gè)pom.xml目錄執(zhí)行構(gòu)建命令,就是對哪個(gè)工程的構(gòu)建操作。

mvn clean 刪除 target 目錄,可以用作清除上一次構(gòu)建記錄,不會(huì)刪除已安裝在本地倉庫中的jar包 mvn compile 主程序編譯(對src/main目錄代碼進(jìn)行編譯),結(jié)果存放在target/classes目錄 mvn test-compile 測試程序編譯(對src/test目錄代碼進(jìn)行編譯),結(jié)果存放在target/test-classes mvn test 測試項(xiàng)目,執(zhí)行src/test目錄下的測試方法(會(huì)輸出測試結(jié)果比如運(yùn)行多少個(gè)、失敗多少、報(bào)錯(cuò)多少、跳過多少,如果失敗會(huì)輸出失敗信息),測試報(bào)告存放在target/surefire-reports目錄 mvn package 將項(xiàng)目打成jar/war包存放在 target 目錄,不會(huì)在maven本地倉庫中存入該jar包 mvn install 和mvn package具有相同的作用,但是會(huì)在maven本地倉庫中存入/安裝該jar包,并且會(huì)將 pom.xml 也安裝在本地倉庫中maven命令組合,比如: mvn clean install -Dmaven.test.skip=true 作用:清除上次構(gòu)建記錄并安裝jar包,并且跳過測試環(huán)節(jié) 解釋: # -D 表示后面要附加命令的參數(shù),字母 D 和后面的參數(shù)是緊挨著的,中間沒有任何其它字符 # maven.test.skip=true 表示在執(zhí)行命令的過程中跳過測試 # mvn clean install 是clean和install操作的組合,為什么是這種組合,這個(gè)和maven的生命周期有關(guān)

maven生命周期
生命周期的設(shè)定是為了讓maven工程構(gòu)建過程自動(dòng)化完成,總共設(shè)定了三個(gè)生命周期,生命周期中的每一個(gè)環(huán)節(jié)對應(yīng)構(gòu)建過程中的一個(gè)操作;一個(gè)工程構(gòu)建一般會(huì)包含編譯、測試、打包、部署等等,如果沒有生命周期的設(shè)定;我們想要完成工程的部署,需要將編譯、測試、打包按照順序分別執(zhí)行,有了生命周期的設(shè)定之后,我們只需要執(zhí)行我們想要的結(jié)果操作即可,要實(shí)現(xiàn)該結(jié)果前面需要進(jìn)行的操作,按照生命周期執(zhí)行即可,而不需要手動(dòng)去執(zhí)行。比如某個(gè)生命周期包含有1->5這五個(gè)操作,那么我們執(zhí)行操作3的話maven會(huì)在執(zhí)行3之前將該生命周期中1和2順序執(zhí)行。

注意:執(zhí)行某個(gè)操作時(shí)maven會(huì)將該生命周期中,該操作之前的操作都執(zhí)行,只是執(zhí)行該生命周期前面的操作,不會(huì)執(zhí)行其他生命周期的操作;比如:執(zhí)行 install 命令,它屬于Default這個(gè)生命周期的命令,那么會(huì)將Default中install前面的命令都按照順序執(zhí)行(也就是除了最后一步deploy,其他的操作都會(huì)按照順序執(zhí)行),正因?yàn)檫@個(gè)設(shè)定執(zhí)行maven命令的時(shí)候,每個(gè)生命周期執(zhí)行一個(gè)命令即可,如果想要執(zhí)行其他生命周期的操作需要和另外生命周期中的命令進(jìn)行組合,而mvn clean install這個(gè)組合命令中,install屬于Default、clean屬于Clean這兩個(gè)命令不屬于一個(gè)生命周期,所以想要他們都執(zhí)行需要進(jìn)行組合命令,而因?yàn)闀?huì)執(zhí)行命令所屬生命周期的前面所有操作,所以沒必要將生命周期中的每個(gè)命令都寫上

maven插件
maven中構(gòu)建工程相關(guān)的命令都是由maven插件最終執(zhí)行,maven本身僅僅負(fù)責(zé)調(diào)度。使用方式如:
創(chuàng)建maven工程的命令:mvn archetype:generate 其中mvn是主命令、archetype:generate是子命令、archetype是插件、generate是目標(biāo)。
一個(gè)插件可以對應(yīng)多個(gè)目標(biāo),而每一個(gè)目標(biāo)都和生命周期中的某一個(gè)環(huán)節(jié)對應(yīng)。
比如Default 生命周期中有 compile 和 test-compile 兩個(gè)和編譯相關(guān)的環(huán)節(jié),這兩個(gè)環(huán)節(jié)對應(yīng) compile 和 test-compile 兩個(gè)目標(biāo),而這兩個(gè)目標(biāo)都是由 maven-compiler-plugin-3.1.jar 插件來執(zhí)行的。

三、依賴傳遞與排除依賴

maven進(jìn)行依賴時(shí)是通過本地maven倉庫進(jìn)行的jar包導(dǎo)入,比如A依賴了B,如果B工程做了修改(不論是代碼或pom的修改),需要先安裝B工程到本地倉庫,否則本地倉庫還是上一次B的版本,即使A進(jìn)行構(gòu)建依賴的B還是未修改的;所以當(dāng)被依賴工程B做了修改需要先安裝到本地倉庫,然后再構(gòu)建A。

依賴傳遞

比如:A 依賴 B,B 依賴 C, A 沒有配置對 C 的依賴的情況下,A 里面是否可以使用 C
分情況看:
B 依賴 C 時(shí)使用 compile 范圍:可以傳遞
B 依賴 C 時(shí)使用 test 或 provided 范圍:不能傳遞,所以A需要C的 jar 包時(shí),就必須在A里面明確配置依賴C才可以。
換言之就是A里面想要使用C的話,需要A依賴的這個(gè)B的jar包里面有C的jar包,也就是需要B依賴C的時(shí)候使用compile范圍,而不能是test 或 provided范圍。

依賴排除

比如:A 依賴 B,B 依賴 C, C可以傳遞到A中,但是A不需要B依賴的C,比如A中已經(jīng)有一個(gè)其他版本的C的依賴了,為了避免jar包沖突,所以A需要使用本身配置的C而不是B依賴的C,那么此時(shí)就需要在A依賴B時(shí)排除掉B依賴的C,即在A的pom.xml中依賴B時(shí)使用exclusions標(biāo)簽排除C。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><!-- excludes標(biāo)簽配置依賴的排除 --><exclusions><!-- exclude標(biāo)簽中配置一個(gè)具體的依賴排除 --><exclusion><!-- 指定要排除的依賴的坐標(biāo)(不需要寫version) --><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>

四、繼承

和Java的繼承類似,Java繼承子類可以擁有父類的變量及方法;在maven中的繼承就發(fā)生在父工程和子工程中,子工程可以繼承父工程的依賴以及使用父工程中定義的版本信息,一般用于在父工程中做版本統(tǒng)一管理,子工程使用父工程定義的版本信息,避免整個(gè)項(xiàng)目中相同jar包各個(gè)子工程版本五花八門,最終導(dǎo)致依賴沖突或意料之外的異常信息;所以一般情況下父工程中需要將所有子工程的依賴都進(jìn)行版本規(guī)范,每個(gè)子工程依賴本工程需要的依賴包即可(如果子工程導(dǎo)入依賴時(shí)不寫版本號則采用父工程定義的版本號,子工程寫了版本號則使用子工程定義的版本號),也可以考慮將所有子工程都會(huì)用到的依賴,放在父工程中,這樣所有子工程也會(huì)通過繼承的方式擁有這個(gè)依賴(不推薦,還是在父工程中只定義版本管理);子工程中使用 parent 標(biāo)簽定義父工程;每個(gè)POM都有且僅有一個(gè)父POM(未定義parent的話就是默認(rèn)的超級POM作為父POM),并且可以多級繼承;比如A工程繼承B工程,B工程繼承C工程,那么A工程中可以用到C工程定義的 dependencyManagement
父工程:

<modelVersion>4.0.0</modelVersion><groupId>org.my.test.member</groupId><artifactId>my-test-member</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><!-- properties:定義屬性值 --><properties><!-- 自定義屬性mysql版本號,對于自定義屬性來說名稱自己寫 --><mysql.version>8.0.17</mysql.version></properties><!-- 使用dependencyManagement標(biāo)簽配置對依賴的管理 --><!-- 被管理的依賴并沒有真正被引入到工程 --><dependencyManagement><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><!-- 使用properties中自定義的屬性值mysql版本號,好處是如果有多處使用該版本號,直接修改properties中的mysql版本號屬性值即可 --><version>${mysql.version}</version></dependency></dependencies></dependencyManagement>

子工程:

<!-- parent:給當(dāng)前工程配置父工程 --><parent><!-- 通過坐標(biāo)信息定位父工程 --><artifactId>my-test-member</artifactId><groupId>org.my.test.member</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.my.test.member</groupId><artifactId>my-test-member-biz</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><!-- 此處不寫版本在于父工程my-test-member中dependencyManagement中定義了該包的版本信息,如果寫上版本號則使用該pom中定義的版本,不寫則使用父工程定義的版本 --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>

POM的四個(gè)層級:
超級POM、父POM、當(dāng)前POM、有效POM
超級POM:類似于Java中的Object類,超級POM是所有POM的頂級父類、如果某個(gè)POM未定義父POM,那么它的父POM就是這個(gè)超級POM;超級POM定義了如源文件存放的目錄、測試源文件存放的目錄、構(gòu)建輸出的目錄……等等。
父POM:在POM中通過 parent 標(biāo)簽指定的POM就是該P(yáng)OM的父POM。一個(gè)POM有且僅有一個(gè)父POM。
當(dāng)前POM:當(dāng)前工程的POM。
有效POM(effective POM):因?yàn)橛欣^承關(guān)系及依賴傳遞的存在,所以我們當(dāng)前工程的POM定義的內(nèi)容,并不是當(dāng)前工程所有的POM內(nèi)容,POM會(huì)按照繼承關(guān)系及依賴傳遞做疊加操作,最終得到的POM就是有效POM,也就是對當(dāng)前工程依賴及相關(guān)設(shè)定最終產(chǎn)生效果的POM。
有效POM的疊加關(guān)系:在 POM 的繼承關(guān)系中,子 POM 可以覆蓋父 POM 中的配置;如果子 POM 沒有覆蓋,那么父 POM 中的配置將會(huì)被繼承(也就是說如果在繼承關(guān)系中有多個(gè)POM都對同一個(gè)內(nèi)容進(jìn)行了定義則離當(dāng)前POM距離越近的配置生效,如果多個(gè)POM中只有一個(gè)POM對內(nèi)容進(jìn)行了定義則不管有多少級的繼承關(guān)系,這個(gè)內(nèi)容都會(huì)生效。比如當(dāng)前工程A繼承B繼承C,ABC都對a依賴做了配置,那么A中對a依賴的配置生效,如果只有C中做了c依賴配置,那么C中對c依賴的配置會(huì)生效,如果B和C都對b依賴做了配置,那么B中對b依賴的配置會(huì)生效)。按照這個(gè)規(guī)則,繼承關(guān)系中的所有 POM 疊加到一起,就得到了一個(gè)最終生效的 POM。
查看有效POM的命令:

mvn help:effective-pom

五、聚合

定義一個(gè)“總工程”將各個(gè)“模塊工程”匯集起來,作為一個(gè)完整的項(xiàng)目;一般來說總工程也是父工程(繼承角度)乃至于最頂級的父工程,子工程則是模塊工程。好處是可以在總工程中執(zhí)行maven命令,從而對總工程中定義的模塊工程都執(zhí)行該命令,并且會(huì)自動(dòng)梳理依賴關(guān)系,進(jìn)行執(zhí)行命令。通過在總工程中使用 modules 標(biāo)簽定義模塊工程即可。
總工程/父工程:

<!-- modules:配置工程聚合,聚合的好處是:我們在哪個(gè)工程下執(zhí)行maven命令則是對該工程的操作,但是在總工程中執(zhí)行則可以對所有modules定義的模塊操作,比如執(zhí)行mvn install就是安裝哪個(gè)工程,如果這個(gè)工程有modules定義,則會(huì)在安裝的時(shí)候自動(dòng)梳理聚合模塊工程之間的依賴關(guān)系,比如父子工程,依賴傳遞等,然后先去安裝父工程和被依賴工程,再安裝工程本身,而不需要我們自己手動(dòng)按照順序安裝每一個(gè)工程,注意別發(fā)生循環(huán)依賴,比如A依賴B,B依賴C,然后C又依賴了A,這樣會(huì)報(bào)錯(cuò) --><modules><!-- module:配置一個(gè)具體的聚合模塊 --><module>my-test-member-api</module><module>my-test-member-biz</module></modules>

循環(huán)依賴報(bào)錯(cuò)如下:

DANGER[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:

六、properties 屬性聲明及引用

使用 properties 標(biāo)簽可以定義系統(tǒng)自帶的屬性值以及自定義屬性及屬性值,方式:

<properties><!-- 自定義屬性mysql版本號,對于自定義屬性來說名稱自己寫 --><mysql.version>8.0.17</mysql.version></properties>

主要用途:
1、在當(dāng)前 pom.xml 文件中引用屬性,比如依賴版本定義引用 properties 中的屬性,達(dá)到一處修改,全部版本都替換的效果。
2、資源過濾功能:在非 Maven 配置文件中引用屬性,由 Maven 在處理資源時(shí)將引用屬性的表達(dá)式替換為屬性值(下方 十、profile 標(biāo)簽 中有講解)

查看屬性值:根據(jù)輸入表達(dá)式,輸出表達(dá)式結(jié)果:

mvn help:evaluate

執(zhí)行該命令后,會(huì)要求輸入表達(dá)式,然后輸出表達(dá)式的結(jié)果。
1、比如輸出剛剛定義的 mysql.version 的表達(dá)式就是

${屬性名} 如:${mysql.version}

2、訪問系統(tǒng)屬性:比如Java系統(tǒng)屬性也就是通過 System.getProperties() 方法可以拿到的屬性,表達(dá)式就是:

${屬性名} 如:${java.runtime.name}

3、訪問系統(tǒng)環(huán)境變量:比如JAVA_HOME,表達(dá)式就是:

${env.系統(tǒng)環(huán)境變量名} 如:${env.JAVA_HOME}

4、訪問 project 屬性,也就是訪問當(dāng)前POM中的元素值,表達(dá)式就是:

${project.元素名} 如:訪問當(dāng)前POM的一級標(biāo)簽表達(dá)式:${project.標(biāo)簽名},如:${project.artifactId} 輸出當(dāng)前POM的artifactId的值 訪問當(dāng)前POM的子級標(biāo)簽表達(dá)式:${project.標(biāo)簽名.子標(biāo)簽名},如:${project.parent.groupId} 輸出當(dāng)前POM的父POM的groupId的值 訪問列表標(biāo)簽表達(dá)式:${project.標(biāo)簽名[下標(biāo)]},如:${project.modules[0]} 輸出當(dāng)前POM的modules標(biāo)簽下的第一個(gè)值,${project.build.plugins[0]} 輸出當(dāng)前POM的build標(biāo)簽下的plugins標(biāo)簽下的第一個(gè)值

5、訪問 settings 全局配置,比如maven settings.xml配置文件中的屬性,表達(dá)式就是:

${settings.標(biāo)簽名} 如:${settings.localRepository} 輸出settings.xml配置的本地倉庫的路徑

七、build 標(biāo)簽

build意為構(gòu)建,意思就是在工程構(gòu)建過程中的定制化操作,因?yàn)槌塒OM是每個(gè)POM的直接或間接父POM,所以每個(gè)工程的有效POM實(shí)際上其中的 build 都包含了超級POM中定義的 build 標(biāo)簽內(nèi)容;當(dāng)有效POM中的 build 標(biāo)簽內(nèi)容(因?yàn)槔^承關(guān)系包含所有父POM的build內(nèi)容)不能滿足當(dāng)前工程的構(gòu)建的時(shí)候,那么我們就會(huì)在當(dāng)前工程中定義 build 標(biāo)簽內(nèi)容,所以 build 標(biāo)簽不是一定會(huì)存在當(dāng)前工程中的。

build標(biāo)簽大致包含三類子標(biāo)簽:
1、定義約定的目錄結(jié)構(gòu)
如:

<build><sourceDirectory>E:\test\my-test-product\my-test-product-biz\src\main\java</sourceDirectory><scriptSourceDirectory>E:\test\my-test-product\my-test-product-biz\src\main\scripts</scriptSourceDirectory><testSourceDirectory>E:\test\my-test-product\my-test-product-biz\src\test\java</testSourceDirectory><outputDirectory>E:\test\my-test-product\my-test-product-biz\target\classes</outputDirectory><testOutputDirectory>E:\test\my-test-product\my-test-product-biz\target\test-classes</testOutputDirectory> </build>

2、備用插件管理
通過 pluginManagement 標(biāo)簽在父POM中來管理插件版本和 dependencyManagement 在父POM中定義依賴版本意思一樣,子工程使用父工程中定義的插件時(shí)可以省略版本號,起到在父工程中統(tǒng)一管理插件版本的效果。
如:
父工程(在build標(biāo)簽中使用pluginManagement標(biāo)簽管理插件版本):

<build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.5.RELEASE</version></plugin></plugins></pluginManagement></build>

子工程(在build標(biāo)簽中使用plugins導(dǎo)入父工程管理的插件時(shí),可以不寫版本號,使用父工程定義的版本號,和繼承一樣,子工程可覆蓋父工程,即采用的版本是距離當(dāng)前工程最近的工程中定義的版本):

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

spring-boot-maven-plugin 插件作用:
比如spring boot項(xiàng)目使用maven本身install的插件只會(huì)將工程代碼本身進(jìn)行安裝生成jar包,但我們想要java -jar可以直接運(yùn)行的jar包,除了工程代碼本身,還需要依賴的jar包、Servlet容器(如:Tomcat)、
通過 java -jar 方式可以直接啟動(dòng)jar包相關(guān)的配置等;spring-boot-maven-plugin插件就可以實(shí)現(xiàn)上述功能。
3、生命周期插件
如:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.0</version><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals><configuration><mainClass>${start-class}</mainClass></configuration></execution></executions><configuration><mainClass>${start-class}</mainClass></configuration></plugin><plugins></build>

解釋:
坐標(biāo):groupId、artifactId、version 標(biāo)簽定義了插件的坐標(biāo),如果是 Maven 的自帶插件會(huì)省略 groupId
executions 標(biāo)簽內(nèi)可以配置多個(gè) execution 標(biāo)簽,execution 標(biāo)簽內(nèi)含義:
id:指定唯一標(biāo)識
phase:關(guān)聯(lián)的生命周期階段
goals/goal:關(guān)聯(lián)指定生命周期的目標(biāo),goals 標(biāo)簽中可以配置多個(gè) goal 標(biāo)簽,表示一個(gè)生命周期環(huán)節(jié)可以對應(yīng)當(dāng)前插件的多個(gè)目標(biāo)。
configuration:對插件目標(biāo)的執(zhí)行過程進(jìn)行配置,其中的標(biāo)簽需要是插件本身定義的,如上面的 spring-boot-maven-plugin 插件中的 repackage 目標(biāo),配置 mainClass 標(biāo)簽,這個(gè) mainClass 就是 spring-boot-maven-plugin 插件中的類中的屬性,意思是指定spring boot項(xiàng)目的啟動(dòng)類。
4、其他,如:

<build><!-- 當(dāng)前工程在構(gòu)建過程中使用的最終名稱 --><finalName>test-xxx</finalName></build>

build 標(biāo)簽典型應(yīng)用:
除了上面提到的使用 spring-boot-maven-plugin 插件,用于生成 java -jar可直接運(yùn)行的 jar 包外,另外就是用于指定jdk版本也是常用的功能:
為什么需要指定jdk版本:不指定jdk版本的情況下項(xiàng)目一般默認(rèn)識別的jdk版本是1.5,那么這個(gè)時(shí)候如果我們在項(xiàng)目中的代碼,使用了jdk5以上版本的語法,比如jdk8的 Lambda 表達(dá)式 那么idea編輯器會(huì)提示這段代碼報(bào)錯(cuò),并且此時(shí)編譯或打包也會(huì)報(bào)錯(cuò)。那么如果指定 jdk版本 的話一般可以在三個(gè)地方指定:
a、maven的 settings.xml 配置文件中的 profile 標(biāo)簽指定:

<!-- 配置Maven工程的默認(rèn)JDK版本 --> <profile><!-- id:唯一標(biāo)識 --><id>jdk-1.8</id><!-- activation:激活方式 --><activation><!-- activeByDefault:是否默認(rèn)激活--><activeByDefault>true</activeByDefault><!-- jdk:標(biāo)識當(dāng)前 profile 可以根據(jù) jdk 版本激活,比如這里如果環(huán)境是 jdk 1.8 的話就激活當(dāng)前 profile 配置,不是則不激活,激活了當(dāng)前 profile 之后,如果當(dāng)前 profile 還是默認(rèn)激活的話,則采用當(dāng)前 profile --><jdk>1.8</jdk></activation><!-- properties:當(dāng)前 profile 激活并且使用后要應(yīng)用的配置 --><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties> </profile>

b、當(dāng)前工程的 pom.xml 中 build 標(biāo)簽指定:

<!-- build 標(biāo)簽:指定maven構(gòu)建工程的定制化操作! --> <build><!-- plugins 標(biāo)簽:指定需要用到的插件! --><plugins><!-- plugin 標(biāo)簽:指定一個(gè)具體的插件 --><plugin><!-- 插件的坐標(biāo)。此處引用的 maven-compiler-plugin 插件不是第三方的,是一個(gè) Maven 自帶的插件。 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><!-- configuration 標(biāo)簽:配置 maven-compiler-plugin 插件 --><configuration><!-- 具體配置信息會(huì)因?yàn)椴寮煌⑿枨蟛煌兴町?--><!-- source:要求編譯器使用指定的jdk版本來兼容寫的源代碼 --><source>1.8</source><!-- target:源文件編譯后,生成的 *.class 字節(jié)碼文件要符合指定的 JVM 版本 --><target>1.8</target><!-- encoding:工程構(gòu)建過程中讀取源碼時(shí)使用的字符集 --><encoding>UTF-8</encoding></configuration></plugin></plugins> </build>

c、當(dāng)前工程的 pom.xml 中 properties 標(biāo)簽指定:

<properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>

三種方式區(qū)別:
a方式settings.xml 中配置:僅在本地生效,如果脫離當(dāng)前 settings.xml 能夠覆蓋的范圍,則無法生效,這樣就可能會(huì)導(dǎo)致我們本地的maven settings.xml文件中做了相關(guān)設(shè)置,但是同事的本地maven倉庫卻沒有做該設(shè)置,那么我們本地可以編譯、打包該項(xiàng)目,同事拉取代碼之后卻無法完成編譯、打包操作;但是因?yàn)?settings.xml 是對整個(gè)maven的配置,所以對于本地的多個(gè)項(xiàng)目來說都能夠生效。
b、c方式在當(dāng)前 Maven 工程 pom.xml 中配置:無論在哪個(gè)環(huán)境執(zhí)行編譯等構(gòu)建操作都有效,但僅僅對當(dāng)前工程生效。

八、scope 依賴范圍

在 dependencies 中導(dǎo)入依賴的時(shí)候,每個(gè)依賴可以定義 scope 即依賴范圍。
默認(rèn)值compile,總共有6種可選值:compile/test/provided/system/runtime/import

compile:默認(rèn)值,compile范圍的jar包,可以在開發(fā)時(shí)正常使用該jar包里面的類方法等(可以在main/test目錄下的程序中正常使用),并且項(xiàng)目打包的時(shí)候會(huì)將該jar包打入到項(xiàng)目生成的jar或war包中,即該jar包會(huì)被main目錄中的程序使用且不屬于provided的情況如:spring-boot-startertest:test范圍的jar包,開發(fā)時(shí)可以在test目錄下的程序正常使用該jar包里面的類方法等,但是main目錄下的程序不能正常使用,并且項(xiàng)目打包的時(shí)候不會(huì)將該jar包打入到項(xiàng)目生成的jar或war包中,即僅作測試用的jar包定義該范圍如:junitprovided:provided范圍的jar包, 可以在開發(fā)時(shí)正常使用該jar包里面的類方法等(可以在main/test目錄下的程序中正常使用),并且項(xiàng)目打包的時(shí)候不會(huì)將該jar包打入到項(xiàng)目生成的jar或war包中,一般對于服務(wù)器已提供的jar包,但是開發(fā)過程中又需要用到該jar包則定義為provided(因?yàn)榉?wù)器本身已有該jar包,所以不需要在打包時(shí)帶入,以避免包臃腫和版本沖突),比如:servlet-api、jsp-apisystem:比如 Windows 系統(tǒng)環(huán)境下開發(fā),如果現(xiàn)在想要將 D:\tempare\test-aaa-1.0-SNAPSHOT.jar 引入到項(xiàng)目中,那么就可以將依賴配置為 system 范圍(缺點(diǎn):因?yàn)橐氲囊蕾囀潜镜芈窂酵耆痪哂锌梢浦残?#xff0c;基本不使用): <dependency><groupId>org.my.test</groupId><artifactId>test-aaa</artifactId><version>1.0-SNAPSHOT</version><systemPath>D:\tempare\test-aaa-1.0-SNAPSHOT.jar</systemPath><scope>system</scope> </dependency>runtime:用于編譯時(shí)不需要,但是運(yùn)行時(shí)需要的 jar 包。比如:編譯時(shí)根據(jù)接口調(diào)用方法,但是實(shí)際運(yùn)行時(shí)需要的是接口的實(shí)現(xiàn)類。如: <!--熱部署 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency>import:一般通過繼承父工程來管理依賴,但是 Maven 是單繼承的;如果不同體系的依賴信息封裝在不同 POM 中,此時(shí)想要將他們都導(dǎo)入進(jìn)來就可以使用 import 依賴范圍(要求:打包類型必須是 pom、必須放在 dependencyManagement 中)。如: <dependencyManagement><dependencies><!-- SpringCloud 依賴導(dǎo)入 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR9</version><type>pom</type><scope>import</scope></dependency></dependencies> </dependencyManagement>

可選依賴:
在上面的 runtime 依賴范圍的例子中導(dǎo)入 spring-boot-devtools 包的時(shí)候,有一個(gè) optional 標(biāo)簽;該標(biāo)簽就是配置可選依賴,意為可有可無;官方解釋為:比如Project X 依賴 Project A,A 中一部分 X 用不到的代碼依賴了 B,那么對 X 來說 B 就是『可有可無』的。簡單來說就是 標(biāo)記了 optional 標(biāo)簽為 true 的依賴就是這個(gè)包里面的功能很少會(huì)用到,所以不要這個(gè)依賴不影響工程正常功能,如果使用到了這個(gè)包里面的功能就需要導(dǎo)入這個(gè)依賴。

九、版本仲裁

出現(xiàn)版本仲裁的情況一定是工程依賴了一個(gè)jar包的不同版本,如果本來就是不同的依賴包則是做疊加操作,也就是在最終生成的有效POM中這些依賴包都存在。
如果是通過繼承方式得到的依賴包或者依賴版本管理是子工程覆蓋父工程也就是繼承關(guān)系中距離當(dāng)前工程越近的聲明生效。
如果是依賴傳遞的方式,則采用兩種方式仲裁:
a、最短路徑優(yōu)先
比如A工程依賴B工程依賴C工程依賴了 x-1.0 jar包、A工程依賴D工程依賴了 x-2.0 jar包,則在A工程中生效的 x jar包是D工程中依賴的 x-2.0 jar包。
b、路徑相同時(shí)先聲明者優(yōu)先
比如A工程依賴B工程依賴了 y-1.0 jar包、A工程依賴D工程依賴了 y-2.0 jar包,此時(shí)對于A工程來說,想要依賴 y jar包,兩個(gè)版本的路徑長度一樣,那么對于依賴哪個(gè) y jar包就是由A工程中的 pom.xml 中先聲明的B工程依賴還是D工程依賴決定。先聲明依賴B工程則是采用 y-1.0 jar包,先聲明依賴D工程則是采用y-2.0 jar包。
maven版本仲裁只是maven的一個(gè)依賴沖突的自動(dòng)解決方案(在沒有人為干預(yù)的情況下按照以上規(guī)則進(jìn)行仲裁),當(dāng)通過maven本身的版本仲裁之后,項(xiàng)目功能沒問題可以正常運(yùn)行,不需要多做關(guān)心;但是有些情況下通過版本仲裁得到的依賴會(huì)不滿足我們的使用要求,比如版本仲裁得到 1.0 版本,但是我們使用的該 jar包 中的某個(gè)方法,1.0 版本沒有(或者1.0版本的邏輯不滿足要求)這個(gè)方法在仲裁失敗的 2.0 版本中并且滿足要求,那么此時(shí)就只有人為干預(yù)讓 maven 依賴 2.0 版本;比如在當(dāng)前工程中明確指定依賴的版本信息,或者通過 exclusion 標(biāo)簽,排除 1.0 版本的依賴。

十、profile 標(biāo)簽

在 Maven 中,使用 profile 機(jī)制來管理不同環(huán)境下的配置信息。并且解決同類問題的類似機(jī)制在其他框架中也有;比如生產(chǎn)環(huán)境、測試環(huán)境、開發(fā)環(huán)境的數(shù)據(jù)庫緩存連接等而且從模塊劃分的角度來說,持久化層的信息放在構(gòu)建工具中配置也違反了『高內(nèi)聚,低耦合』的原則。

默認(rèn) profile
在 pom.xml 中不在 profile 標(biāo)簽內(nèi)的配置,就是配置的默認(rèn) profile 。因?yàn)楦鶚?biāo)簽 project 下所有標(biāo)簽相當(dāng)于都是在設(shè)定默認(rèn)的 profile。project 標(biāo)簽下除了 modelVersion 和坐標(biāo)標(biāo)簽之外,其它標(biāo)簽都可以配置到 profile 中。

使用順序
a、為每個(gè)環(huán)境聲明一個(gè) profile
環(huán)境 A:profile A
環(huán)境 B:profile B
環(huán)境 C:profile C
b、激活某個(gè)環(huán)境的 profile

profile 配置地方
a、maven的 settings.xml 配置文件中的 profile 標(biāo)簽:對本地工程都生效。比如上面配置 JDK 1.8。
b、pom.xml:僅對當(dāng)前工程生效。

profile 標(biāo)簽內(nèi)容
a、profiles/profile 標(biāo)簽
profile 代表某個(gè)配置并且配置可以有多個(gè),由 profiles 標(biāo)簽統(tǒng)一管理;所以 profile 配置在 profiles 標(biāo)簽中。
profile 標(biāo)簽中的配置會(huì)覆蓋 pom.xml 中的同級配置,所以 profiles 標(biāo)簽通常是 pom.xml 中的最后一個(gè)標(biāo)簽。
b、id 標(biāo)簽
每個(gè) profile 都必須有一個(gè) id 標(biāo)簽,指定該 profile 的唯一標(biāo)識。這個(gè) id 標(biāo)簽的值會(huì)在命令行調(diào)用 profile 時(shí)被用到。命令格式(作為命令的參數(shù)被使用):-P<profile的id>,如:mvn compile -PjdkTest,其中 jdkTest 就是某個(gè) profile 的 id 標(biāo)簽的值;意思是在編譯的時(shí)候使用 profile id為 jdkTest 的配置進(jìn)行編譯。
c、其他標(biāo)簽
除了上面a b標(biāo)簽是 profile 固定的之外,其他標(biāo)簽是 project 跟標(biāo)簽下除了 modelVersion 和坐標(biāo)標(biāo)簽,都可以配置到 profile 中;比如一個(gè) profile 可以覆蓋項(xiàng)目的最終名稱、項(xiàng)目依賴、插件配置等各個(gè)方面以影響構(gòu)建行為。

profile 激活
a、當(dāng) POM 中沒有在 profile 標(biāo)簽里的配置就是默認(rèn)的 profile,默認(rèn)被激活。
b、基于環(huán)境信息激活,如:JDK 版本、操作系統(tǒng)參數(shù)、文件、屬性等等。一個(gè) profile 一旦被激活,那么它定義的所有配置都會(huì)覆蓋原來 POM 中對應(yīng)層次的元素。比如:

<profiles><profile><id>JDK1.8</id><!-- activation:配置激活條件 --><activation><!-- 配置是否默認(rèn)激活 --><activeByDefault>false</activeByDefault><!-- 指定激活條件為:JDK 1.8 --><jdk>1.8</jdk><!-- property:指定激活屬性 --><property><!-- name:激活屬性名稱 --><name>mavenVersion</name><!-- value:激活屬性值 --><value>3.5.4</value></property></activation></profile> </profiles>

表示當(dāng) JDK 版本為 1.8 且 maven 版本為 3.5.4 時(shí)被激活(Maven 3.2.2 及之后的版本)
上面的例子有兩個(gè)激活條件則(多個(gè)激活條件也一樣):
Maven 3.2.2 之前:遇到第一個(gè)滿足的條件即可激活即或的關(guān)系。
Maven 3.2.2 開始:各條件均需滿足即且的關(guān)系。
c、命令行激活
列出所有激活的 profile,以及它們在哪里定義

mvn help:active-profiles

執(zhí)行maven指令時(shí)指定某個(gè)具體的 profile

mvn clean test -P<profile id> 如:mvn clean test -PjdkTest 指定清理測試時(shí)使用id為jdkTest的profile

資源屬性過濾
Maven 能夠通過 profile 實(shí)現(xiàn)各不同運(yùn)行環(huán)境切換,因?yàn)?Maven 提供了『資源屬性過濾』的機(jī)制。通過屬性替換實(shí)現(xiàn)不同環(huán)境使用不同的參數(shù)。
我們可以在當(dāng)前工程的 pom.xml 文件中,定義每個(gè)環(huán)境的 profile 配置,然后maven構(gòu)建工程時(shí),指定使用某個(gè)環(huán)境的profile即可,比如定義數(shù)據(jù)庫連接信息,可以這樣定義:
第一步:在 pom.xml 中通過 profile 定義數(shù)據(jù)庫連接信息:

<profiles><profile><id>devJDBC</id><properties><dev.jdbc.user>root</dev.jdbc.user><dev.jdbc.password>test123</dev.jdbc.password><dev.jdbc.url>http://localhost:3306/test</dev.jdbc.url><dev.jdbc.driver>com.mysql.jdbc.Driver</dev.jdbc.driver></properties><build><resources><resource><!-- 表示為這里指定的目錄開啟資源過濾功能 --><directory>src/main/resources</directory><!-- 開啟資源過濾功能 --><filtering>true</filtering><!-- includes和excludes可以不配置 --><includes><include>*.properties</include></includes><excludes><exclude>test.properties</exclude></excludes> </resource></resources></build> </profile> </profiles>

第二步:創(chuàng)建待處理的資源文件;如:application.properties(在上一步中定義的開啟資源過濾功能目錄是src/main/resources,所以需要將application.properties文件,創(chuàng)建在該目錄下)

dev.user=${dev.jdbc.user} dev.password=${dev.jdbc.password} dev.url=${dev.jdbc.url} dev.driver=${dev.jdbc.driver}

第三步:執(zhí)行 maven 構(gòu)建工程的命令并指定使用對應(yīng)環(huán)境的 profile

mvn clean install -PdevJDBC

執(zhí)行清理安裝命令時(shí) 會(huì)將 id 為 devJDBC 的profile配置,做資源過濾處理,效果就是會(huì)將 devJDBC 中配置的user、password、url、driver等信息,寫入到 application.properties 文件中的對應(yīng)屬性上。application.properties 中 ${dev.jdbc.user} 對應(yīng) devJDBC 中的 <dev.jdbc.user>root</dev.jdbc.user> 也就是將 root 賦值給 dev.user屬性。

includes、excludes
有時(shí)會(huì)在 resource 標(biāo)簽下配置 includes 和 excludes 標(biāo)簽;作用是:
includes:指定執(zhí)行 resource 階段時(shí)要包含到目標(biāo)位置的資源
excludes:指定執(zhí)行 resource 階段時(shí)要排除的資源
比如上面的 devJDBC profile的例子,其中的 includes 指的是在 resource 階段,需要將當(dāng)前工程 resources 目錄下的所有 properties 文件包含到目標(biāo)位置,excludes 指的是這些 properties 文件中排除test.properties 文件。

Nexus下載安裝及對接
maven jar包沖突解決方案、導(dǎo)入非maven工程jar包

總結(jié)

以上是生活随笔為你收集整理的maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产又爽又黄无码无遮挡在线观看 | 在线91视频 | 北条麻妃一区二区三区在线观看 | 虫族全黄h全肉污文 | 蜜臀av中文字幕 | 成人在线高清 | 国产51自产区 | 色av综合| 黄色aa视频| 92久久精品一区二区 | 天天做天天操 | 欧美在线一二三四区 | a亚洲精品 | 久久久久久久综合 | 日本一区二区免费在线观看 | 成人亚洲视频 | 男女插孔视频 | 男女激情av| 日本午夜影视 | 好吊色视频在线观看 | 精品国产aⅴ一区二区三区四川人 | 激情视频网 | 99热这里只有精品在线 | 中文字幕无码日韩专区免费 | 成年人的黄色片 | 日韩美一区二区三区 | 一二级毛片| 国产小视频在线观看 | 欧美一区二区三区免费在线观看 | 国产精品成人免费一区久久羞羞 | xxxxx国产| 精品在线播放视频 | 午夜视频免费在线 | 久久久久免费精品 | 女生喷水视频 | 国产高清免费 | 免费在线一区二区三区 | 黄色一级视频免费观看 | 日韩插插| 国产毛片久久久久 | 黄色aa级片 | 亚洲人在线观看视频 | 天天网综合 | 国模一区二区 | 久久精品2019中文字幕 | 免费激情视频网站 | 香蕉视频在线观看www | 国产特级淫片免费看 | 亚洲经典一区二区三区四区 | 久久久久久蜜桃一区二区 | 国产人人插 | 日韩av专区| 精品少妇v888av | 欧美精品久久久 | 日本在线观看一区 | 天堂国产| 特黄特色免费视频 | 都市激情久久 | 久久久久久久久久网站 | 麻豆视频免费入口 | 久久久久99精品成人片三人毛片 | 欧美日韩三 | 男男车车的车车网站w98免费 | 欧美精品一二三四区 | 日本人妻换人妻毛片 | 国产伦子伦对白视频 | 免费亚洲婷婷 | 激情综合五月婷婷 | 国产高清在线视频 | 9i精品福利一区二区三区 | 欧美国产一区二区在线观看 | 精品97人妻无码中文永久在线 | 我和单位漂亮少妇激情 | 色哟哟导航 | 国产又大又黑又粗 | 亚洲激情视频在线观看 | 亚洲精品乱码久久久久久蜜桃不卡 | 激情五月激情综合网 | 妺妺窝人体色www在线小说 | 国产无遮挡又黄又爽又色视频 | 美女露隐私网站 | 最新国产在线视频 | 亚洲一级伦理 | 超碰caoprom| 天天躁日日摸久久久精品 | 国产精品国产三级国产专播精品人 | 国产欧美视频在线观看 | 全部孕妇毛片丰满孕妇孕交 | 日本少妇xxx | 国产女人高潮的av毛片 | 国产在线日本 | 丰满岳乱妇在线观看中字无码 | 尼姑福利影院 | 乱lun合集小可的奶水 | 人人澡人人澡人人澡 | 欧美国产91 | 天天槽| 夜夜涩 | 午夜精品网站 |