1. 程式人生 > >maven基本知識整理

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 基本指令整理

  1. 建立Maven的普通java專案:
mvn archetype:create
   -DgroupId=packageName
   -DartifactId=projectName 
  1. 建立Maven的Web專案:
    mvn archetype:create
    -DgroupId=packageName   
    -DartifactId=webappName
    -DarchetypeArtifactId=maven-archetype-webapp  
  1. 編譯原始碼: mvn compile
  2. 編譯測試程式碼:mvn test-compile
  3. 執行測試:mvn test
  4. 產生site:mvn site
  5. 打包:mvn package
  6. 在本地Repository中安裝jar:mvn install
  7. 清除產生的專案:mvn clean
  8. 生成eclipse專案:mvn eclipse:eclipse
  9. 生成idea專案:mvn idea:idea
  10. 組合使用goal命令,如只打包不測試:mvn -Dtest package
  11. 編譯測試的內容:mvn test-compile
  12. 只打jar包: mvn jar:jar
  13. 只測試而不編譯,也不測試編譯:mvn test -skipping compile -skipping test-compile ( -skipping 的靈活運用,當然也可以用於其他組合命令)
  14. 清除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>