Maven版本依賴(lài)pom文件內(nèi)容及使用剖析
pom.xml文件
<groupId>org.son.nexus</groupId>//項(xiàng)目隸屬的實(shí)際項(xiàng)目名 <artifactId>nexus-indexer</artifactId>//實(shí)際項(xiàng)目中的一個(gè)maven項(xiàng)目模塊名稱(chēng) <version>2.0.0</version>//版本號(hào) <packaging>jar</packaging>//當(dāng)前maven項(xiàng)目打包的方式,默認(rèn)為jar
以上的配置會(huì)獲得一個(gè)<artifactId>-<version>.<packaging>格式的包//nexus-indexer-2.0.0.jar
<classifier>jdk7</classifier>//用于定義構(gòu)建輸出的一些附屬的構(gòu)建。classifier是不能直接定義的,只能存在附加的構(gòu)件(插件)時(shí),才能(必須)添加。在包名上也會(huì)有所提現(xiàn)(nexus-indexer-2.0.0-javadoc.jar)
jar包在倉(cāng)庫(kù)中的路徑規(guī)律:groupId/artifactId/version/groupId-version
依賴(lài)倉(cāng)庫(kù)
groupId、artifactId、version為基本坐標(biāo)
type為依賴(lài)類(lèi)型,默認(rèn)為jar
scope為依賴(lài)范圍
- compile:編譯,測(cè)試,運(yùn)行三種classpath都有效
- test:只對(duì)測(cè)試有效
- provided:編譯和測(cè)試有效
- runtime:測(cè)試和運(yùn)行有效
- system:系統(tǒng)依賴(lài),依賴(lài)的包是從計(jì)算機(jī)本地導(dǎo)入,與systemPath配合使用
- ? <systemPath>${java.home}/lib/rt.jar</systemPath>
- ? <scope>system</scope>
傳遞性依賴(lài)
maven默認(rèn)就是支持的。
什么是傳遞性依賴(lài)?
比如:現(xiàn)在要導(dǎo)入A.jar包,但A.jar有依賴(lài)于B.jar,在maven中就會(huì)默認(rèn)導(dǎo)入B.jar,而不需要手動(dòng)去導(dǎo)入。
scope最好設(shè)為compile
傳遞性依賴(lài)存在一個(gè)問(wèn)題:工程中存在兩個(gè)jar分別依賴(lài)的是B.jar的不同版本jar包,就會(huì)出現(xiàn)錯(cuò)誤。
optional:可選依賴(lài),true 不會(huì)傳遞,false會(huì)傳遞(默認(rèn))
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.10</version> <optional>true</optional> </dependency>
當(dāng)其他項(xiàng)目C依賴(lài)B項(xiàng)目時(shí),mysql-connector-java的依賴(lài)不會(huì)發(fā)生傳遞給C
優(yōu)點(diǎn):
減少?zèng)_突,不用的功能不傳遞
一個(gè)jar應(yīng)該只有 一個(gè)職責(zé)原則
exclusions排除依賴(lài)
用于替換某個(gè) 依賴(lài)中的依賴(lài)包作用
<dependencies> <dependency> <groupId>com.juv</groupId> <artifactId>project-B</artifactId> <version>1.0.0</version> <exclusions> <exclusion>//可以有多個(gè) <groupId>com.juv</groupId> <artifactId>project-C</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.juv</groupId> <artifactId>project-B</artifactId> <version>1.1.0</version> </dependency> </dependencies>
該例子的意思:不想使用project-B中版本的project-C依賴(lài)包,而將其環(huán)衛(wèi)1.1.0的project-C包
歸類(lèi)依賴(lài)
場(chǎng)景:存在一群版本號(hào)一致的依賴(lài),想通過(guò)一個(gè)統(tǒng)一的配置,將其統(tǒng)一配置和修改
<properties> <spring>2.5.6</spring> </properties>
調(diào)用方式
<version>${spring}</version>
部署至遠(yuǎn)程倉(cāng)庫(kù)
修改工程中的pom文件
<project> .... <distributionManagement> <repository> //發(fā)布版本構(gòu)件的倉(cāng)庫(kù) <id></id> //遠(yuǎn)程倉(cāng)庫(kù)的唯一標(biāo)識(shí) <name></name> //自定義 <url></url> //該倉(cāng)庫(kù)地址 </repository> <snapshotRepository>//快照版本的設(shè)置 <id></id> <name></name> <url></url> </snapshotRepository> </distributionManagement> .... </project>
如果需要認(rèn)證,則在setting.xml文件中增加一個(gè)<server>元素進(jìn)行配置
在配置完成后,執(zhí)行mvn clean deploy 就會(huì)根據(jù)當(dāng)前版本類(lèi)型,發(fā)布到相應(yīng)的倉(cāng)庫(kù)中
快照版本
快照不是正式版本,當(dāng)設(shè)為帶有SNAPSHOT的version時(shí),即為快照版本,每次向倉(cāng)庫(kù)部署是,會(huì)自動(dòng)打上時(shí)間戳,其他引用快照相同版本時(shí)會(huì)自動(dòng)下載更新
例如:2.1-SNAPSHOT時(shí),則會(huì)下載2.1-20091214之類(lèi)的構(gòu)件
在maven本地倉(cāng)庫(kù)的groupId/artifactId/version文件路徑下會(huì)存在maven-metadata.xml文件,會(huì)記錄版本信息
<?xml version="1.0" encoding="UTF-8"?> <metadata> <groupId>com.android.support</groupId> <artifactId>multidex</artifactId> <version>1.0.0</version> <versioning> <versions> <version>1.0.0</version> <version>1.0.1</version> </versions> <lastUpdated>20141209014044</lastUpdated> </versioning> </metadata>
maven生命周期
maven的生命周期是抽象的,其實(shí)際行為都是由插件來(lái)完成的。
maven的生命周期是不做任何實(shí)際工作,實(shí)際任務(wù)都由插件完成。
maven具有三個(gè)獨(dú)立的生命周期:clean、defeat、site
1、clean生命周期:清理項(xiàng)目,包含三個(gè)phase。
1)pre-clean:執(zhí)行清理前需要完成的工作
2)clean:清理上一次構(gòu)建生成的文件
3)post-clean:執(zhí)行清理后需要完成的工作
2、default生命周期:構(gòu)建項(xiàng)目,重要的phase如下。
1)validate:驗(yàn)證工程是否正確,所有需要的資源是否可用。
2)compile:編譯項(xiàng)目的源代碼。
3)test:使用合適的單元測(cè)試框架來(lái)測(cè)試已編譯的源代碼。這些測(cè)試不需要已打包和布署。
4)Package:把已編譯的代碼打包成可發(fā)布的格式,比如jar。
5)integration-test:如有需要,將包處理和發(fā)布到一個(gè)能夠進(jìn)行集成測(cè)試的環(huán)境。
6)verify:運(yùn)行所有檢查,驗(yàn)證包是否有效且達(dá)到質(zhì)量標(biāo)準(zhǔn)。
7)install:把包安裝到maven本地倉(cāng)庫(kù),可以被其他工程作為依賴(lài)來(lái)使用。
8)Deploy:在集成或者發(fā)布環(huán)境下執(zhí)行,將最終版本的包拷貝到遠(yuǎn)程的repository,使得其他的開(kāi)發(fā)者或者工程可以共享。
3、site生命周期:建立和發(fā)布項(xiàng)目站點(diǎn),phase如下
1)pre-site:生成項(xiàng)目站點(diǎn)之前需要完成的工作
2)site:生成項(xiàng)目站點(diǎn)文檔
3)post-site:生成項(xiàng)目站點(diǎn)之后需要完成的工作
4)site-deploy:將項(xiàng)目站點(diǎn)發(fā)布到服務(wù)器
命令行輸入:$mvn clean 其實(shí)調(diào)用的是clean生命周期的clean階段,執(zhí)行了pre-clean和clean
而這些命令其實(shí)是由插件提供功能的。
自定義綁定插件
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId>//maven官方,官方的可以省略該標(biāo)簽 <artifactId>maven-source-plugin</artifactId>//插件 <version>2.1.1</version>//沒(méi)有version時(shí),會(huì)默認(rèn)下載最新的release版本 <executions>//配置執(zhí)行n個(gè)任務(wù) <execution> <id>attach-sources</id>//可以任意 <phase>verify</phase>//綁定到verify生命周期,在此時(shí)才會(huì)起作用 <goals> <goal>jar-no-fork</goal>//啟用該插件的jar-no-fork功能 </goals> </execution> </executions> </plugin> </plugins> </build>
因?yàn)橐粋€(gè)插件可能存在多個(gè)功能,但我們并不一定所有的功能都需要,所以設(shè)定goal標(biāo)簽,表示我們要實(shí)現(xiàn)的功能。
插件配置
命令行配置:$mvn install -Dt 插件相關(guān)參數(shù) //適用于當(dāng)每次運(yùn)行時(shí),這個(gè)插件的配置都會(huì)變的情況
pom中全局配置:
<build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> //jdk1.7 <target>1.7</target> //編譯后jdk1.7 </configuration> </plugin> </plugins> </build>
聚合(多模塊)
意義:一次構(gòu)建所有想要構(gòu)建的項(xiàng)目
<project> <modelVersion>4.0.0</modelVersion> <groupId>org.son.nexus</groupId> <artifactId>nexus-indexer</artifactId> <version>2.0.0</version> <packaging>pom</packaging>//本身也是一個(gè)maven工程 <modules> <module>account-email</module>//想要構(gòu)建的項(xiàng)目,這里寫(xiě)的是當(dāng)前pom文件下的相對(duì)路徑地址 <module>account-persilist</module> </modules> </project>
聚合pom文件的packaging標(biāo)簽一定要是pom,其工程就只是一個(gè)pom文件,沒(méi)有其他的實(shí)現(xiàn)代碼
一般來(lái)說(shuō)模塊處的目錄名應(yīng)與其artifactId一致
聚合模塊與其他模塊的目錄結(jié)構(gòu)并非一定要父子關(guān)系
繼承
父pom
<project> <modelVersion>4.0.0</modelVersion> <groupId>org.son.nexus</groupId> <artifactId>nexus-indexer</artifactId> <version>2.0.0</version> <packaging>pom</packaging>//本身也是一個(gè)maven工程 <dependencies> <dependency> <groupId>com.juv</groupId> <artifactId>project-B</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>com.juv</groupId> <artifactId>project-C</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.juv</groupId> <artifactId>project-B</artifactId> <version>1.1.0</version> </dependency> </dependencies> </project>
父pom的packaging也是pom
子pom
<project> <modelVersion>4.0.0</modelVersion> <groupId>org.son.nexus</groupId> <artifactId>nexus-B</artifactId> <version>2.0.0</version> <packaging>jar</packaging> <parent> <groupId>org.son.nexus</groupId> <artifactId>nexus-C</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath>//相對(duì)路徑 </parent> </project>
子pom的packaging則不一定要是pom,但一定有parent標(biāo)簽
子類(lèi)的groupId和version也可以繼承與父pom文件
<dependencyManagement>標(biāo)簽
作用:當(dāng)子類(lèi)不需要父pom中的某些依賴(lài)的時(shí),就可以使用。
父pom
<dependencyManagement> <dependencies> <dependency> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> <version>3.1.1.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
被<dependencyManagement>標(biāo)簽所包裹的依賴(lài)是不會(huì)主動(dòng)被加載進(jìn)入子pom中,只有子pom中顯式再次聲明的時(shí)候才會(huì)被依賴(lài)
子pom
<dependencies> <dependency> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </dependency> </dependencies>
可以省略version等其他配置,因?yàn)楦竝om中已經(jīng)配置過(guò)了
若想獲取父pom中所有的dependencyManagement中的構(gòu)件配置,則在子pom中如下配置
<dependencyManagement> <dependencies> <dependency> <artifactId>account-parent</artifactId> <groupId>com.juvenxu.accout</groupId> <version>3.1.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
配置父pom的一些信息
插件管理
父pom中的插件不想在子類(lèi)中默認(rèn)使用
跟依賴(lài)管理一樣,被<pluginManagement>包裹的插件配置不會(huì)被子pom主動(dòng)獲取,只有當(dāng)子pom中聲明了該插件的groupId和artifactId后,才會(huì)被繼承
一個(gè)pom文件既可以是聚合也可以是父pom
反應(yīng)堆
在聚合構(gòu)建時(shí),構(gòu)件模塊的先后順序的排列。
按書(shū)寫(xiě)的先后順序進(jìn)行構(gòu)建
加料區(qū)
如果同一個(gè)項(xiàng)目中存在多個(gè)模塊相互依賴(lài)時(shí)候,version和groupId可以使用${project.groupId}(當(dāng)前模塊的groupId)和${project.verison},這樣就不用不斷的更改了。
<finalName>標(biāo)簽用來(lái)確定最終包名
以上です(Ending)
ありがどう(Thank You)
以上就是Maven版本依賴(lài)pom文件的詳細(xì)內(nèi)容,更多關(guān)于Maven版本依賴(lài)pom文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java類(lèi)中生成jfreechart,返回圖表的url地址 代碼分享
這篇文章介紹了java類(lèi)中生成jfreechart,返回圖表的url地址的代碼,有需要的朋友可以參考一下2013-08-08java.io.UnsupportedEncodingException異常的正確解決方法(親測(cè)有效!)
這篇文章主要給大家介紹了關(guān)于java.io.UnsupportedEncodingException異常的正確解決方法,文中介紹的辦法親測(cè)有效,java.io.UnsupportedEncodingException是Java編程語(yǔ)言中的一個(gè)異常類(lèi),表示指定的字符集不被支持,需要的朋友可以參考下2024-02-02Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(63)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08詳解Spring Boot 定時(shí)任務(wù)的實(shí)現(xiàn)方法
最近在用SpringBoot寫(xiě)一個(gè)關(guān)于定時(shí)項(xiàng)目的時(shí)候遇到一個(gè)問(wèn)題,下面小編把如何處理定時(shí)任務(wù)的解決思路分享給大家 ,需要的朋友參考下2017-05-05Java聊天室之使用Socket實(shí)現(xiàn)通信功能
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易聊天室之使用Socket實(shí)現(xiàn)通信功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下2022-10-10Java?常量池詳解之字符串常量池實(shí)現(xiàn)代碼
這篇文章主要介紹了Java?常量池詳解之字符串常量池,本文結(jié)合示例代碼對(duì)java字符串常量池相關(guān)知識(shí)講解的非常詳細(xì),需要的朋友可以參考下2022-12-12