Maven2外掛程式開發詳解
來源:互聯網
上載者:User
在Maven2強大功能的魅力誘惑下,很多公司漸漸開始從Ant轉向了Maven2,而且由於Maven2本來就支援運行Ant指令碼,這樣就大大降低了Team Dev在從Ant向Maven2過渡所需難度。相對於Ant對開發人員的相對開放的姿態,Maven2對開發人員來說看起來比較透明。很多對以前老的Ant程式員
來說需要編寫target的問題在Maven2中都變成了一些簡單的配置。理論上講,這樣一來,Maven2的使用起點應該是比Ant低多了,因為在
Ant中程式員至少應該熟悉Velocity文法才行。但是由於Maven2到目前為止還沒有成套系統的中文資料或文檔可供查看,使得Maven2的使用
看起來並不比Ant簡單多少。反倒是由於什麼東西都需要進行配置,但手頭又沒有相關的說明文檔,是很多開發人員在剛開始使用Maven2時有些無從下手的
感覺。更讓人痛苦的是網上很多關於Maven的資料都是針對1.0版本的,更可恨的是很多資料明明是基於1.0版本寫的,可是我們的作者只是換換標題和其
中的幾個關鍵字資訊就堂而皇之的將其作為2.0的資料貼在自己的部落格中(極其不負責任)。
前面這一段是廢話,僅僅是為了將大家引入我下面的話題,在使用Maven進行工程管理的過程中,我們可能希望將現有的Ant指令碼整合到我們的POM中,我
們甚至希望在POM中不出現Ant指令碼的情況下將以前已經寫好並使用了很長一段時間的工程指令碼整合到我們現有的Maven工程當中。同時,或者現有的
Maven無法支援我們需要完成的一些特殊任務。 這樣一個話題自然就擺在了我們的面前,那就是Maven2的外掛程式開發。 說道Maven2就不得不說說Maven2主要部分的標準路徑結構(如)。<sourceDirectory>src/main/java</sourceDirectory><scriptSourceDirectory>src/main/scripts</scriptSourceDirectory><testSourceDirectory>src/test/java</testSurceDirectory><outputDirectory>target/classes</outputDirectory><testOutputDirectory>target/test-classes</testOutputDirectory>這些路徑是Maven2配置的基礎(還有些其他路徑,不再詳述), 通常情況下,我們沒必要顯式聲明路徑結構。除非我們要改變其標準路徑結構時,可以通過配置以上參數來進行個人化配
置。但是Maven2的官方網站強烈建議使用Maven的標準路徑。而且Maven官方提供的某些外掛程式也只僅僅支援到了標準路徑,對於非標準路徑這些配置
不起任何作用(如Cobertura1.8的plug-in)。 (Maven2官方提供的Cobertura1.8的plug-in有些Bug,無法正確產生最後的Coverage Test Reporting。關於這個問題的解決我打算重開一個專題,以便今後查閱。) 因此,我在本篇文章中介紹的外掛程式開發也採用Maven2的標準路徑。先說說Ant plug-in的開發,然後在介紹用Java進行plug-in 開發。
Ant
的
Maven2 plug-in
開發 Maven的一個很明顯有別與Ant的優勢就是在於明確了工程中所用資源套件的版本資訊,目前我們在工程開發過程中都
不免需要用到大量的免費開源的第三方外掛程式,而這些外掛程式在升級過程中的向前相容做的有時候確實不太理想,就想Hibernate在升級到3.0後包結構的變
化一樣,讓很多開發人員在剛開始使用時都是一頭霧水,但是由於Maven2可以明確指明所使用的資源套件版本資訊,這樣就避免了工程中由於資源套件版本混亂導
致程式崩潰的問題。 Ant指令碼的plug-in開發需要在POM中聲明兩個資源套件,一個是在編譯打包產生plug-in的jar檔案時所需要用到的資源套件,一個是在plug-in在被執行時,運行Ant指令碼所需要的資源套件。具體POM的配置如下所示:<project> <modelVersion>4.0.0</modelVersion> <groupId>org.myproject.plugins</groupId> <artifactId>hello-plugin</artifactId> <version>1.0-SNAPSHOT</version> <packaging>maven-plugin</packaging> <name>Hello Plugin</name> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-script-ant</artifactId> <version>2.0.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-plugin-plugin</artifactId> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-tools-ant</artifactId> <version>2.0.1</version> </dependency> </dependencies> <configuration> <goalPrefix>hello</goalPrefix> </configuration> </plugin> </plugins> </build></project> 可以看出我這裡並沒有對Maven2的路徑做任何顯示的聲明。根據Maven2的標準路徑,我們需要將plug-
in工程中的指令檔放在src/main/scripts路徑下去。所以,首先在工程中建立這樣一個目錄,然後在目錄中開始編寫Ant指令碼
(hello.build.xml):<project> <target name="hello"> <echo>ANT SCRIPT ECHOS:Hello, World</echo> </target></project> 接下來編寫MOJO指令碼(hello.mojos.xml),MOJO是Ant指令碼執行的關鍵,我們也需要將其與
Ant指令碼放置在同一個目錄src/main/scripts下,在該檔案中定義Maven2的goal和需要執行的Ant指令碼中target名稱。具體
內容如下:<pluginMetadata> <mojos> <mojo> <goal>hello</goal> <call>hello</call> <description>Say Hello, World.</description> </mojo> </mojos></pluginMetadata> 至此,一個完整的基於Maven2的Ant plug-in就已經開發完畢。為了方便舉例,我在這裡的Ant指令碼寫得相當簡單,你可以在這雷根據你的工程具體需求盡情發揮。 接下來執行一下“mvn install”,提示內容如下則說明已經成功發布到了本地倉庫中:
D:/eclipse/workspace/hello-plugin>mvn install -e -o
+ Error stacktraces are turned on.
[INFO]
NOTE: Maven is executing in offline mode. Any artifacts not already in your local
repository will be inaccessible.
[INFO] Scanning for projects...
[INFO] ----------------------------------------------------------------------------
[INFO] Building Hello Plugin
[INFO] task-segment: [install]
[INFO] ----------------------------------------------------------------------------
[INFO] [plugin:descriptor]
[WARNING] Goal prefix is: hello; Maven currently expects it to be hello
[INFO] Using 3 extractors.
[INFO] Applying extractor for language: java
[INFO] Extractor for language: java found 1 mojo descriptors.
[INFO] Applying extractor for language: bsh
[INFO] Extractor for language: bsh found 0 mojo descriptors.
[INFO] Applying extractor for language: ant
[INFO] Extractor for language: ant found 1 mojo descriptors.
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] No sources to compile
[INFO] [surefire:test]
[INFO] No tests to run.
[INFO] [jar:jar]
[INFO] Building jar: D:/eclipse/workspace/hello-plugin/target/hello-plugin-1.0-S
NAPSHOT.jar
[INFO] [plugin:addPluginArtifactMetadata]
[INFO] [install:install]
[INFO] Installing D:/eclipse/workspace/hello-plugin/target/hello-plugin-1.0-SNAP
SHOT.jar to E:/maven-2.0.4/.m2/repository/org/myproject/plugins/hello-plugin/1.0
-SNAPSHOT/hello-plugin-1.0-SNAPSHOT.jar
[INFO] [plugin:updateRegistry]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Thu Jun 28 10:39:02 CST 2007
[INFO] Final Memory: 9M/17M
[INFO] ------------------------------------------------------------------------
D:/eclipse/workspace/hello-plugin> 接下來就可以在你的工程中將該外掛程式整合上去了,具體做法為將如下代碼加入你工程的POM中: <build> <plugins> <plugin> <groupId>org.myproject.plugins</groupId> <artifactId>hello-plugin</artifactId> <version>1.0-SNAPSHOT</version> </plugin> </plugins></build> 當然,Maven2對於Ant指令碼的支援也並不是僅僅只到了外掛程式級,你還可以在POM中直接使用Ant指令碼來完成一些任務。為了保證本篇文章的完整性,關於這個專題我打算再開一篇文章專門說明。
Java
的
Maven2 plug-in
開發 在已經建立的Ant plug-in工程中引入代碼如下(對與Struts程式員來說,是不是有點似曾相識的感覺!):
package org.danlley.com;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException; /** * Says "Hi" to the user. *
@goal sayhi */
public
class GreetingMojo
extends AbstractMojo{
public
void execute()
throws MojoExecutionException { getLog().info("-------------------------------------------"); getLog().info("| Hello, world. |"); getLog().info("-------------------------------------------"); }} 其中AbstractMojo和MojoExecutionException都是Maven2核心支援包中的類,
你可以在Maven2安裝路徑的lib目錄下找到maven-core-2.0.6-uber.jar(我用的是version2.0.6,不過現在我在
官方網站看到2.0.7也已經出來了)重新編譯,重新install。然後建立工程,以便測試外掛程式是否能夠正常工作。新工程的POM如下:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.danlley.com</groupId> <artifactId>mvnproj</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>mvnproj</name> <url>http://maven.apache.org</url> <build> <plugins> <plugin> <groupId>org.myproject.plugins</groupId> <artifactId>hello-plugin</artifactId> <version>1.0-SNAPSHOT</version> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies></project> 執行命令,運行結果如下則說明外掛程式開發成功!E:/myproj/mvnproj>mvn package hello:hello hello:sayhi -e -o+ Error stacktraces are turned on.[INFO]NOTE: Maven is executing in offline mode. Any artifacts not already in your localrepository will be inaccessible.[INFO] Scanning for projects...[INFO] Searching repository for plugin with prefix: 'hello'.[INFO] ----------------------------------------------------------------------------[INFO] Building mvnproj[INFO] task-segment: [package][INFO] ----------------------------------------------------------------------------[INFO] [resources:resources][INFO] Using default encoding to copy filtered resources.[INFO] [compiler:compile][INFO] Nothing to compile - all classes are up to date[INFO] [resources:testResources][INFO] Using default encoding to copy filtered resources.[INFO] [compiler:testCompile][INFO] Nothing to compile - all classes are up to date[INFO] [surefire:test][INFO] Surefire report directory: E:/myproj/mvnproj/target/surefire-reports------------------------------------------------------- T E S T S-------------------------------------------------------Running org.danlley.com.AppTestTests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.047 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO] [jar:jar][INFO] Building jar: E:/myproj/mvnproj/target/mvnproj-1.0-SNAPSHOT.jar[INFO] ----------------------------------------------------------------------------[INFO] Building mvnproj[INFO] task-segment: [hello:hello] (aggregator-style)[INFO] ----------------------------------------------------------------------------[INFO] [hello:hello]hello: [echo] ANT SCRIPT ECHOS:Hello, World[INFO] ----------------------------------------------------------------------------[INFO] Building mvnproj[INFO] task-segment: [hello:sayhi][INFO] ----------------------------------------------------------------------------[INFO] [hello:sayhi][INFO] -------------------------------------------[INFO] | Hello, world. |[INFO] -------------------------------------------[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] ------------------------------------------------------------------------[INFO] Total time: 4 seconds[INFO] Finished at: Thu Jun 28 12:58:51 CST 2007[INFO] Final Memory: 5M/10M[INFO] ------------------------------------------------------------------------
轉自:http://blog.chinaunix.net/u/22374/showart.php?id=330484