maven基本知識整理
1. 基本功能和用途
maven是 一個專案管理和構建自動化的工具,相比於ant,maven不需要寫複雜的指令碼,採用宣告式的類庫依賴管理。可以完成專案構建,比如生成war,打包jar;可以生成專案文件,比如javadoc;生成報告,比如junit測試報告;生成依賴類庫,執行釋出和部署等。
maven的安裝過程比較簡單,網上有很多教程,不再贅述。maven的配置,主要是配置環境變數,修改conf下的setting檔案。該過程可以參考:http://maven.oschina.net/help.html
2. pom檔案解析
pom檔案格式整理規則
描述依賴關係的繼承關係 <parent>
多模組的工程描述
<modules>
第一塊應該為當前專案的相關說明。
<project>
第二塊為依賴中所使用的版本變數,
<properties>
第三塊為依賴的jar包集合
<dependencies>
第四塊為依賴的jar的版本說明,解除部分依賴集
<dependencyManagement>
第五塊為構建時的設定
<build>
第六塊為專案中資原始檔的位置
<resources>
設定管理,管理專案引用不同的環境設定
<profiles>
專案中引用的外掛
<plugins>
外掛管理
<pluginManagement>
還可以設定公告資訊
<reportings>
許可檔案<licenses>
開發者資訊<developers>
分發管理,告訴別的專案如何抓取本專案
<distributionManagement >
其中<dependencies>
中有座標的概念,形式如:
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId >
<version>2.6</version>
<scope>***</scope>
</dependency>
其中,groupId,atrifactId和version:依賴的jar的基本座標,maven根據座標可以找到所需要的依賴
scope:依賴的範圍。maven有6種依賴範圍,分別是:
1.compile:編譯依賴範圍。如果沒有指定,所有的專案依賴都會預設使用該依賴範圍。
2.test:測試依賴範圍,跑單元測試時的maven依賴,例如junit
3.provided:以提供的依賴訪問,例如servlet-api。web應用容器就提供了,所以不需要maven重複引入一遍
4.runtime:執行時依賴範圍,例如JDBC驅動實現。
5.system:系統依賴範圍,和provided依賴範圍完全一直,例如jdk種rt.jar。該類依賴範圍和系統配置相關,不能通過maven倉庫管理,所以慎用。
6.import:匯入依賴範圍(目前基本沒用過)。
上面的依賴範圍都與相應生命週期對應的classpath對應。比如,測試時maven用的是一套classpath,執行時用的時另外一套classpath。
最好的例子還是使用junit。我們只有在測試時才會用到這個專案依賴,所以它的scope就是test。
type:依賴的型別,大部分情況下不用定義,預設值是jar
optional:標記依賴是否可選。(ps:這個太複雜,還沒想好怎麼簡單的表述出來)
<dependencyManagement>
為依賴的jar的版本說明,解除部分依賴集,解除時使用exclusions:
exclusions:用來排除傳遞性依賴。
這裡需要解釋下什麼叫傳遞性依賴。如果一個A.jar包依賴B.jar包,B.jar包依賴於C.jar包,那麼我們就認為A.jar直接依賴於B.jar,而A.jar間接依賴於C.jar.
而這種依賴關係會給專案隱式的引入很多依賴,這大大的簡化了專案依賴的管理,但是有些時候這種特性也會帶來問題,例如當前專案中使用了C.jar的最新版本,而B.jar中依賴的C.jar版本過低,並且新舊版本並存會直接影響到當前專案,這時就可以使用exclusions來排除依賴傳遞性。
一般情況下 ,在整理pom檔案或引入新的jar包時,往往需要解決傳遞性依賴的問題。
3. 生命週期概述
生命週期是maven的核心概念。有三種內建的生命週期:default,clean,site。default解決專案釋出,clean解決專案清除。
default生命週期由以下過程組成:
* validate - validate the project is correct and all necessary information is available
* compile - compile the source code of the project
* test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
* package - take the compiled code and package it in its distributable format, such as a JAR.
* integration-test - process and deploy the package if necessary into an environment where integration tests can be run
* verify - run any checks to verify the package is valid and meets quality criteria
* install - install the package into the local repository, for use as a dependency in other projects locally
* deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
4 基本指令整理
- 建立Maven的普通java專案:
mvn archetype:create
-DgroupId=packageName
-DartifactId=projectName
- 建立Maven的Web專案:
mvn archetype:create
-DgroupId=packageName
-DartifactId=webappName
-DarchetypeArtifactId=maven-archetype-webapp
- 編譯原始碼: mvn compile
- 編譯測試程式碼:mvn test-compile
- 執行測試:mvn test
- 產生site:mvn site
- 打包:mvn package
- 在本地Repository中安裝jar:mvn install
- 清除產生的專案:mvn clean
- 生成eclipse專案:mvn eclipse:eclipse
- 生成idea專案:mvn idea:idea
- 組合使用goal命令,如只打包不測試:mvn -Dtest package
- 編譯測試的內容:mvn test-compile
- 只打jar包: mvn jar:jar
- 只測試而不編譯,也不測試編譯:
mvn test -skipping compile -skipping test-compile
( -skipping 的靈活運用,當然也可以用於其他組合命令) - 清除eclipse的一些系統設定:mvn eclipse:clean
此外:
1. 構建的時候跳過測試, mvn install -Dmaven.test.skip=true
如果是eclipse,勾選那個skipTest選項
2. 在實際中通常同一個專案有多個配置檔案,比如有local,dev,beta,prod等,構建的時候需要指定配置檔案時,使用:mvn -Pdev package
還有一種方法是手動的改pom檔案,在dev的節點下,新增:
<activation>
<activeByDefault>true</activeByDefault>
</activation>