Maven常用命令:
- 項目編譯:
mvn clean compile 或者 clean compile -U
- 項目打包:
mvn clean package
- 執行測試:
mvn clean test
- 安裝到本地倉庫:
mvn clean install
- 創建項目骨架:
mvn archetype:generate
小技巧
- 檢查jar包衝突命令:
mvn -X compile dependency:tree -Dverbose >a.log
執行此命令可以檢查Jar包版本衝突:mvn -X compile dependency:tree -Dverbose >a.log
,然後在a.log文件裏查找 是否有”omitted for conflict with”,如果有,則表示jar包有版本衝突 ;
注意:有版本衝突的也會顯示編譯成功的。(mvn dependency:tree -Dverbose | grep “omitted for conflict with” )
根據提示的衝突,修改pom文件,即將衝突的jar包管理起來,在節點中加入衝突的依賴包,並確認版本。
所有依賴的版本號應使用dependencyManagement 顯示管理,若要引用依賴,需在dependencyManagement 下面寫上該依賴的dependency,不用再寫version。
一、Maven座標和依賴
Maven倉庫的佈局,說白了就是唯一路徑。
- 座標
Maven座標爲各種構件引入了執行,任何一個構件都必須明確定義自己的座標,一組maven座標通過一些元素定義,分別是groupId,artifactId,version,packaging,classifier,如下
<groupId>com.lesserPanda.interfaces</groupId>
<artifactId>mobile</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
1、groupId:定義maven項目隸屬的實際項目,一般域名反過來,如:com.lesserPanda
2、artifactId:該元素定義實際項目中的一個maven項目(模塊),推薦做法是使用實際項目名稱作爲artifactId的前綴。
3、version:該元素定義maven項目當前所處的版本。
4、packaging:該元素定義maven項目的打包方式。
5、classifier:該元素用了幫助定義構建輸出的一些附屬構件
上述5各元素中,groupId,artifactId,version是必須的,packaging可選的,默認jar,打包命令:mvn clean package。
- 依賴
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<type>……</type>
<scope>……</scopt>
<optional>……</optional>
<exclusions>
<exclusion>
<groupId>……</groupId>
<artifactId>……</artifactId>
<version>……</version>
</exclusion>
</exclusions>
</dependency>
………………
<project>
1、groupId、artifactId、version:依賴的基本座標,對於一個依賴來說,基本座標是最重要的。
2、type:依賴的類型,對應於項目座標定義的packaging,默認爲jar
3、scope:依賴的範圍,包括
- compile:編譯依賴範圍,如果沒有指定,默認使用該依賴範圍,對編譯,測試,運行都有效。
- test:測試依賴範圍,此依賴範圍,只對測試有效在編譯主代碼或者運行項目時無效
- Provided:已提供依賴範圍,此依賴範圍對於編譯和測試有效,對於運行無效
- Runtime:運行時依賴範圍
- System:系統依賴範圍,和provided完全一致。使用systemPath元素顯示地指定依賴文件的路徑
4、optional:標記依賴是否可選,如果爲true,只對當前項目產生影響,不會傳遞性依賴。
5、exclusions:用來排除傳遞性依賴
- 傳遞性依賴,比如A依賴B,B依賴C,A、B、C都是默認依賴範圍,則A依賴C。依賴原則:第一:路徑近者優先,第二:第一聲明者優先。
二、maven倉庫
分爲本地倉庫和遠程倉庫,當maven根據座標尋找構件的時候,首先查看本地倉庫,如果本地倉庫存在此構件,直接使用,如果本地不存在或者需要查看是否有更新的構件版本,maven就會去遠程倉庫查找,發現構件之後,下載到本地倉庫在使用。
- 中央倉庫是maven核心自帶的遠程倉庫,包含絕大部分開源的構件
- 私服是架設在局域網內的私有的倉庫服務器,用其代理外部的遠程倉庫,節省時間和帶寬,並且可以部署自己的私有項目供其他項目使用,
- 本地倉庫,默認的路徑名爲
.m2/repository/
的倉庫目錄,windows下默認C:\Users\Administrator\.m2\repository\
,linux下目錄地址爲/home/xxxx/.m2/repository/
。可以通過設置修改本地倉庫地址:
<!-- 配置本地的倉庫地址 -->
<localRepository>E:\\mavenRepository</localRepository>
這樣倉庫地址就被設置成E:\\mavenRepository
不要直接修改根目錄下的settings.xml,複製一份進行修改。
如果自己的一個maven項目被其他項目引用,通過mvn clean install將項目安裝到本地maven倉庫就可以供其他項目引用。
遠程倉庫,安裝好maven後,如果不執行任何maven命令,本地倉庫目錄是不存在的,用戶執行第一條maven命令後,maven纔會創建本地倉庫,然後根據配置和需要,從遠程倉庫下載構件到本地倉庫
中央倉庫,由於開始本地倉庫是空的,maven必須知道至少一個可用的遠程倉庫,才能執行在maven命令的時候下載到需要的構件,中央倉庫就是一個默認的遠程倉庫,maven安裝自帶的遠程倉庫配置
<repository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://repo1.maven.org/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的maven用戶使用,當maven需要下載構件的時候,它從私服請求,如果私服不存在構件,則從外部遠程倉庫下載,緩存在私服上之後,再爲maven下載請求提供服務。此外,一些無法從外部倉庫下載到的構件也能從本地上傳到私服上供其他人使用。使用私服的好處:
1、 節省自己的外網帶寬
2、 加速maven構建
3、 部署第三方構建
4、 提高穩定性,增強控制
5、 降低中央倉庫的負荷遠程倉庫的配置
很多情況下中央倉庫不能滿足項目需求,需要配置另外一個遠程倉庫。如Jboss倉庫:
<profile>
<id>jboss</id>
<repositories>
<repository>
<id>jboss</id>
<name>jboss_maven2</name>
<url>https://repository.jboss.org/nexus/content/groups/public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
<layout>default</layout>
</repository>
</repositories>
</profile>
在repository元素下可以聲明一個或多個遠程倉庫,這裏聲明瞭一個id爲jboss的倉庫,多個倉庫,id必須唯一,需要注意的是maven自帶的倉庫id爲central。如果其他倉庫聲明id也爲central,將會覆蓋maven自帶的倉庫,url指向倉庫地址,一般基於http協議。這裏的配置中releases和snapshots元素比較重要,他們用來控制maven對於發佈版(正式版)構件和快照版(測試版)的下載,releases的enabled爲true,支持發佈版下載,snapshots的enabled爲false,不支持快照版下載。Releases和snapshots還有另外兩個子元素updatePolicy和checksumPolicy,updatePolicy表示配置maven從遠程倉庫檢查更新的頻率,默認爲daily,表示每天檢查一次,還有naver:從不檢查,always:每次構建都更新,(interval:x)- 每隔x分鐘檢查一次。checksumPolicy配置maven檢查校驗和文件的策略,當構件被部署到maven倉庫時,會同時部署對應的校驗和文件。
- 遠程倉庫的認證
大部分遠程倉庫無需認證就可以訪問,但有時候考慮到安全問題,我們需要提供認證信息才能訪問一些遠程倉庫,如組織內部的私服。配置信息和認證信息配置不同,倉庫信息可以直接配置到pom.xml中,但是認證信息必須配置在setting.xml中,因爲pom.xml往往會被提交帶代碼倉庫供所有成員訪問,而setting.xml只放到本地,所以更安全。配置如下:
<server>
<id>web</id>
<username>admin</username>
<password>1234</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>1234</password>
</server>
</servers>
這裏配置了兩個倉庫的認證信息,一個id爲webs,一個id爲snapshots,賬號密碼一樣,分別爲admin,1234。上述配置中,最重要的是id,一定要與pom.xml中repository元素的id完全一致。通過id進行信息綁定。
部署遠程倉庫
部署遠程倉庫,主要是將第三方或者組織內部的構件放到私服上面供其他成員使用,需要編輯項目的pom.xml文件。配置distributionManagement元素。如下:
<distributionManagement>
<repository>
<id>web</id>
<name>web Repository</name>
<url>http:// 192.168.90.111:5002/repository/web-releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshot Repository</name>
<url>http://192.168.90.111:5002/repository/snapshots</url>
</snapshotRepository>
</distributionManagement>
這裏的id對應上面的認證,當需要部署構件時,需要認證信息。distributionManagement包含兩個子元素,repository和snapshotRepository,分別表示發佈版構件倉庫和快照版構建倉庫。無論下載構件還是部署構件,認證信息是一樣的,配置好之後,執行mvn clean deploy就可以將項目構建輸出的構件部署到遠程倉庫。
- 倉庫鏡像
如果可以從倉庫x獲取所有倉庫y的內容,就可以說x是y的一個鏡像。由於地理等一些原因,鏡像往往可以提供比中央倉庫更快的速度,配置鏡像如下:
<mirrors>
<!-- 阿里雲 -->
<mirror>
<id>CN</id>
<name>aliyun Central</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
```
這裏配置了阿里雲的一個鏡像,這裏mirrorOf元素爲central,表示是中央倉庫的鏡像。任何對中央倉庫的請求都會轉至該鏡像,其他三個元素,與倉庫配置無異,同時如果需要認證,也可以配置認證信息,基於id,與倉庫一致。
鏡像可以配合私服使用,私服可以代理任何的公共倉庫,因此使用私服,相當於使用了所有倉庫,可以將配置集中到私服,從而簡化maven本身的配置,這是所有構件都可以從私服的到,私服就是所有倉庫的鏡像,配置如下:
<!-- 3.配置鏡像,使得maven的構件下載轉到私服中-->
<mirror>
<id>mirrorid</id>
<mirrorOf>*</mirrorOf>
<name>topinfomirrorid</name>
<url>http://192.168.40.39:8081/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
這裏mirrorOf爲*,標識對所有遠程倉庫的請求,都會轉至http://192.168.40.39:8081/nexus/content/groups/public/,如果需要認證,配置一個id爲mirrorid的即可。
<mirrorOf>*</mirrorOf>
:匹配所有遠程倉庫
<mirrorOf>external:*</mirrorOf>
:匹配所有遠程倉庫,除了localhost,file://協議的,即匹配所有不在本機上的遠程倉庫
<mirrorOf>rel1,rel2</mirrorOf>
:匹配rel1,rel2兩個倉庫
<mirrorOf>*,!rel1</mirrorOf>
:匹配所有倉庫,排除rel1.
由於鏡像倉庫屏蔽了所有被鏡像倉庫,當鏡像倉庫掛掉的時候,將無法下載構件。
三、生命週期
三套獨立的生命週期,clean,default,site。Clean生命週期的目的是清理項目,default生命週期的目的是構建項目,sit聲明週期的目的是建立項目站點。每個生命週期都包含一定的階段,這些階段都是有序的,並且後面的階段依賴前面於前面的階段
Clean生命週期:
clean生命週期的目的是情理項目,包含三個階段:
1、 pre-clean執行一次清理前需要完成的工作
2、 clean清理上一次構建生成的文件
3、 post-clean執行一些清理後需要完成的工作default生命週期:、
default生命週期定義了真正構建是所需要執行的所有步驟,它是所有生命週期中最核心的部分。其包含的階段如下:
1、 validate
2、 initialize
3、 generate-sources
4、 process-sources處理項目主資源文件。一般來說是對src/main/resources目錄的內容進行變量替換等工作後,複製到項目輸出的主classpath目錄中
5、 generate-resources
6、 process-resources
7、 compile編譯項目的主源碼,一般來說,是編譯src/main/java目錄下的java文件至項目輸出的主classpath目錄中
8、 process-classes
9、 generate-test-sources
…………
10、 package接受編譯好的代碼,打包成可發佈的格式,如JAR
11、 install將包安裝到Maven本地倉庫,供本地其他maven項目使用
12、 deploy將最終的包複製到遠程倉庫,供其他開發人員和maven項目使用site生命週期
site生命週期的目的是建立和發佈項目站點
1、 pre-site執行一些在生成項目站點之前需要完成的工作
2、 site生成項目站點文檔
3、 post-site執行一些在生成項目站點之後需要完成的工作
4、 site-deploy將生成的項目站點發布到服務器上命令行與生命週期
mvnclean:該命令調用clean生命周期的clean階段。實際執行的是clean生命周期的pre−clean和clean階段。 mvn clean install:該命令調用clean生命週期的clean階段和default生命週期的install階段。
$mvn clean deploy site-deploy:該命令調用clean生命週期的clean階段,default生命週期的deploy階段以及site生命週期的site-deploy階段。插件綁定
Maven生命週期與插件項目綁定,用以完成實際的構建任務。如maven-compile-plugin插件的compile目標綁定default生命週期compile這一階段,可以完成項目編譯這一目的。內置綁定:maven在覈心爲一些主要的生命週期階段綁定了很多插件目標,當用戶通過命令行調用生命週期階段的時候,對應的插件目標就會執行相應的任務。如clean生命週期僅有pre-clean,clean和post-clean三個階段,其中的clean與maven-clean-plugin:clean綁定,maven-clean-plugin僅有clean這一個目標,作用就是刪除項目的輸出目錄。當我們執行maven命令的時候,控制檯會打印綁定關係信息。如執行mvn clean install會看到調用了maven-clean-plugin,maven-resources-plugin,maven-compiler-plugin等。
自定義綁定插件