Maven做爲Java語言的構建和依賴管理工具,已經被普遍使用。但對於maven的pom.xml的配置以及插件的使用,大部分人也僅僅限於瞭解的程度。工欲善其事,必先利其器。在拖延了好久後,決定仍是花時間根據《maven實戰》這個書來進一步深刻了解maven的使用。這個系列是在學習maven過程當中的筆記和總結,聊以記錄,利人利己。html
項目構建的文件名是與座標相對應的,通常的規則是artifactId-version[-classifier].packaging,[-classifier]爲可選java
pom.xml中<dependencies>標籤下包含一個或多個<dependence>元素,來聲明一個或多個項目依賴。每一個依賴能夠包含的元素有spring
若是項目的依賴有本身的依賴,則項目也會加載依賴的依賴。好比spring-core依賴commons-logging,若是項目依賴了spring-core,那麼它也會依賴commons-logging。當依賴的聲明爲可選時(<optional>true</optional>),依賴不會傳遞。apache
由於存在依賴傳遞,就會有不一樣的依賴中有不一樣版本的基礎依賴,如A -> X(1.0),B -> C -> X(2.0),這樣X就有不一樣的版本,哪一個會被maven解析呢?因而就有了依賴調解的兩個原則:api
項目中可能存在,由於一些緣由,不想引入某依賴的傳遞性依賴,則可使用exclusions。好比在使用spring時不想用commons-logging,則能夠在spring-core中排除。maven
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.0.M5</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
好比在使用spring時,可能會用到spring-context,spring-jdbc,spring-tx等,但他們的版本是一致的,考慮到之後版本的升級,能夠定義一個spring.version的properties來統一設置版本。ide
<properties> <spring.version>4.1.6.RELEASE</spring.version> </properties>
而在依賴的<version>中用${spring.version}代替工具
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency>
// 查看項目依賴列表 mvn dependency:list // 以樹狀顯示依賴列表 mvn dependency:tree // 依賴分析 mvn dependency:analyze
maven有三套相互獨立的生命週期,分別是clean,default,site。學習
每一個生命週期包含一些階段(phase),這些階段是有順序的,而且後面的階段依賴於前面的階段。default是生命週期中最核心的部分,它包含不少階段,如下是常見的幾種階段,全量的階段可見http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference。測試
咱們能夠用命令行來執行生命週期階段
咱們知道maven的核心只定義了抽象的生命週期,具體的任務是交由插件完成的,插件以獨立的構件存在,maven會在須要時下載並使用插件。對於一個插件,可能會有多個功能,每一個功能就對應一個插件目標(Plugin Goal)。
好比maven-dependency-plugin有多個目標,如dependency:list,dependency:tree,dependency:analyze等,冒號前是插件前綴,冒號後是插件目標。相似的,compiler:compile(maven-compiler-plugin的compile目標)和surefire:test(maven-surefire-plugin的test目標)。
在使用時,須要將生命週期的階段和插件目標相互綁定,以完成某個具體的構建任務。如maven-compiler-plugin的compile目標綁定的就是default生命週期的compile階段。
maven內置了不少生命週期階段同插件目標的綁定,好比打包類型爲jar的default生命週期的內置插件綁定關係以下:
生命週期階段 | 插件目標 | 執行任務 |
---|---|---|
process-resources | maven-resources-plugin:resources | 複製主資源文件至主輸出目錄 |
compile | maven-compiler-plugin:compile | 編譯主代碼至主輸出目錄 |
process-test-resources | maven-resources-plugin:testResources | 複製測試資源文件至測試輸出目錄 |
test-compile | maven-compiler-plugin:testCompile | 編譯測試代碼至測試輸出目錄 |
test | maven-surefire-plugin:test | 執行測試用例 |
package | maven-jar-plugin:jar | 建立項目jar包 |
install | maven-install-plugin:install | 將項目輸出構件安裝到本地倉庫 |
deploy | maven-deploy-plugin:deploy | 將項目輸出構件部署到遠程倉庫 |
出了內置的綁定關係外,用戶能夠選擇將某個插件目標綁定到生命週期的某個階段。一個例子是建立項目的源碼jar包,可使用maven-source-plugin的jar-no-fork目標獎項目主代碼打成jar文件,咱們將其綁定到verify階段。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.0.1</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin>
有不少插件的目標在編寫時已經定義了默認綁定階段,可使用命令查看
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 Ddetail
能夠看到輸出的信息中有
source:jar-no-fork ... Bound to phase: package
即jar-no-for默認綁定的生命週期階段爲package
用戶能夠經過命令行和pom配置來配置插件的參數
1.命令行配置,用戶能夠在maven命令中使用-D參數,指定一個key-value的形式,來配置插件目標的參數。例如maven-surefire-plugin提供了一個maven.test.skip參數,當爲true時,就跳過執行測試。
mvn install -Dmaven.test.skip=true
2.pom中插件全局配置,全部基於該插件目標的任務都會使用此配置,常見的youmaven-compiler-plugin編譯java的版本。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>utf-8</encoding> </configuration> </plugin>
3.用戶能夠爲某個插件任務配置特定的參數,將maven-antrun-plugin:run綁定到多個生命週期階段上,加以不一樣的配置
<plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <id>ant-validate</id> <phase>validate</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>validate phase</echo> </tasks> </configuration> </execution> <execution> <id>ant-verify</id> <phase>verify</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>verify phase</echo> </tasks> </configuration> </execution> </executions> </plugin>
能夠從http://maven.apache.org/plugins/index.html中查詢插件的詳細信息,也可使用maven-help-plugin描述插件。
//查詢插件信息 mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 //查詢插件目標信息 mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 -Dgoal=jar-no-fork //查詢詳細信息 mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 -Ddetail
Maven內置了一些目錄變量,對涉及文件路徑的配置會有幫助