maven插件说明
http://blog.csdn.net/huanghonghuigood/article/details/7496295
Maven的核心概念除了坐標、依賴及倉庫之外還有兩個核心的概念即生命周期和插件,對于Maven的生命周期是抽象的概念,其實際行為是由插件完成的,命令行的輸入其實對應了插件的執行,如mvn?package就表示執行默認的package階段的任務,其行為由maven-jar-plugin完成。由此我們可知生命周期和插件兩者是協同工作的,密不可分,本文將主要對插件其進行詳細的介紹。
1.生命周期
項目構建的生命周期的概念在Maven出現之前就有了,軟件開發人員每天都在對項目進行清理、編譯、測試及部署。項目總是以手動或是腳本的方式反復的進行,沒有統一的規范,Maven在不斷的思考中總結了一套高度完善的、易擴展的生命周期。?這個生命周期包含了項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等。生命周期和插件的關系如圖1.1所示
?
?? 圖1.1
也就是生命周期的行為其實和對應的插件是聯系在一起的,插件執行命令行任務。
2.插件的綁定
Maven的生命周期與插件相互綁定,用以完成實際的構建任務。具體而言,是生命周期的階段與插件的目標綁定。例如項目編譯這一任務,它對應了default生命周期的compile階段,而maven-compiler-plugin這一插件的compile目標就能完成這一任務,因此將它們綁定就能實現編譯。
可能初學者會疑惑,自己并沒有去綁定maven-compiler-plugin這個插件,為何還是能執行編譯。其實maven為了讓用戶不用做任何配置就能構建maven項目,已經做了內置綁定,maven核心為主要生命周期階段綁定了許多插件的目標,當用戶通過命令調用生命周期階段的時候,maven會檢查是否用戶的本地倉庫有無這些綁定的插件,沒有的話就會從遠程倉庫下載,這樣對應的插件就會執行相應的任務了。
當然有內置綁定自然也有自定義綁定,用戶可以根據自己項目需要選擇某個插件的某個目標綁定到某個階段。比如項目中我們經常要打source包,此時可以利用maven-source-plugin的jar-no-fork目標綁定到default生命周期的verify階段上,具體配置如下所示:
??<build>
????<plugins>
??????<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
????????<executions>
????????<execution>
????????<id>attach-sources</id>
????????<phase>verify</phase>
????????<goals>
????????<goal>jar-no-fork</goal>
????????</goals>
????????</execution>
????????</executions>
??????</plugin>
????</plugins>
??</build>
3.插件的配置使用
3.1、命令行配置插件
在maven的使用過程中,我們經常會使用命令來執行maven命令,同樣的很多插件也支持命令行配置來改變其某個行為,比如我們有時install時不想進行test階段,那么此時我們就只需改變maven-surefire-plugin的maven.test.skip參數就可以做到:
$?mvn?install?-Dmaven.test.skip=true
參數-D是java自帶的,其功能就是設置一個java系統屬性?
3.2、POM中插件全局配置
命令行設置有時是挺方便的,它改變的是少量插件的幾個屬性參數而已,但有些插件的參數從整個項目創建到發布都不會改變,那么POM的配置比命令行就方便了。以下列出了一些常用的插件的配置:
(1)Complier插件
該插件artifactId為maven-compiler-plugin,作用是編譯工程源碼(包含測試源碼),默認使用JDK的javac命令進行編譯。一個默認的配置如下所示:
?
?
由于compile實際調用的還是java命令,所以在編譯的時候還需要配置如下的Compiler參數傳遞給java編譯器:
執行命令:mvn?compile
(2)Surefire插件
該插件的artifactId為maven-surefire-plugin,作用是執行單??元測試,可參考的配置如下所示:
?
特殊的可選配置如下:
1)忽略測試
在<configuration?/>下打開<skip>true</skip>,可以忽略測試 (與命令行的配置效果相同);
2)包含或者排除測試
<configuration>
??????<!—包含的測試用例-->
<includes>
<include>sample.java</include>
</?includes?>?
<!—排除的測試用例-->
<excludes>
<exclude>**/circleTest.java</exclude>
</?excludes?>
<?/configuration?>
執行命令:mvn???test
(3)War插件
該插件artifactId為maven-war-plugin,主要作用是負責收集依賴、類和資源然后進行打包。參考配置如下:
<plugin>??
?????<groupId>org.apache.maven.plugins</groupId>??
?????<artifactId>maven-war-plugin</artifactId>??
?????<version>2.1-alpha-1</version>??
?????<configuration>?????????
????<!—排除的不需要的jar-->
<warSourceExcludes>
??????????????????*/lib/analyzer-?2.0.4.jar
???????????????</warSourceExcludes>
? <webResources>
<resource>???????????????
?????????<directory>
src/main/webapp/WEB-INF
??????????????????</directory>?
<!--?目標路徑?-->??
??????????<targetPath>WEB-INF</targetPath>??
????????</resource>??
??????</webResources>??
?????</configuration>??
??</plugin>??
? ??
執行命令:mvn??war
(4)Jar插件
該插件artifactId為maven-jar-plugin,主要作用是建立和部署jar包,默認綁定生命周期階段的包,參考配置如下:
<plugin>??
???<groupId>org.apache.maven.plugins</groupId>??
???<artifactId>maven-jar-plugin</artifactId>?
???<version>2.4</version>??
?????<configuration>??
????? <classesDirectory>
??????????? project1/WEB-INF/classes
?????????? </classesDirectory>
<finalName>project1</finalName>??
?????????<outputDirectory>target</outputDirectory>??????</configuration>??
</plugin>?
執行命令:mvn???jar
(5)Clean插件
該插件artifactId為maven-clean-plugin,主要用于清理構建過程中產生的文件,它只有一個目標(goal)即clean,常見的配置如下:
<plugin>?
???? <artifactId>maven-clean-plugin</artifactId>? ???<version>2.4.1</version>?
<configuration>?
<!—跳過clean-->
<skip>true</skip>
<!—忽略錯誤-->
?????????<failOnError>false</failOnError>
</configuration>?
</plugin>
執行命令:mvn??clean
(6)Install插件
該插件artifactId為maven-install-plugin,主要作用是將項目部署至本地倉庫,參考配置如下:
????<plugin>
????? ???<groupId>org.apache.maven.plugins</groupId>
????? <artifactId>maven-install-plugin</artifactId>
????? <version>2.3.1</version>
????? <configuration>
<!--?是否要創建校驗-->
????? <createChecksum>false</createChecksum>
<!--?是否更新元數據-->à????? ??? <updateReleaseInfo>true</updateReleaseInfo>
????? ??</configuration>
?????</plugin>
執行命令:mvn??install
(7)Deploy插件
???該插件artifactId為maven-deploy-plugin,主要作用是將構件部署至遠程倉庫或共享倉庫,參考配置如下:
?<plugin>
????????<groupId>org.apache.maven.plugins</groupId>
????????<artifactId>maven-deploy-plugin</artifactId>
?????????<version>2.4</version>?
?????????<configuration>
?<!—選擇遠程倉庫-->
???????? ?<altDeploymentRepository>
??????? ????<id>NewtouchProduct</id>
????????? ????<name>NewtouchProduct</name>
? <url>???????????????? ?? ????????? http://192.168.17.200:8081/nexus/content
/repositories/newtouchOneProject
?????????????????</url>
?????????</altDeploymentRepository>
?????<!—選擇是否更新元數據,作為release版本發布-->
?????????<updateReleaseInfo>true</updateReleaseInfo>
?????????</configuration>?
??????</plugin>
執行命令:mvn??deploy
(8)Ant??Run插件
???該插件artifactId為maven-antrun-plugin,它有一個目標run,可以用來在maven中調用Ant任務,參考配置如下:
(9)Release插件
??該插件artifactId為maven-release-plugin,主要用于版本的自動化發布,發布一個版本需要兩步:prepare和release,參考配置如下:
1)為項目發布版本首先需要添加正確的版本控制系統信息 ,也就是說需要告訴release插件源碼的位置,所以需要配置SCM信息
2)上述的配置只告訴了maven當前代碼的位置,而版本發布還要?涉及標簽的操作,因此還需要配置標簽的基礎目錄,在版本發布的過程中,maven會從源碼位置checkout一個副本至tags下,在此目錄下操作,而不是在源碼目錄下操作,配置如下:
注意點:
a)系統必須提供svn命令行工具,maven執行過程中需要svn命 令行工具執行相關操作。
b)Pom必須配置了可用的部署倉庫。
(10)Jetty插件
???該插件artifactId為jetty-maven-plugin,它能周期性的檢查項目的內容,發現變更后自動更新到內置的Jetty?Web容器中,這時我們就可以直接測試web頁面了,參考配置如下:
注意:
由于jetty-maven-plugin的groupId是org.mortbay.jetty,默認情況?下maven是不支持它的命令調用的,所以需要配置setting.xml:
?????<settings>
<pluginGroups>
<pluginGroup>org.mortbay.jetty</pluginGroup>
<pluginGroups>
? <settings>
???啟動命令:mvn???jetty:run
???默認端口是8080,如果希望修改可以添加如下參數:
???mvn???jetty:run??-Djetty.port=9999
附:插件獲取信息
Maven的插件主要來源于Apache、Codehaus和Googlecode
Apache:http://maven.apache.org/plugins/index.html
Codehaus:http://mojo.codehaus.org/plugins.html
Googlecode:http://code.google.com/hosting/search?q=maven+plugin+label%3Amaven&projectsearch=Serach+Projects
?
總結
- 上一篇: Unable to update ind
- 下一篇: 与用户登录shell相关的文件/etc/