節(jié)選自O(shè)'Reilly出版的<<開(kāi)發(fā)人員的筆記本:Maven>>
作者:帝默西 M.奧波萊恩,文森特.馬索爾。
翻譯:phynalica
如有問(wèn)題,或發(fā)現(xiàn)錯(cuò)誤及不妥之處,請(qǐng)聯(lián)系筆者:saluteDragon@Gmail.com
使用Eclipse的Maven插件
Eclipse有一個(gè)很不錯(cuò)的Maven插件。這個(gè)插件支持很多有趣的特性,如編輯project.xml文件的功能、支持對(duì)Maven進(jìn)行定制以及一個(gè)Maven庫(kù)瀏覽器(Repository Browser)等。
步驟
Mevenide(http://mevenide.codehaus.org/mevenide-ui-eclipse/update/index.html)是一個(gè)Eclipse插件,有了它,你就可以在Eclipse中使用Maven了。你可以按照以下的說(shuō)明到Eclipse的更新網(wǎng)站上去下載這個(gè)插件。
1. 啟動(dòng)Eclipse。
2. 從菜單欄上選擇幫助(Help)?軟件更新(Software Updates)?找到并安裝(Find and Install)。
3. 在“安裝/更新(Install/Update)”對(duì)話框上,選擇“Search for new feature to install”,然后單擊“下一步”。
4. 在“安裝(Intall)”對(duì)話框上,單擊“新建遠(yuǎn)程站點(diǎn)(New Remote Site)”。
5. 在“新的更新站點(diǎn)”對(duì)話框上,在“名稱”字段中輸入Mevenide,在“URL”字段中,輸入Eclipse更新站點(diǎn)的位置。Mevenide的Eclipse更新站點(diǎn)是:http://mevenide.codehaus.org/release/eclipse/update/site.xml。
6. 當(dāng)Mevenide這個(gè)單詞出現(xiàn)在“安裝”對(duì)話框中時(shí),選中兩個(gè)子項(xiàng):Maven和Mevenide,然后單擊“下一步”。
7. Maven和Mevenide下載完畢并安裝后,重新啟動(dòng)Eclipse。
你首先會(huì)注意到,Mevenide把一個(gè)綠色圖標(biāo)作為每個(gè)project.xml文件的標(biāo)記。你可以在項(xiàng)目對(duì)象模型編輯器中打開(kāi)project.xml文件,方法是:用鼠標(biāo)選中任意project.xml文件,單擊右鍵,選擇“打開(kāi)方式(Open With…)”?“項(xiàng)目對(duì)象模型編輯器(Project Object Model Editor”。這個(gè)編輯器將顯示如圖1-3中所示的面板。
圖1-3 Mevenide的項(xiàng)目對(duì)象模型編輯器。
Mevenide提供了一系列標(biāo)簽,這些標(biāo)簽可以讓你在Eclipse中編輯一個(gè)project.xml文件的不同部分。只要你對(duì)project.xml文件的語(yǔ)法有足夠的了解,你應(yīng)該能看出來(lái),Mevenide的項(xiàng)目對(duì)象模型編輯器提供了一個(gè)GUI界面來(lái)維護(hù)這個(gè)XML文件。如果你仍然想直接編輯這個(gè)XML文件,你可以選擇最右邊的“Source”標(biāo)簽。
除了POM編輯器,Mevenide還提供了在Eclipse中執(zhí)行Maven命令的方法,這種方法使用Eclipse外部工具。要達(dá)到這個(gè)目的,請(qǐng)選擇“運(yùn)行(Run)”?“外部工具(External Tools)”?“外部工具(External Tools)”。然后,你可以創(chuàng)建一個(gè)Maven配置,并從可用命令列表中選擇想要執(zhí)行的命令。如果在Eclipse中執(zhí)行了一個(gè)Maven命令,它的輸出將會(huì)出現(xiàn)在“控制臺(tái)”視圖中。
Mevenide的另一個(gè)有趣的功能是Maven庫(kù)瀏覽器(Repository Browser)。有了這個(gè)工具,查看多個(gè)不同的遠(yuǎn)程庫(kù)中的內(nèi)容。要打開(kāi)Maven庫(kù)瀏覽器,請(qǐng)選擇“窗口”?“顯示…”?“其它…”,然后在彈出的對(duì)話框中,從文件夾“Maven”中選擇“Maven庫(kù)瀏覽器”。Maven庫(kù)瀏覽器其實(shí)就是樹(shù)形視圖,列出了Maven庫(kù)中的每個(gè)依賴項(xiàng),如圖Figure1-4,這幅圖顯示了HTTPClient組和abbot組的依賴項(xiàng)。

圖1-4 Mevenide的Maven庫(kù)瀏覽器
Mevenide還提供了搜索Maven庫(kù)的功能,這個(gè)功能可以在Maven庫(kù)中搜索特定的artifact。這個(gè)功能遲早會(huì)有用,因?yàn)樵趆ttp://www.ibiblio.org/maven中搜索特定的依賴項(xiàng)是很費(fèi)時(shí)間的。還是使用Mevenide把,這樣會(huì)節(jié)省很多時(shí)間。
關(guān)于NetBeans和JBuilder
當(dāng)前版本的Mevenide提供對(duì)這兩種IDE的支持。更多細(xì)節(jié),請(qǐng)?jiān)L問(wèn)http://mevenide.codehaus.org/。
關(guān)于IntelliJ,IDEA 插件有一些命令,你可以像使用Eclipse命令一樣使用它們。更多信息請(qǐng)查看IDEA插件的在線文檔:http://maven.apache.org/reference/plugins/idea/goals.html。
生成Ant的Build文件
有時(shí)你可能想使用Apache Ant來(lái)進(jìn)行編譯。可能是因?yàn)槟愕捻?xiàng)目正在使用一個(gè)依賴于Ant的自動(dòng)過(guò)程,也可能是因?yàn)槟愕拈_(kāi)發(fā)團(tuán)隊(duì)中有一些人不適應(yīng)從Ant到Maven轉(zhuǎn)變,還有一些隊(duì)員希望繼續(xù)使用Ant。很多IDE已經(jīng)支持帶有Ant build文件的項(xiàng)目,因此,你可以使用Maven生成build.xml文件,這樣你的項(xiàng)目就可以使用Apache Ant來(lái)進(jìn)行編譯了。
步驟
運(yùn)行Ant插件。然后運(yùn)行maven ant來(lái)創(chuàng)建一個(gè)build.xml文件,這個(gè)文件包含用來(lái)收集依賴項(xiàng)、編譯和測(cè)試應(yīng)用程序的target。以下是運(yùn)行默認(rèn)的jar target的輸出:
C:\dev\mavenbook\code\genapp\test-application>ant
Buildfile: build.xml
init:
[mkdir] Created dir: C:\dev\mavenbook\code\genapp\target\lib
get-deps:
[get] Getting: http://www.ibiblio.org/maven/springframework/jars/
spring-core-1.1.4.jar
[get] Getting: http://www.ibiblio.org/maven/springframework/jars/
spring-web-1.1.4.jar
compile:
[copy] Copying 1 file to C:\dev\mavenbook\code\genapp\target\classes
junit-present:
[echo] = = = = = = ============ WARNING = = = == = = = = = = = = = = = = =
[echo] Junit isn't present in your ${ANT_HOME}/lib directory. Tests not
executed.
[echo] = = ==============================================
compile-tests:
internal-test:
test:
jar:
[jar] Building jar: C:\dev\mavenbook\code\genapp\test-application\
target\test-application-1.0.jar
BUILD SUCCESSFUL
Total time: 2 seconds
你應(yīng)該已經(jīng)注意到了一個(gè)問(wèn)題,它是一個(gè)例證的的問(wèn)題。Apache Ant不會(huì)自動(dòng)管理可選任務(wù)的依賴項(xiàng)。如果你想運(yùn)行JUnit測(cè)試,必須得把junit-3.8.1.jar文件從本地Maven庫(kù)中復(fù)制到${ANT_HOME}\lib目錄。這個(gè)build文件包含一個(gè)get-deps tartget,這個(gè)target執(zhí)行Ant的get(獲取)任務(wù),從http://www.ibiblio.org/maven獲取了項(xiàng)目的所有依賴項(xiàng)。
總結(jié)
...想要遠(yuǎn)離Ant?Maven不能替代Ant?
Yes 和 no。Ant還“不錯(cuò)”,多數(shù)工具仍然在使用它。Maven沒(méi)有理由不提供對(duì)Apache Ant的互操作性,在第二章中,你會(huì)對(duì)Jelly有更多的了解,你會(huì)發(fā)現(xiàn),Maven大量是用了Ant任務(wù)。很多項(xiàng)目使用了持續(xù)集成系統(tǒng),這個(gè)系統(tǒng)需要一個(gè)Ant的build文件。運(yùn)行maven ant使Maven繼續(xù)支持這些工具。
雖然變化很快,像Ant Hill和Gump等許多工具已經(jīng)開(kāi)始同時(shí)支持Ant和Maven。如果你仍然在使用需要Ant build文件的工具,請(qǐng)運(yùn)行maven ant。
Ant 項(xiàng)目轉(zhuǎn)化為Maven項(xiàng)目
相當(dāng)數(shù)量的項(xiàng)目都把Ant作為編譯系統(tǒng)來(lái)使用。你可能想要轉(zhuǎn)變到Maven。
步驟
讓我們從頭開(kāi)始。首先創(chuàng)建一個(gè)默認(rèn)的Maven模板,然后把代碼移動(dòng)到合適的目錄。別想讓Maven接受原來(lái)的目錄和編譯路徑。Maven不只是一個(gè)編譯工具,它也是一種構(gòu)思項(xiàng)目布局和項(xiàng)目管理的標(biāo)準(zhǔn)方法。如果你的項(xiàng)目包含了一個(gè)很復(fù)雜的build.xml文件,產(chǎn)生了很多不同的deliverables,那你就需要使你的項(xiàng)目“組件化”,并采用將在第三章中學(xué)習(xí)的多項(xiàng)目模型。你應(yīng)該把項(xiàng)目的目錄結(jié)構(gòu)改變成本書(shū)中所提供的標(biāo)準(zhǔn)Maven項(xiàng)目的目錄結(jié)構(gòu)。
如果你想再轉(zhuǎn)變Ant,但是沒(méi)有時(shí)間停止項(xiàng)目,你可以一直使用Maven來(lái)調(diào)用現(xiàn)有的Ant target。如果你真的轉(zhuǎn)為使用Ant,你將會(huì)失去使用Maven帶來(lái)的很多好處。獲取更多信息,請(qǐng)查看詳盡的在線文檔“從Ant轉(zhuǎn)變到Maven”(http://maven.apache.org/using/migrating.html)。
關(guān)于靈活性和選擇
靈活性和選擇是原來(lái)的問(wèn)題中的一部分。我們可以承諾,Maven將會(huì)改變處理項(xiàng)目編譯和項(xiàng)目維護(hù)的方式,但是你應(yīng)該按照Maven想要被使用的方式來(lái)使用它。Maven和Ant有什么不同之處呢?Ant以可重用任務(wù)的形式,提供了像copy、move、delete和junit等這樣的編譯塊,Maven提供可重用的編譯過(guò)程。Maven是一個(gè)“編譯容器”,這個(gè)容器允許你在一系列項(xiàng)目中重用編譯過(guò)程。下面就拿單元測(cè)試來(lái)舉例說(shuō)明。在Ant中,你要進(jìn)行JUnit測(cè)試,就必須把如下內(nèi)容包含在項(xiàng)目的build.xml文件中:
這個(gè)片斷忽略了不同路徑和變量的定義,如build.tests和java.class.path,還忽略了Ant target的定義。除了某些單元測(cè)試target,你還需要定義一個(gè)target來(lái)編譯源代碼和單元測(cè)試,定義一個(gè)target來(lái)創(chuàng)建目標(biāo)目錄。每個(gè)項(xiàng)目都需要定義相同的邏輯來(lái)進(jìn)行單元測(cè)試。多數(shù)Ant項(xiàng)目使用相似的目錄結(jié)構(gòu),并通過(guò)把target定義復(fù)制到build.xml文件中來(lái)重用編譯邏輯。隨著時(shí)間的流逝,項(xiàng)目變得更復(fù)雜,可定制性更強(qiáng),因而目錄標(biāo)準(zhǔn)也要進(jìn)化,每一個(gè)項(xiàng)目都可能不同的方法來(lái)進(jìn)行編譯、測(cè)試和打包;隨著時(shí)間的流逝,build.xml文件本身也變成了一個(gè)項(xiàng)目。經(jīng)過(guò)定制的Ant build文件越大, 編譯過(guò)程中的平均信息量也會(huì)更大。.與其說(shuō)Ant是一個(gè)編譯工具,倒不如說(shuō)它是提供了build-specific API的一種語(yǔ)言。Ant1.6已經(jīng)有了Ant庫(kù)和宏,但是Ant要實(shí)現(xiàn)像Maven中那樣的全局重用性,還有很長(zhǎng)的路要走。
在Maven中,Test插件定義了所有項(xiàng)目共有的邏輯,這些項(xiàng)目需要編譯和執(zhí)行單元測(cè)試。
Test插件已經(jīng)獲得了編譯和執(zhí)行單元測(cè)試的最佳方法,并使這些方法可以在所有項(xiàng)目中可用。當(dāng)你運(yùn)行maven test命令時(shí),Maven把信息從POM傳遞到Test插件,Test插件依賴于一個(gè)Java插件的Maven命令來(lái)進(jìn)行編譯。你沒(méi)有在Maven中顯式地告訴編譯容器如何去執(zhí)行一個(gè)JUnit測(cè)試。如果你有這么做,你就會(huì)遇到與Ant中相同的問(wèn)題。正如你不會(huì)告訴一個(gè)Servlet容器如何取出打開(kāi)WAR文件,并取出其中的文件,你也不會(huì)告訴Maven如何編譯項(xiàng)目。Maven是一個(gè)編譯容器,它提供了一個(gè)抽象層,這個(gè)抽象層把編譯邏輯與項(xiàng)目分離。許多人一開(kāi)始被Maven吸引是因?yàn)樗峁┝斯芾硪蕾図?xiàng)的功能,但Maven最大的好處是,它提供了一種橫跨多個(gè)項(xiàng)目的標(biāo)準(zhǔn)的“開(kāi)發(fā)基礎(chǔ)設(shè)施”。 依賴項(xiàng)管理只是這個(gè)“開(kāi)發(fā)基礎(chǔ)設(shè)施”的一個(gè)副產(chǎn)品。
提示
Maven提供了一個(gè)開(kāi)發(fā)基礎(chǔ)設(shè)施和統(tǒng)一的項(xiàng)目布局,在本節(jié)結(jié)束的時(shí)候,你應(yīng)該嘗
試著讓Maven來(lái)管理編譯過(guò)程的多數(shù)細(xì)節(jié)。你應(yīng)該使用Maven插件,并集中精力
編寫(xiě)程序,而不是花費(fèi)寶貴的時(shí)間來(lái)編寫(xiě)編譯腳本。
接下來(lái)的章節(jié)將教你如何對(duì)Maven做一些小的修改以及如何定制Maven。但前提是,你沒(méi)有把Maven當(dāng)作另一個(gè)Ant。建立一個(gè)很大的工程,這個(gè)工程有一個(gè)很大的,用Jelly script編寫(xiě)的maven.xml,它相當(dāng)于Ant的build.xml,這樣的情況是很有可能的;如果你真的這么做了,你就錯(cuò)過(guò)了使用Maven所帶來(lái)的好處。如果你發(fā)現(xiàn)在使用Maven編譯項(xiàng)目時(shí),包含了大量與編譯相關(guān)的邏輯,那你就需要重新考慮一下Maven的用法了。高度定制的Maven編譯并不一定好用;當(dāng)需要的時(shí)候,請(qǐng)盡量使用現(xiàn)有的插件。例如,如果你的項(xiàng)目需要編譯Java源代碼并創(chuàng)建一個(gè)JAR文件,請(qǐng)使用Java插件和JAR插件。如果你忽略了插件的使用,而去使用Maven的Ant集成,建議你干脆不要使用Maven。不要錯(cuò)誤地使用Maven,要按照Maven的方式來(lái)使用它。
文森特說(shuō):“尼奧,吃了那個(gè)紅藥片…。”,提姆說(shuō):“抵抗是沒(méi)有用的。”
生成項(xiàng)目文檔
如果你正在開(kāi)發(fā)一個(gè)Java應(yīng)用程序或視一個(gè)類庫(kù),你可能需要生成JavaDoc。
步驟
只要執(zhí)行了javadoc命令,Maven就會(huì)生成項(xiàng)目文檔。以下是執(zhí)行javadoc命令的輸出結(jié)果:
C:\dev\mavenbook\code\genapp\test-application>maven javadoc
__ __
| \/ |__ _Apache__ ___
| |\/| / _` \ V / -_) ' \ ~ intelligent projects ~
|_| |_\__,_|\_/\___|_||_| v. 1.0.2
build:start:
xdoc:init:
maven-javadoc-plugin:report:
[mkdir] Created dir: C:\dev\mavenbook\code\genapp\test-application\
target\javadoc\src
[javadoc] Generating Javadoc
[javadoc] Javadoc execution
[javadoc] Loading source files for package mdn.testapp...
[javadoc] Constructing Javadoc information...
[javadoc] Standard Doclet version 1.5.0_01
[javadoc] Building tree for all the packages and classes...
[javadoc] Generating C:\dev\mavenbook\code\genapp\test-application\
target\docs\apidocs\constant-values.html...
[javadoc] Copying file C:\Documents and Settings\tobrien\.maven\cache\
maven-javadoc-plugin-1.7\plugin-resources\stylesheet.css to file C:\dev\
mavenbook\code\genapp\test-application\target\docs\apidocs\stylesheet.css...
[javadoc] Building index for all the packages and classes...
[javadoc] Building index for all classes...
[delete] Deleting directory C:\dev\mavenbook\code\genapp\test-
application\target\javadoc\src
BUILD SUCCESSFUL
Total time: 7 seconds
一旦這個(gè)Maven命令被執(zhí)行,JavaDoc將被放置在tes-application/target/javadoc/src目錄下。
總結(jié)
Maven又完成了“繁重”的任務(wù)。你需要JavaDoc,然后告訴Maven生成JavaDoc,僅此而已。需要強(qiáng)調(diào)的是,你并沒(méi)有向Maven傳遞任何關(guān)于項(xiàng)目的信息,它知道怎么辦。Maven的大部分功能就像這樣簡(jiǎn)單直接。你只需告訴Maven關(guān)于項(xiàng)目的信息,你要做的事就所剩無(wú)幾了;Maven自會(huì)處理細(xì)節(jié)。
讓Maven了解你的團(tuán)隊(duì)
Maven 是一款很好用的進(jìn)行合作開(kāi)發(fā)的工具。你可以使用它來(lái)生成開(kāi)發(fā)人員活動(dòng)報(bào)告以及項(xiàng)目投稿人列表和郵件列表。
步驟
很多項(xiàng)目都有郵件列表,人們用它來(lái)討論架構(gòu)于實(shí)現(xiàn)。像Tomcat、Maven和Ant這樣的項(xiàng)目都是由一個(gè)社區(qū)的開(kāi)發(fā)者共同開(kāi)發(fā)的,他們共同訂閱同一個(gè)郵件列表。并不只是開(kāi)源項(xiàng)目有郵件列表,很多組織已經(jīng)開(kāi)始使用在開(kāi)源的、公開(kāi)的項(xiàng)目中所使用的合作模型。因?yàn)猷]件列表是合作中極為重要的一部分,所以Maven提供了一種在project.xml文件中指定項(xiàng)目郵件列表的方法。以下是project.xml文件的一部分,它向project.xml文件中添加了mailingLists元素:
Maven項(xiàng)目中有兩種類型的隊(duì)員:投稿者與開(kāi)發(fā)者。然而,在你的項(xiàng)目中,這個(gè)定義可能要改變了。投稿者通常是指開(kāi)源社區(qū)中提供補(bǔ)丁和文檔的成員,開(kāi)發(fā)者是項(xiàng)目的核心成員。在ASF中,投稿者與執(zhí)行者(committers)都可以給項(xiàng)目投稿,但投稿者沒(méi)有對(duì)源代碼庫(kù)的寫(xiě)入權(quán)限,也沒(méi)有對(duì)項(xiàng)目中重大決定的表決權(quán)。以下是project.xml文件的一部分,它向project.xml文件添加一個(gè)contributor元素和一個(gè)developer元素:
總結(jié)
你得告訴Maven誰(shuí)在為項(xiàng)目工作,一旦我們生成了項(xiàng)目網(wǎng)站,這么做就會(huì)有用了。生成網(wǎng)站的插件和從源代碼控制系統(tǒng)生成報(bào)表的很多插件都將使用這個(gè)POM中所列出了開(kāi)發(fā)者和投稿者的信息。
把Maven指向源代碼控制系統(tǒng)
你使用源代碼控制系統(tǒng)嗎?把源代碼控制系統(tǒng)的相關(guān)信息告訴Maven,你就可以生成一些有趣的報(bào)表,這將在本書(shū)后面的部分學(xué)習(xí)。把項(xiàng)目與一個(gè)源代碼庫(kù)聯(lián)系在一起,你就可以使用Maven的源代碼控制管理(SCM)插件了,這個(gè)插件提供可以用來(lái)從從版本控制系統(tǒng)(如CVS或Subversion)更新和釋放源代碼的Maven命令(goals)。
步驟
首先你得在project.xml文件中添加一個(gè)repository元素。以下repository元素來(lái)自Apache Struts項(xiàng)目,它指向了位于http://svn.apache.org/repos/asf/struts/core/trunk的Subversion 中的源代碼庫(kù):
connection元素告訴Maven SCM的位置,這個(gè)位置是只讀的。SCM把這個(gè)URL標(biāo)識(shí)為一個(gè)SCM位置,svn告訴Maven位于這個(gè)URL的是一個(gè)Subversion庫(kù),URL的最后一部分表示項(xiàng)目主體的位置。你還可以指定developerConnection元素;當(dāng)你想要把相關(guān)人員分成有源代碼寫(xiě)入權(quán)限的和無(wú)源代碼寫(xiě)入權(quán)限的,你就會(huì)用到developerConnection
url元素提供的URL,可以用來(lái)瀏覽源代碼庫(kù)。在Struts中,Struts自己已經(jīng)指向一個(gè)Subversion庫(kù),因?yàn)橛贸R?guī)瀏覽器就可以瀏覽。Struts團(tuán)隊(duì)也可以選擇指向ViewCVS的實(shí)例,它被配置為指向ASF Subversion庫(kù),這個(gè)庫(kù)位于以下URL:
http://cvs.apache.org/viewcvs.cgi/struts/core/trunk?root=Apache-SVN。
當(dāng)你把一個(gè)project.xml文件指向一個(gè)特定的源代碼控制系統(tǒng)時(shí),你還可以指定某一特定項(xiàng)目的不同版本和不同分支。以下XML片段顯示了Apache Struts的project.xml中versions元素和branches元素的精簡(jiǎn)版本:
版本(Versions)會(huì)被一些插件使用,例如,Announcements插件,它為每個(gè)版本創(chuàng)建釋放記錄。
關(guān)于CVS
許多公司和開(kāi)源項(xiàng)目已經(jīng)轉(zhuǎn)為使用Subversion,一些像JBoss這樣的主要的開(kāi)源項(xiàng)目也已經(jīng)轉(zhuǎn)為使用Subversion。如果你的項(xiàng)目正在使用CVS,你得添加一個(gè)repository元素,這個(gè)元素類似于Jakarta Cactus項(xiàng)目中的repository元素,以下是Jakarta Cactus項(xiàng)目中的repository元素:
如果你要使用CVS的pserver來(lái)暴露你的庫(kù),以上的repository元素會(huì)很合適。如果你要通過(guò)SSH來(lái)訪問(wèn)CVS,你得設(shè)定環(huán)境變量CVS_RSH的值為ssh,語(yǔ)法如下:
生成Maven項(xiàng)目網(wǎng)站
Maven可以用項(xiàng)目的規(guī)律和項(xiàng)目的相關(guān)信息,創(chuàng)建一個(gè)項(xiàng)目網(wǎng)頁(yè)。
步驟
要想創(chuàng)建一個(gè)Maven項(xiàng)目網(wǎng)站,請(qǐng)使用以下Maven命令來(lái)運(yùn)行Site插件:
C:\dev\mavenbook\code\genapp\test-application> maven site
運(yùn)行Site插件,將會(huì)在默認(rèn)網(wǎng)站輸出目錄下創(chuàng)建項(xiàng)目網(wǎng)站:test-application/target/docs/index.html。如果你加載這個(gè)HTML頁(yè),你就會(huì)看到一個(gè)帶有獨(dú)特的Maven外觀的網(wǎng)站。圖1-5顯示了一個(gè)略微經(jīng)過(guò)定制的Maven網(wǎng)站,上面有定制的組織徽標(biāo)和項(xiàng)目徽標(biāo)。這不是一個(gè)認(rèn)為編寫(xiě)的網(wǎng)站,你所看到是一個(gè)名為Jaxen的項(xiàng)目的網(wǎng)站,這個(gè)項(xiàng)目把Maven當(dāng)作編譯系統(tǒng)來(lái)使用。
圖1-5 Maven項(xiàng)目網(wǎng)站示例
大多數(shù)Maven項(xiàng)目網(wǎng)站都有一個(gè)項(xiàng)目文檔導(dǎo)航欄,點(diǎn)擊其中的鏈接,可以查看所有Maven項(xiàng)目所共享的信息。Project Info(項(xiàng)目信息)鏈接包含項(xiàng)目的相關(guān)信息、有件列表、關(guān)于源代碼控制系統(tǒng)的信息以及發(fā)行追蹤(所有這些都在第四章中學(xué)習(xí))。生成的Maven網(wǎng)站的內(nèi)容通過(guò)創(chuàng)建和修改xdocs目錄下的XML標(biāo)記來(lái)產(chǎn)生。在圖1-5中,這個(gè)項(xiàng)目包含五個(gè)項(xiàng)目指定的文檔:概覽(Overview)、FAQ、發(fā)布(Releases)、CVS訪問(wèn)(CVS Access)和狀態(tài)(Status)。這些文檔包含在左邊的導(dǎo)航欄中,因?yàn)樗鼈儼趚docs/navigation.xml文件中。xdocs目錄是Maven用來(lái)存放項(xiàng)目指定文檔的目錄,這些文檔都是XML XDoc格式。下面是Jaxen中navigation.xml文檔的內(nèi)容:
一旦生成了項(xiàng)目網(wǎng)站,你就可以在瀏覽器中加載target/docs/index.html來(lái)打開(kāi)你的項(xiàng)目網(wǎng)站。
關(guān)于這些文件的語(yǔ)法
你可以在Maven XDoc插件FAQ站點(diǎn)找到更多關(guān)于navigation.xml文件的語(yǔ)法和格式的信息,站點(diǎn)的 URL: http://maven.apache.org/reference/plugins/xdoc/faq.html。你還可以在Maven XDoc插件主頁(yè)找到更多關(guān)于個(gè)人主頁(yè)格式的信息,URL如下:
http://maven.apache.org/reference/plugins/xdoc/index.html。這個(gè)插件的主頁(yè)還包含更多關(guān)于如何定制Site插件的輸出和行為的指導(dǎo)。
本書(shū)的第四章將更加深入地分析能夠使項(xiàng)目的行為和結(jié)構(gòu)煥發(fā)光彩的多種報(bào)表。
定制網(wǎng)站報(bào)表
網(wǎng)站的生成創(chuàng)建了許多有用的報(bào)表。但是,根據(jù)不同的風(fēng)格,你可能需要某些報(bào)表處于非激活狀態(tài)。
步驟
要改變Maven在生成網(wǎng)站時(shí)創(chuàng)建的報(bào)表,就得修改project.xml文件中reports元素的內(nèi)容。以下是一個(gè)reports元素,其中有幾個(gè)report項(xiàng)是激活的:
要把一個(gè)報(bào)表在Maven生成網(wǎng)站時(shí)排除在外,只要從reports元素中移除這個(gè)報(bào)表plug-in元素。沒(méi)有制定reports元素的項(xiàng)目會(huì)生成一組默認(rèn)報(bào)表:jdepend、Checkstyle、changes、changelog、developer-activity、file-activity、license、javadoc、jxr、junit、linkcheck以及tasklist。當(dāng)你在項(xiàng)目的project.xml文件中添加一個(gè)reports元素時(shí),你必須列出所有你想要生成的報(bào)表。
回顧
reports元素列出了所有的報(bào)表,但你可能想知道這些報(bào)表到底有什么功能。表1-1列出了對(duì)這些報(bào)表的簡(jiǎn)要描述。
表1-1 報(bào)表插件
報(bào)表插件 描述
maven-changelog-plugin Changelog是一個(gè)使用repository元素
創(chuàng)建報(bào)表的插件,所創(chuàng)建的報(bào)表記錄源代碼
控制系統(tǒng)中最近的變化。
maven-changes-plugin 格式化xdocs目錄中的changes.xml
maven-checkstyle-plugin 關(guān)于Java代碼風(fēng)格的報(bào)表
maven-clover-plugin 使用一款商業(yè)的覆蓋率測(cè)試工具為項(xiàng)目的單元
測(cè)試覆蓋率生成HTML頁(yè)。
maven-cruisecontrol-plugin 這個(gè)插件將在第四章中討論。
maven-developer-activity-plugin 創(chuàng)建一個(gè)報(bào)表,它記錄最近源代碼控制系統(tǒng)中開(kāi)發(fā)者的活動(dòng)情況。
maven-faq-plugin 格式化xdocs目錄下,項(xiàng)目的FAQ文檔。
maven-file-activity-plugin 創(chuàng)建一個(gè)報(bào)表來(lái)記錄源代碼控制系統(tǒng)中文件的活動(dòng)情況。
maven-filebugs-plugin 找出Java代碼中常見(jiàn)的有漏洞的模式。
maven-license-plugin 包括一個(gè)鏈接,它鏈接到項(xiàng)目報(bào)表中的項(xiàng)目許可
maven-linkcheck-plugin
maven-javadoc-plugin 向生成的Maven網(wǎng)站中添加JavaDoc
maven-jcoverage-plugin 生成有關(guān)單元測(cè)試覆蓋率的報(bào)表和圖象。
maven-jdepend-plugin 創(chuàng)建一個(gè)報(bào)表,它列出了包之間的依賴項(xiàng)
maven-jira-plugin 從一款名為Jira的商業(yè)發(fā)布追蹤系統(tǒng)讀取公開(kāi)的發(fā)布,并創(chuàng)建報(bào)表。
maven-junit-report-plugin 創(chuàng)建一個(gè)聚集JUnit結(jié)果的報(bào)表。
maven-jxr-plugin 以注釋的形式生成JAVA源代碼的 相互參照項(xiàng)
maven-pmd-plugin 為潛在的編碼錯(cuò)誤生成報(bào)表,如未使用的本地變量和復(fù)雜的表達(dá)式等。
maven-simian-plugin 找出源代碼樹(shù)中重復(fù)的代碼。
maven-statecvs-plugin 生成CVS活動(dòng)的統(tǒng)計(jì)和圖象。
maven-tasklist-plugin 在源代碼中搜索@todo標(biāo)簽。
獲取插件和報(bào)表更詳盡的列表,請(qǐng)?jiān)L問(wèn):
.Maven插件:http://maven.apache.org/reference/plugins/index.html
.Maven的插件沙盒:http://maven.apache.org/plugins-sandbox/index.html
.SourceForge上的Maven插件:http://maven-plugins.sourceforge.net/
.第三方Maven插件:http://maven.apache.org/reference/3rdparty.html
作者:帝默西 M.奧波萊恩,文森特.馬索爾。
翻譯:phynalica
如有問(wèn)題,或發(fā)現(xiàn)錯(cuò)誤及不妥之處,請(qǐng)聯(lián)系筆者:saluteDragon@Gmail.com
使用Eclipse的Maven插件
Eclipse有一個(gè)很不錯(cuò)的Maven插件。這個(gè)插件支持很多有趣的特性,如編輯project.xml文件的功能、支持對(duì)Maven進(jìn)行定制以及一個(gè)Maven庫(kù)瀏覽器(Repository Browser)等。
步驟
Mevenide(http://mevenide.codehaus.org/mevenide-ui-eclipse/update/index.html)是一個(gè)Eclipse插件,有了它,你就可以在Eclipse中使用Maven了。你可以按照以下的說(shuō)明到Eclipse的更新網(wǎng)站上去下載這個(gè)插件。
1. 啟動(dòng)Eclipse。
2. 從菜單欄上選擇幫助(Help)?軟件更新(Software Updates)?找到并安裝(Find and Install)。
3. 在“安裝/更新(Install/Update)”對(duì)話框上,選擇“Search for new feature to install”,然后單擊“下一步”。
4. 在“安裝(Intall)”對(duì)話框上,單擊“新建遠(yuǎn)程站點(diǎn)(New Remote Site)”。
5. 在“新的更新站點(diǎn)”對(duì)話框上,在“名稱”字段中輸入Mevenide,在“URL”字段中,輸入Eclipse更新站點(diǎn)的位置。Mevenide的Eclipse更新站點(diǎn)是:http://mevenide.codehaus.org/release/eclipse/update/site.xml。
6. 當(dāng)Mevenide這個(gè)單詞出現(xiàn)在“安裝”對(duì)話框中時(shí),選中兩個(gè)子項(xiàng):Maven和Mevenide,然后單擊“下一步”。
7. Maven和Mevenide下載完畢并安裝后,重新啟動(dòng)Eclipse。
你首先會(huì)注意到,Mevenide把一個(gè)綠色圖標(biāo)作為每個(gè)project.xml文件的標(biāo)記。你可以在項(xiàng)目對(duì)象模型編輯器中打開(kāi)project.xml文件,方法是:用鼠標(biāo)選中任意project.xml文件,單擊右鍵,選擇“打開(kāi)方式(Open With…)”?“項(xiàng)目對(duì)象模型編輯器(Project Object Model Editor”。這個(gè)編輯器將顯示如圖1-3中所示的面板。

圖1-3 Mevenide的項(xiàng)目對(duì)象模型編輯器。
Mevenide提供了一系列標(biāo)簽,這些標(biāo)簽可以讓你在Eclipse中編輯一個(gè)project.xml文件的不同部分。只要你對(duì)project.xml文件的語(yǔ)法有足夠的了解,你應(yīng)該能看出來(lái),Mevenide的項(xiàng)目對(duì)象模型編輯器提供了一個(gè)GUI界面來(lái)維護(hù)這個(gè)XML文件。如果你仍然想直接編輯這個(gè)XML文件,你可以選擇最右邊的“Source”標(biāo)簽。
除了POM編輯器,Mevenide還提供了在Eclipse中執(zhí)行Maven命令的方法,這種方法使用Eclipse外部工具。要達(dá)到這個(gè)目的,請(qǐng)選擇“運(yùn)行(Run)”?“外部工具(External Tools)”?“外部工具(External Tools)”。然后,你可以創(chuàng)建一個(gè)Maven配置,并從可用命令列表中選擇想要執(zhí)行的命令。如果在Eclipse中執(zhí)行了一個(gè)Maven命令,它的輸出將會(huì)出現(xiàn)在“控制臺(tái)”視圖中。
Mevenide的另一個(gè)有趣的功能是Maven庫(kù)瀏覽器(Repository Browser)。有了這個(gè)工具,查看多個(gè)不同的遠(yuǎn)程庫(kù)中的內(nèi)容。要打開(kāi)Maven庫(kù)瀏覽器,請(qǐng)選擇“窗口”?“顯示…”?“其它…”,然后在彈出的對(duì)話框中,從文件夾“Maven”中選擇“Maven庫(kù)瀏覽器”。Maven庫(kù)瀏覽器其實(shí)就是樹(shù)形視圖,列出了Maven庫(kù)中的每個(gè)依賴項(xiàng),如圖Figure1-4,這幅圖顯示了HTTPClient組和abbot組的依賴項(xiàng)。

圖1-4 Mevenide的Maven庫(kù)瀏覽器
Mevenide還提供了搜索Maven庫(kù)的功能,這個(gè)功能可以在Maven庫(kù)中搜索特定的artifact。這個(gè)功能遲早會(huì)有用,因?yàn)樵趆ttp://www.ibiblio.org/maven中搜索特定的依賴項(xiàng)是很費(fèi)時(shí)間的。還是使用Mevenide把,這樣會(huì)節(jié)省很多時(shí)間。
關(guān)于NetBeans和JBuilder
當(dāng)前版本的Mevenide提供對(duì)這兩種IDE的支持。更多細(xì)節(jié),請(qǐng)?jiān)L問(wèn)http://mevenide.codehaus.org/。
關(guān)于IntelliJ,IDEA 插件有一些命令,你可以像使用Eclipse命令一樣使用它們。更多信息請(qǐng)查看IDEA插件的在線文檔:http://maven.apache.org/reference/plugins/idea/goals.html。
生成Ant的Build文件
有時(shí)你可能想使用Apache Ant來(lái)進(jìn)行編譯。可能是因?yàn)槟愕捻?xiàng)目正在使用一個(gè)依賴于Ant的自動(dòng)過(guò)程,也可能是因?yàn)槟愕拈_(kāi)發(fā)團(tuán)隊(duì)中有一些人不適應(yīng)從Ant到Maven轉(zhuǎn)變,還有一些隊(duì)員希望繼續(xù)使用Ant。很多IDE已經(jīng)支持帶有Ant build文件的項(xiàng)目,因此,你可以使用Maven生成build.xml文件,這樣你的項(xiàng)目就可以使用Apache Ant來(lái)進(jìn)行編譯了。
步驟
運(yùn)行Ant插件。然后運(yùn)行maven ant來(lái)創(chuàng)建一個(gè)build.xml文件,這個(gè)文件包含用來(lái)收集依賴項(xiàng)、編譯和測(cè)試應(yīng)用程序的target。以下是運(yùn)行默認(rèn)的jar target的輸出:
C:\dev\mavenbook\code\genapp\test-application>ant
Buildfile: build.xml
init:
[mkdir] Created dir: C:\dev\mavenbook\code\genapp\target\lib
get-deps:
[get] Getting: http://www.ibiblio.org/maven/springframework/jars/
spring-core-1.1.4.jar
[get] Getting: http://www.ibiblio.org/maven/springframework/jars/
spring-web-1.1.4.jar
compile:
[copy] Copying 1 file to C:\dev\mavenbook\code\genapp\target\classes
junit-present:
[echo] = = = = = = ============ WARNING = = = == = = = = = = = = = = = = =
[echo] Junit isn't present in your ${ANT_HOME}/lib directory. Tests not
executed.
[echo] = = ==============================================
compile-tests:
internal-test:
test:
jar:
[jar] Building jar: C:\dev\mavenbook\code\genapp\test-application\
target\test-application-1.0.jar
BUILD SUCCESSFUL
Total time: 2 seconds
你應(yīng)該已經(jīng)注意到了一個(gè)問(wèn)題,它是一個(gè)例證的的問(wèn)題。Apache Ant不會(huì)自動(dòng)管理可選任務(wù)的依賴項(xiàng)。如果你想運(yùn)行JUnit測(cè)試,必須得把junit-3.8.1.jar文件從本地Maven庫(kù)中復(fù)制到${ANT_HOME}\lib目錄。這個(gè)build文件包含一個(gè)get-deps tartget,這個(gè)target執(zhí)行Ant的get(獲取)任務(wù),從http://www.ibiblio.org/maven獲取了項(xiàng)目的所有依賴項(xiàng)。
總結(jié)
...想要遠(yuǎn)離Ant?Maven不能替代Ant?
Yes 和 no。Ant還“不錯(cuò)”,多數(shù)工具仍然在使用它。Maven沒(méi)有理由不提供對(duì)Apache Ant的互操作性,在第二章中,你會(huì)對(duì)Jelly有更多的了解,你會(huì)發(fā)現(xiàn),Maven大量是用了Ant任務(wù)。很多項(xiàng)目使用了持續(xù)集成系統(tǒng),這個(gè)系統(tǒng)需要一個(gè)Ant的build文件。運(yùn)行maven ant使Maven繼續(xù)支持這些工具。
雖然變化很快,像Ant Hill和Gump等許多工具已經(jīng)開(kāi)始同時(shí)支持Ant和Maven。如果你仍然在使用需要Ant build文件的工具,請(qǐng)運(yùn)行maven ant。
Ant 項(xiàng)目轉(zhuǎn)化為Maven項(xiàng)目
相當(dāng)數(shù)量的項(xiàng)目都把Ant作為編譯系統(tǒng)來(lái)使用。你可能想要轉(zhuǎn)變到Maven。
步驟
讓我們從頭開(kāi)始。首先創(chuàng)建一個(gè)默認(rèn)的Maven模板,然后把代碼移動(dòng)到合適的目錄。別想讓Maven接受原來(lái)的目錄和編譯路徑。Maven不只是一個(gè)編譯工具,它也是一種構(gòu)思項(xiàng)目布局和項(xiàng)目管理的標(biāo)準(zhǔn)方法。如果你的項(xiàng)目包含了一個(gè)很復(fù)雜的build.xml文件,產(chǎn)生了很多不同的deliverables,那你就需要使你的項(xiàng)目“組件化”,并采用將在第三章中學(xué)習(xí)的多項(xiàng)目模型。你應(yīng)該把項(xiàng)目的目錄結(jié)構(gòu)改變成本書(shū)中所提供的標(biāo)準(zhǔn)Maven項(xiàng)目的目錄結(jié)構(gòu)。
如果你想再轉(zhuǎn)變Ant,但是沒(méi)有時(shí)間停止項(xiàng)目,你可以一直使用Maven來(lái)調(diào)用現(xiàn)有的Ant target。如果你真的轉(zhuǎn)為使用Ant,你將會(huì)失去使用Maven帶來(lái)的很多好處。獲取更多信息,請(qǐng)查看詳盡的在線文檔“從Ant轉(zhuǎn)變到Maven”(http://maven.apache.org/using/migrating.html)。
關(guān)于靈活性和選擇
靈活性和選擇是原來(lái)的問(wèn)題中的一部分。我們可以承諾,Maven將會(huì)改變處理項(xiàng)目編譯和項(xiàng)目維護(hù)的方式,但是你應(yīng)該按照Maven想要被使用的方式來(lái)使用它。Maven和Ant有什么不同之處呢?Ant以可重用任務(wù)的形式,提供了像copy、move、delete和junit等這樣的編譯塊,Maven提供可重用的編譯過(guò)程。Maven是一個(gè)“編譯容器”,這個(gè)容器允許你在一系列項(xiàng)目中重用編譯過(guò)程。下面就拿單元測(cè)試來(lái)舉例說(shuō)明。在Ant中,你要進(jìn)行JUnit測(cè)試,就必須把如下內(nèi)容包含在項(xiàng)目的build.xml文件中:
<junit printsummary="yes" haltonfailure="yes">
<classpath>
<pathelement location="${build.tests}"/>
<pathelement path="${java.class.path}"/>
</classpath>
<formatter type="plain"/>
<test name="my.test.TestCase" haltonfailure="no" outfile="result">
<formatter type="xml"/>
</test>
<batchtest fork="yes" todir="${reports.tests}">
<fileset dir="${src.tests}">
<include name="**/*Test*.java"/>
<exclude name="**/AllTests.java"/>
</fileset>
</batchtest>
</junit>
這個(gè)片斷忽略了不同路徑和變量的定義,如build.tests和java.class.path,還忽略了Ant target的定義。除了某些單元測(cè)試target,你還需要定義一個(gè)target來(lái)編譯源代碼和單元測(cè)試,定義一個(gè)target來(lái)創(chuàng)建目標(biāo)目錄。每個(gè)項(xiàng)目都需要定義相同的邏輯來(lái)進(jìn)行單元測(cè)試。多數(shù)Ant項(xiàng)目使用相似的目錄結(jié)構(gòu),并通過(guò)把target定義復(fù)制到build.xml文件中來(lái)重用編譯邏輯。隨著時(shí)間的流逝,項(xiàng)目變得更復(fù)雜,可定制性更強(qiáng),因而目錄標(biāo)準(zhǔn)也要進(jìn)化,每一個(gè)項(xiàng)目都可能不同的方法來(lái)進(jìn)行編譯、測(cè)試和打包;隨著時(shí)間的流逝,build.xml文件本身也變成了一個(gè)項(xiàng)目。經(jīng)過(guò)定制的Ant build文件越大, 編譯過(guò)程中的平均信息量也會(huì)更大。.與其說(shuō)Ant是一個(gè)編譯工具,倒不如說(shuō)它是提供了build-specific API的一種語(yǔ)言。Ant1.6已經(jīng)有了Ant庫(kù)和宏,但是Ant要實(shí)現(xiàn)像Maven中那樣的全局重用性,還有很長(zhǎng)的路要走。
在Maven中,Test插件定義了所有項(xiàng)目共有的邏輯,這些項(xiàng)目需要編譯和執(zhí)行單元測(cè)試。
Test插件已經(jīng)獲得了編譯和執(zhí)行單元測(cè)試的最佳方法,并使這些方法可以在所有項(xiàng)目中可用。當(dāng)你運(yùn)行maven test命令時(shí),Maven把信息從POM傳遞到Test插件,Test插件依賴于一個(gè)Java插件的Maven命令來(lái)進(jìn)行編譯。你沒(méi)有在Maven中顯式地告訴編譯容器如何去執(zhí)行一個(gè)JUnit測(cè)試。如果你有這么做,你就會(huì)遇到與Ant中相同的問(wèn)題。正如你不會(huì)告訴一個(gè)Servlet容器如何取出打開(kāi)WAR文件,并取出其中的文件,你也不會(huì)告訴Maven如何編譯項(xiàng)目。Maven是一個(gè)編譯容器,它提供了一個(gè)抽象層,這個(gè)抽象層把編譯邏輯與項(xiàng)目分離。許多人一開(kāi)始被Maven吸引是因?yàn)樗峁┝斯芾硪蕾図?xiàng)的功能,但Maven最大的好處是,它提供了一種橫跨多個(gè)項(xiàng)目的標(biāo)準(zhǔn)的“開(kāi)發(fā)基礎(chǔ)設(shè)施”。 依賴項(xiàng)管理只是這個(gè)“開(kāi)發(fā)基礎(chǔ)設(shè)施”的一個(gè)副產(chǎn)品。
提示
Maven提供了一個(gè)開(kāi)發(fā)基礎(chǔ)設(shè)施和統(tǒng)一的項(xiàng)目布局,在本節(jié)結(jié)束的時(shí)候,你應(yīng)該嘗
試著讓Maven來(lái)管理編譯過(guò)程的多數(shù)細(xì)節(jié)。你應(yīng)該使用Maven插件,并集中精力
編寫(xiě)程序,而不是花費(fèi)寶貴的時(shí)間來(lái)編寫(xiě)編譯腳本。
接下來(lái)的章節(jié)將教你如何對(duì)Maven做一些小的修改以及如何定制Maven。但前提是,你沒(méi)有把Maven當(dāng)作另一個(gè)Ant。建立一個(gè)很大的工程,這個(gè)工程有一個(gè)很大的,用Jelly script編寫(xiě)的maven.xml,它相當(dāng)于Ant的build.xml,這樣的情況是很有可能的;如果你真的這么做了,你就錯(cuò)過(guò)了使用Maven所帶來(lái)的好處。如果你發(fā)現(xiàn)在使用Maven編譯項(xiàng)目時(shí),包含了大量與編譯相關(guān)的邏輯,那你就需要重新考慮一下Maven的用法了。高度定制的Maven編譯并不一定好用;當(dāng)需要的時(shí)候,請(qǐng)盡量使用現(xiàn)有的插件。例如,如果你的項(xiàng)目需要編譯Java源代碼并創(chuàng)建一個(gè)JAR文件,請(qǐng)使用Java插件和JAR插件。如果你忽略了插件的使用,而去使用Maven的Ant集成,建議你干脆不要使用Maven。不要錯(cuò)誤地使用Maven,要按照Maven的方式來(lái)使用它。
文森特說(shuō):“尼奧,吃了那個(gè)紅藥片…。”,提姆說(shuō):“抵抗是沒(méi)有用的。”
生成項(xiàng)目文檔
如果你正在開(kāi)發(fā)一個(gè)Java應(yīng)用程序或視一個(gè)類庫(kù),你可能需要生成JavaDoc。
步驟
只要執(zhí)行了javadoc命令,Maven就會(huì)生成項(xiàng)目文檔。以下是執(zhí)行javadoc命令的輸出結(jié)果:
C:\dev\mavenbook\code\genapp\test-application>maven javadoc
__ __
| \/ |__ _Apache__ ___
| |\/| / _` \ V / -_) ' \ ~ intelligent projects ~
|_| |_\__,_|\_/\___|_||_| v. 1.0.2
build:start:
xdoc:init:
maven-javadoc-plugin:report:
[mkdir] Created dir: C:\dev\mavenbook\code\genapp\test-application\
target\javadoc\src
[javadoc] Generating Javadoc
[javadoc] Javadoc execution
[javadoc] Loading source files for package mdn.testapp...
[javadoc] Constructing Javadoc information...
[javadoc] Standard Doclet version 1.5.0_01
[javadoc] Building tree for all the packages and classes...
[javadoc] Generating C:\dev\mavenbook\code\genapp\test-application\
target\docs\apidocs\constant-values.html...
[javadoc] Copying file C:\Documents and Settings\tobrien\.maven\cache\
maven-javadoc-plugin-1.7\plugin-resources\stylesheet.css to file C:\dev\
mavenbook\code\genapp\test-application\target\docs\apidocs\stylesheet.css...
[javadoc] Building index for all the packages and classes...
[javadoc] Building index for all classes...
[delete] Deleting directory C:\dev\mavenbook\code\genapp\test-
application\target\javadoc\src
BUILD SUCCESSFUL
Total time: 7 seconds
一旦這個(gè)Maven命令被執(zhí)行,JavaDoc將被放置在tes-application/target/javadoc/src目錄下。
總結(jié)
Maven又完成了“繁重”的任務(wù)。你需要JavaDoc,然后告訴Maven生成JavaDoc,僅此而已。需要強(qiáng)調(diào)的是,你并沒(méi)有向Maven傳遞任何關(guān)于項(xiàng)目的信息,它知道怎么辦。Maven的大部分功能就像這樣簡(jiǎn)單直接。你只需告訴Maven關(guān)于項(xiàng)目的信息,你要做的事就所剩無(wú)幾了;Maven自會(huì)處理細(xì)節(jié)。
讓Maven了解你的團(tuán)隊(duì)
Maven 是一款很好用的進(jìn)行合作開(kāi)發(fā)的工具。你可以使用它來(lái)生成開(kāi)發(fā)人員活動(dòng)報(bào)告以及項(xiàng)目投稿人列表和郵件列表。
步驟
很多項(xiàng)目都有郵件列表,人們用它來(lái)討論架構(gòu)于實(shí)現(xiàn)。像Tomcat、Maven和Ant這樣的項(xiàng)目都是由一個(gè)社區(qū)的開(kāi)發(fā)者共同開(kāi)發(fā)的,他們共同訂閱同一個(gè)郵件列表。并不只是開(kāi)源項(xiàng)目有郵件列表,很多組織已經(jīng)開(kāi)始使用在開(kāi)源的、公開(kāi)的項(xiàng)目中所使用的合作模型。因?yàn)猷]件列表是合作中極為重要的一部分,所以Maven提供了一種在project.xml文件中指定項(xiàng)目郵件列表的方法。以下是project.xml文件的一部分,它向project.xml文件中添加了mailingLists元素:
<mailingLists>
<mailingList>
<name>Maven User List</name>
<subscribe>users-subscribe@maven.apache.org</subscribe>
<unsubscribe>users-unsubscribe@maven.apache.org</unsubscribe>
<archive>http://marc.theaimsgroup.com/?l=turbine-maven-user</archive>
</mailingList>
<mailingList>
<name>Maven Developer List</name>
<subscribe>dev-subscribe@maven.apache.org</subscribe>
<unsubscribe>dev-unsubscribe@maven.apache.org</unsubscribe>
<archive>http://marc.theaimsgroup.com/?l=turbine-maven-dev</archive>
</mailingList>
</mailingLists>
Maven項(xiàng)目中有兩種類型的隊(duì)員:投稿者與開(kāi)發(fā)者。然而,在你的項(xiàng)目中,這個(gè)定義可能要改變了。投稿者通常是指開(kāi)源社區(qū)中提供補(bǔ)丁和文檔的成員,開(kāi)發(fā)者是項(xiàng)目的核心成員。在ASF中,投稿者與執(zhí)行者(committers)都可以給項(xiàng)目投稿,但投稿者沒(méi)有對(duì)源代碼庫(kù)的寫(xiě)入權(quán)限,也沒(méi)有對(duì)項(xiàng)目中重大決定的表決權(quán)。以下是project.xml文件的一部分,它向project.xml文件添加一個(gè)contributor元素和一個(gè)developer元素:
<developers>
<developer>
<name>Vincent Massol</name>
<id>vmassol</id>
<email>vmassol@apache.org</email>
<organization>Apache Software Foundation</organization>
<roles>
<role>Author</role>
<role>Developer</role>
</roles>
<url>http://www.massol.net</url>
<timezone>+1</timezone>
</developer>
</developers>
<contributors>
<contributor>
<name>Tim OBrien</name>
<email>tobrien@apache.org</email>
<organization>Apache Software Foundation</organization>
<roles>
<role>Author</role>
<role>Developer</role>
</roles>
<url>http://www.oreillynet.com/pub/au/1738</url>
<timezone>-6</timezone>
</contributor>
</contributors>
總結(jié)
你得告訴Maven誰(shuí)在為項(xiàng)目工作,一旦我們生成了項(xiàng)目網(wǎng)站,這么做就會(huì)有用了。生成網(wǎng)站的插件和從源代碼控制系統(tǒng)生成報(bào)表的很多插件都將使用這個(gè)POM中所列出了開(kāi)發(fā)者和投稿者的信息。
把Maven指向源代碼控制系統(tǒng)
你使用源代碼控制系統(tǒng)嗎?把源代碼控制系統(tǒng)的相關(guān)信息告訴Maven,你就可以生成一些有趣的報(bào)表,這將在本書(shū)后面的部分學(xué)習(xí)。把項(xiàng)目與一個(gè)源代碼庫(kù)聯(lián)系在一起,你就可以使用Maven的源代碼控制管理(SCM)插件了,這個(gè)插件提供可以用來(lái)從從版本控制系統(tǒng)(如CVS或Subversion)更新和釋放源代碼的Maven命令(goals)。
步驟
首先你得在project.xml文件中添加一個(gè)repository元素。以下repository元素來(lái)自Apache Struts項(xiàng)目,它指向了位于http://svn.apache.org/repos/asf/struts/core/trunk的Subversion 中的源代碼庫(kù):
<repository>
<connection>
scm:svn:http://svn.apache.org/repos/asf/struts/core/trunk
</connection>
<developerConnection>
scm:svn:https://svn.apache.org/repos/asf/struts/core/trunk
</developerConnection>
<url>http://svn.apache.org/repos/asf/struts/core/trunk</url>
</repository>
connection元素告訴Maven SCM的位置,這個(gè)位置是只讀的。SCM把這個(gè)URL標(biāo)識(shí)為一個(gè)SCM位置,svn告訴Maven位于這個(gè)URL的是一個(gè)Subversion庫(kù),URL的最后一部分表示項(xiàng)目主體的位置。你還可以指定developerConnection元素;當(dāng)你想要把相關(guān)人員分成有源代碼寫(xiě)入權(quán)限的和無(wú)源代碼寫(xiě)入權(quán)限的,你就會(huì)用到developerConnection
url元素提供的URL,可以用來(lái)瀏覽源代碼庫(kù)。在Struts中,Struts自己已經(jīng)指向一個(gè)Subversion庫(kù),因?yàn)橛贸R?guī)瀏覽器就可以瀏覽。Struts團(tuán)隊(duì)也可以選擇指向ViewCVS的實(shí)例,它被配置為指向ASF Subversion庫(kù),這個(gè)庫(kù)位于以下URL:
http://cvs.apache.org/viewcvs.cgi/struts/core/trunk?root=Apache-SVN。
當(dāng)你把一個(gè)project.xml文件指向一個(gè)特定的源代碼控制系統(tǒng)時(shí),你還可以指定某一特定項(xiàng)目的不同版本和不同分支。以下XML片段顯示了Apache Struts的project.xml中versions元素和branches元素的精簡(jiǎn)版本:
<versions>
<version>
<id>1.2.0</id>
<name>1.2.0</name>
<tag>STRUTS_1_2_0</tag>
</version>
<version>
<id>1.2.6</id>
<name>1.2.6</name>
<tag>STRUTS_1_2_6</tag>
</version>
</versions>
<branches>
<branch>
<tag>STRUTS_1_1_BRANCH</tag>
</branch>
<branch>
<tag>STRUTS_1_2_BRANCH</tag>
</branch>
</branches>
版本(Versions)會(huì)被一些插件使用,例如,Announcements插件,它為每個(gè)版本創(chuàng)建釋放記錄。
關(guān)于CVS
許多公司和開(kāi)源項(xiàng)目已經(jīng)轉(zhuǎn)為使用Subversion,一些像JBoss這樣的主要的開(kāi)源項(xiàng)目也已經(jīng)轉(zhuǎn)為使用Subversion。如果你的項(xiàng)目正在使用CVS,你得添加一個(gè)repository元素,這個(gè)元素類似于Jakarta Cactus項(xiàng)目中的repository元素,以下是Jakarta Cactus項(xiàng)目中的repository元素:
<repository>
<connection>
scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-cactus
</connection>
<url>http://cvs.apache.org/viewcvs.cgi/jakarta-cactus/</url>
</repository>
如果你要使用CVS的pserver來(lái)暴露你的庫(kù),以上的repository元素會(huì)很合適。如果你要通過(guò)SSH來(lái)訪問(wèn)CVS,你得設(shè)定環(huán)境變量CVS_RSH的值為ssh,語(yǔ)法如下:
<repository>
<connection>
scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-cactus
</connection>
<url>http://cvs.apache.org/viewcvs.cgi/jakarta-cactus/</url>
<developerConnection>
scm:cvs:ext:tobrien@somehost:/home/cvs/repository:modulename
</developerConnection>
</repository>
生成Maven項(xiàng)目網(wǎng)站
Maven可以用項(xiàng)目的規(guī)律和項(xiàng)目的相關(guān)信息,創(chuàng)建一個(gè)項(xiàng)目網(wǎng)頁(yè)。
步驟
要想創(chuàng)建一個(gè)Maven項(xiàng)目網(wǎng)站,請(qǐng)使用以下Maven命令來(lái)運(yùn)行Site插件:
C:\dev\mavenbook\code\genapp\test-application> maven site
運(yùn)行Site插件,將會(huì)在默認(rèn)網(wǎng)站輸出目錄下創(chuàng)建項(xiàng)目網(wǎng)站:test-application/target/docs/index.html。如果你加載這個(gè)HTML頁(yè),你就會(huì)看到一個(gè)帶有獨(dú)特的Maven外觀的網(wǎng)站。圖1-5顯示了一個(gè)略微經(jīng)過(guò)定制的Maven網(wǎng)站,上面有定制的組織徽標(biāo)和項(xiàng)目徽標(biāo)。這不是一個(gè)認(rèn)為編寫(xiě)的網(wǎng)站,你所看到是一個(gè)名為Jaxen的項(xiàng)目的網(wǎng)站,這個(gè)項(xiàng)目把Maven當(dāng)作編譯系統(tǒng)來(lái)使用。

圖1-5 Maven項(xiàng)目網(wǎng)站示例
大多數(shù)Maven項(xiàng)目網(wǎng)站都有一個(gè)項(xiàng)目文檔導(dǎo)航欄,點(diǎn)擊其中的鏈接,可以查看所有Maven項(xiàng)目所共享的信息。Project Info(項(xiàng)目信息)鏈接包含項(xiàng)目的相關(guān)信息、有件列表、關(guān)于源代碼控制系統(tǒng)的信息以及發(fā)行追蹤(所有這些都在第四章中學(xué)習(xí))。生成的Maven網(wǎng)站的內(nèi)容通過(guò)創(chuàng)建和修改xdocs目錄下的XML標(biāo)記來(lái)產(chǎn)生。在圖1-5中,這個(gè)項(xiàng)目包含五個(gè)項(xiàng)目指定的文檔:概覽(Overview)、FAQ、發(fā)布(Releases)、CVS訪問(wèn)(CVS Access)和狀態(tài)(Status)。這些文檔包含在左邊的導(dǎo)航欄中,因?yàn)樗鼈儼趚docs/navigation.xml文件中。xdocs目錄是Maven用來(lái)存放項(xiàng)目指定文檔的目錄,這些文檔都是XML XDoc格式。下面是Jaxen中navigation.xml文檔的內(nèi)容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="jaxen" repository="jaxen" >
<links>
<item name="The Werken Company" />
</links>
<menu name="jaxen">
<item name="Overview" href="/index.html"/>
<item name="FAQ" href="/faq.html"/>
<item name="Releases" href="/releases.html"/>
<item name="CVS Access" href="/cvs-usage.html"/>
<item name="Status" href="/status.html"/>
</menu>
</properties>
<section name="News">
<p>
Added the slidedeck from my
<a href="/pdf/intro-slides.pdf">SD-West presentation</a>.
</p>
<p>
Check out these
<a >Performance
Benchmarks</a> comparing dom4j and Jaxen against Xerces and Xalan.
</p>
</section>
[...]
</document>
一旦生成了項(xiàng)目網(wǎng)站,你就可以在瀏覽器中加載target/docs/index.html來(lái)打開(kāi)你的項(xiàng)目網(wǎng)站。
關(guān)于這些文件的語(yǔ)法
你可以在Maven XDoc插件FAQ站點(diǎn)找到更多關(guān)于navigation.xml文件的語(yǔ)法和格式的信息,站點(diǎn)的 URL: http://maven.apache.org/reference/plugins/xdoc/faq.html。你還可以在Maven XDoc插件主頁(yè)找到更多關(guān)于個(gè)人主頁(yè)格式的信息,URL如下:
http://maven.apache.org/reference/plugins/xdoc/index.html。這個(gè)插件的主頁(yè)還包含更多關(guān)于如何定制Site插件的輸出和行為的指導(dǎo)。
本書(shū)的第四章將更加深入地分析能夠使項(xiàng)目的行為和結(jié)構(gòu)煥發(fā)光彩的多種報(bào)表。
定制網(wǎng)站報(bào)表
網(wǎng)站的生成創(chuàng)建了許多有用的報(bào)表。但是,根據(jù)不同的風(fēng)格,你可能需要某些報(bào)表處于非激活狀態(tài)。
步驟
要改變Maven在生成網(wǎng)站時(shí)創(chuàng)建的報(bào)表,就得修改project.xml文件中reports元素的內(nèi)容。以下是一個(gè)reports元素,其中有幾個(gè)report項(xiàng)是激活的:
<reports>
<report>maven-changelog-plugin</report>
<report>maven-changes-plugin</report>
<report>maven-checkstyle-plugin</report>
<report>maven-clover-plugin</report>
<report>maven-cruisecontrol-plugin</report>
<report>maven-developer-activity-plugin</report>
<report>maven-faq-plugin</report>
<report>maven-file-activity-plugin</report>
<report>maven-license-plugin</report>
<report>maven-linkcheck-plugin</report>
<report>maven-javadoc-plugin</report>
<report>maven-jdepend-plugin</report>
<report>maven-jira-plugin</report>
<report>maven-junit-report-plugin</report>
<report>maven-jxr-plugin</report>
<report>maven-pmd-plugin</report>
<report>maven-simian-plugin</report>
<report>maven-tasklist-plugin</report>
</reports>
要把一個(gè)報(bào)表在Maven生成網(wǎng)站時(shí)排除在外,只要從reports元素中移除這個(gè)報(bào)表plug-in元素。沒(méi)有制定reports元素的項(xiàng)目會(huì)生成一組默認(rèn)報(bào)表:jdepend、Checkstyle、changes、changelog、developer-activity、file-activity、license、javadoc、jxr、junit、linkcheck以及tasklist。當(dāng)你在項(xiàng)目的project.xml文件中添加一個(gè)reports元素時(shí),你必須列出所有你想要生成的報(bào)表。
回顧
reports元素列出了所有的報(bào)表,但你可能想知道這些報(bào)表到底有什么功能。表1-1列出了對(duì)這些報(bào)表的簡(jiǎn)要描述。
表1-1 報(bào)表插件
報(bào)表插件 描述
maven-changelog-plugin Changelog是一個(gè)使用repository元素
創(chuàng)建報(bào)表的插件,所創(chuàng)建的報(bào)表記錄源代碼
控制系統(tǒng)中最近的變化。
maven-changes-plugin 格式化xdocs目錄中的changes.xml
maven-checkstyle-plugin 關(guān)于Java代碼風(fēng)格的報(bào)表
maven-clover-plugin 使用一款商業(yè)的覆蓋率測(cè)試工具為項(xiàng)目的單元
測(cè)試覆蓋率生成HTML頁(yè)。
maven-cruisecontrol-plugin 這個(gè)插件將在第四章中討論。
maven-developer-activity-plugin 創(chuàng)建一個(gè)報(bào)表,它記錄最近源代碼控制系統(tǒng)中開(kāi)發(fā)者的活動(dòng)情況。
maven-faq-plugin 格式化xdocs目錄下,項(xiàng)目的FAQ文檔。
maven-file-activity-plugin 創(chuàng)建一個(gè)報(bào)表來(lái)記錄源代碼控制系統(tǒng)中文件的活動(dòng)情況。
maven-filebugs-plugin 找出Java代碼中常見(jiàn)的有漏洞的模式。
maven-license-plugin 包括一個(gè)鏈接,它鏈接到項(xiàng)目報(bào)表中的項(xiàng)目許可
maven-linkcheck-plugin
maven-javadoc-plugin 向生成的Maven網(wǎng)站中添加JavaDoc
maven-jcoverage-plugin 生成有關(guān)單元測(cè)試覆蓋率的報(bào)表和圖象。
maven-jdepend-plugin 創(chuàng)建一個(gè)報(bào)表,它列出了包之間的依賴項(xiàng)
maven-jira-plugin 從一款名為Jira的商業(yè)發(fā)布追蹤系統(tǒng)讀取公開(kāi)的發(fā)布,并創(chuàng)建報(bào)表。
maven-junit-report-plugin 創(chuàng)建一個(gè)聚集JUnit結(jié)果的報(bào)表。
maven-jxr-plugin 以注釋的形式生成JAVA源代碼的 相互參照項(xiàng)
maven-pmd-plugin 為潛在的編碼錯(cuò)誤生成報(bào)表,如未使用的本地變量和復(fù)雜的表達(dá)式等。
maven-simian-plugin 找出源代碼樹(shù)中重復(fù)的代碼。
maven-statecvs-plugin 生成CVS活動(dòng)的統(tǒng)計(jì)和圖象。
maven-tasklist-plugin 在源代碼中搜索@todo標(biāo)簽。
獲取插件和報(bào)表更詳盡的列表,請(qǐng)?jiān)L問(wèn):
.Maven插件:http://maven.apache.org/reference/plugins/index.html
.Maven的插件沙盒:http://maven.apache.org/plugins-sandbox/index.html
.SourceForge上的Maven插件:http://maven-plugins.sourceforge.net/
.第三方Maven插件:http://maven.apache.org/reference/3rdparty.html