一個(gè)Java項(xiàng)目中最困難的地方就是如何著手啟動(dòng)它。在啟動(dòng)項(xiàng)目之前,我們必須配置好所有的邏輯關(guān)系。比如,Java源代碼應(yīng)該放在何處?單元測(cè)試應(yīng)該在何處進(jìn)行?依賴的jar包應(yīng)該如何放置?如何構(gòu)建項(xiàng)目,如何形成文檔,如何測(cè)試和部署項(xiàng)目?在這種情況下,開發(fā)人員不同的處理選擇將會(huì)影響項(xiàng)目的余下部分。您的選擇可能會(huì)使你陷入困境,也可能會(huì)在將來證明您是一位Java架構(gòu)大師。我們假定后者是我們奮斗的目標(biāo),接下來就進(jìn)入我們的正題。
構(gòu)建一個(gè)Java項(xiàng)目可以使用很多工具,其中包括Ant。Ant作為一款具有革命性的工具,一直是眾多開發(fā)者使用工具中的首選,它能使開發(fā)人員擺脫使用大量make命令的苦海。對(duì)于那些不太熟悉make命令的人來說,他們有充足的理由來表明使用命令并不是構(gòu)建Java項(xiàng)目的最好工具,因?yàn)樗痪邆淦脚_(tái)獨(dú)立性并且不易使用。Ant的出現(xiàn)解決了以上的問題,它使用了一個(gè)平臺(tái)獨(dú)立的工具,該工具能夠解析XML配置文件,即build.xml。雖然Ant由于其諸多的優(yōu)點(diǎn)而備受歡迎,但它同樣有一些缺點(diǎn)。build.xml文件由于采用了極其簡短的描述方式,使得開發(fā)人員需要預(yù)先學(xué)習(xí)它的語法。雖然學(xué)習(xí)曲線不是很陡峭,但Java開發(fā)人員更應(yīng)該把時(shí)間放在開發(fā)上面。
Maven是新一代的生力軍,它的境遇正好和幾年前的Ant十分類似。Maven1.0已經(jīng)歷了幾年的時(shí)間,并且作為Ant的替代品已被廣大的開發(fā)人員所接收,但它并沒有在很大程度使開發(fā)人員從Ant的build.xml文件中解脫出來。Maven1.0速度慢并且笨拙,使用起來的困難度并不亞于使用Ant的項(xiàng)目。事實(shí)上,它的核心是基于Ant實(shí)現(xiàn)的。在經(jīng)過了幾乎徹底的重寫后,Maven2.0誕生了。
Maven2.0的優(yōu)點(diǎn)Maven2.0有許多很好功能,這些功能不僅僅是幫助您構(gòu)建項(xiàng)目。如果您剛剛開始啟動(dòng)一個(gè)Java項(xiàng)目,并且想使該項(xiàng)目快速地開展下去,Maven2.0能夠在幾分鐘內(nèi)達(dá)到您的要求。以下是Maven2.0的一些優(yōu)點(diǎn):
--標(biāo)準(zhǔn)的項(xiàng)目布局和項(xiàng)目結(jié)構(gòu)生成器
--標(biāo)準(zhǔn)的依賴管理機(jī)制
--多項(xiàng)目支持
--在開發(fā)者需要的時(shí)候及時(shí)地下載新的插件和功能部件
--生成最新項(xiàng)目信息的網(wǎng)站
--集成了源代碼控制軟件:CVS和Subversion
以上列表展示的只是Maven2.0特點(diǎn)中的一小部分。但這足以使Maven2.0成為一個(gè)構(gòu)建管理系統(tǒng)可靠的選擇。既然我們已經(jīng)知道Maven是個(gè)什么東西了,接下來讓我們看看如何使用它。
入門我們要做的第一件事情就是設(shè)置目錄結(jié)構(gòu),但這并不需要讓我們手動(dòng)設(shè)置,Maven會(huì)根據(jù)您開發(fā)的項(xiàng)目類型來為您做這件事。一旦您下載并解壓了最新發(fā)布的Maven 2.0,您應(yīng)該將Maven所在目錄下面的bin目錄添加到您的系統(tǒng)路徑下。您可以運(yùn)行命令mvn -version來測(cè)試您的安裝。
既然已經(jīng)安裝上了工具,讓我們看看創(chuàng)建一個(gè)簡單的Java項(xiàng)目的例子。Maven使用原型來決定目錄結(jié)構(gòu)是如何展現(xiàn)的。Maven自帶了幾個(gè)內(nèi)建的原型,您也可以自定義原型。
mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app您看,這就生成了我們的項(xiàng)目布局。
my-app
----src
????----main
????????----java
?????????? ----com
?????????????? ----oreilly
????----test
????????----java
????????????----com
????????????????----oreilly
對(duì),就這么簡單。這種目錄結(jié)構(gòu)可以通過創(chuàng)建一個(gè)新的原型來覆寫,但并不推薦這么做,因?yàn)镸aven的一個(gè)優(yōu)點(diǎn)就是使用標(biāo)準(zhǔn)的目錄結(jié)構(gòu)。該目錄結(jié)構(gòu)包含兩個(gè)源代碼樹,一個(gè)是Java應(yīng)用程序的源代碼,另一個(gè)是單元測(cè)試代碼。同時(shí)您也許會(huì)注意到,當(dāng)?shù)谝淮芜\(yùn)行Maven的時(shí)候,它會(huì)進(jìn)行一些下載工作。當(dāng)您開始調(diào)用工具時(shí),Maven會(huì)根據(jù)您使用的插件來更新自身的一些所需功能。Maven默認(rèn)會(huì)從Ibiblio存儲(chǔ)庫中得到更新。您可以在Maven安裝目錄下的conf目錄中,或者項(xiàng)目自身中修改Maven遠(yuǎn)程存儲(chǔ)庫的選擇。
您會(huì)發(fā)現(xiàn)Maven在my-app目錄下創(chuàng)建了一個(gè)pom.xml文件。這是項(xiàng)目的最基本部分。pom.xml文件包含了一組指令,這些指令告訴Maven如何構(gòu)建項(xiàng)目和包含哪些其它的特殊指令(POM是“項(xiàng)目對(duì)象模型”的縮寫)。在默認(rèn)的情況下,Maven包含了JUnit的依賴以此來鼓勵(lì)單元測(cè)試。
<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>com.oreilly</groupId>
??<artifactId>my-app</artifactId>
??<packaging>jar</packaging>
??<version>1.0-SNAPSHOT</version>
??<name>Maven Quick Start Archetype</name>
??<url>http://maven.apache.org</url>
??<dependencies>
????<dependency>
??????<groupId>junit</groupId>
??????<artifactId>junit</artifactId>
??????<version>3.8.1</version>
??????<scope>test</scope>
????</dependency>
??</dependencies>
</project>
創(chuàng)建完項(xiàng)目后,我們可以往項(xiàng)目里添加代碼并使用Maven的所有全新技巧。注意以下命令必須在pom.xml文件所在的目錄中運(yùn)行。
--mvn test:運(yùn)行應(yīng)用程序中的單元測(cè)試
--mvn package:依據(jù)項(xiàng)目生成jar文件
--mvn install:將項(xiàng)目的jar文件添加到庫中,????????以備依賴此項(xiàng)目時(shí)使用
--mvn site:生成項(xiàng)目相關(guān)信息的網(wǎng)站
--mvn clean:清除目標(biāo)目錄中的生成結(jié)果
--mvn eclipse:eclipse:生成Eclipse項(xiàng)目文件
接下來我們看看稍微復(fù)雜點(diǎn)的地方,我們知道手動(dòng)開始一個(gè)Java web項(xiàng)目比手動(dòng)開始一個(gè)簡單的Java項(xiàng)目更耗時(shí),然而Maven的使用則能化難為易。下面的例子(實(shí)際上是一行命令)展現(xiàn)了項(xiàng)目結(jié)構(gòu)的構(gòu)造。
mvn archetype:create -DgroupId=com.oreilly
????-DartifactId=Oreilly
????-DarchetypeArtifactId=maven-archetype-webapp生成的結(jié)果結(jié)構(gòu)如下所示:
Oreilly
----src
????----main
????????----resources
????????----webapp
????????????----WEB-INF
這一次,我們的項(xiàng)目由于支持了將包含在war文件中的web資源而設(shè)置有所不同。pom.xml文件中將包含一行來表明項(xiàng)目應(yīng)該被打包成war文件:<packaging>war</packaging>。現(xiàn)在就可以使用mvn package命令來生成war文件。不用擔(dān)心如何從WEB-INF/lib目錄中得到依賴項(xiàng),在依賴屬性值被設(shè)置成compile的情況下,Maven會(huì)自動(dòng)包含依賴項(xiàng)。也可以將以下代碼添加到pom.xml文件中來改變war文件的名稱:
<build>
????<finalName>PromoteC</finalName>
</build>
依賴管理創(chuàng)建好項(xiàng)目結(jié)構(gòu),添加完一些代碼,測(cè)試并編譯好應(yīng)用程序后,接下來可以看看Maven是如何處理依賴關(guān)系的。為了給項(xiàng)目添加一個(gè)依賴項(xiàng),必須將此依賴項(xiàng)添加到pom.xml文件中。下次運(yùn)行Maven的時(shí)候,它將從Ibiblio存儲(chǔ)庫中得到這個(gè)依賴項(xiàng),并且將此依賴項(xiàng)添加到項(xiàng)目構(gòu)建路徑中。
關(guān)于依賴的問題有幾個(gè)重要的事情值得注意。在寫這篇文章的時(shí)候,Maven中最大的麻煩之處就是不能從Maven存儲(chǔ)庫中獲取Sun的jar文件。這個(gè)問題歸因于Sun在其代碼中設(shè)置的許可證限制。解決這個(gè)問題的辦法有兩種,一種是下載這些代碼并將它們安裝在您本地的存儲(chǔ)庫中,另一種是做一個(gè)外部聲明,并將這個(gè)聲明指向文件系統(tǒng)中依賴項(xiàng)所在的位置。希望Sun能夠盡早地創(chuàng)建自己的存儲(chǔ)庫,盡管如此,Maven也會(huì)被升級(jí)來使之能夠下載這些資源,只是在下載之前它會(huì)提示用戶接受許可證協(xié)議。
另外一個(gè)麻煩的地方就是有時(shí)候使用的最新的庫文件可能在遠(yuǎn)程存儲(chǔ)庫中不存在。另一種可能是由于無法訪問Internet,需要所有的依賴項(xiàng)都能在本地獲取。這些問題的最好解決方案就是將jar文件安裝到本地的存儲(chǔ)庫中。將本地的存儲(chǔ)庫放在一臺(tái)web服務(wù)器上也同樣是個(gè)便利之舉,這樣整個(gè)開發(fā)團(tuán)隊(duì)就能從此獲益,每個(gè)人都沒有必要去管理自己的存儲(chǔ)庫了。改變Maven的存儲(chǔ)庫路徑只需簡單地編輯其安裝目錄下conf文件夾下面的settings.xml文件即可。
在Maven中使用依賴是簡單的。讓我們看看往上述pom.xml文件中添加一個(gè)依賴項(xiàng)的情況。我們雖然已經(jīng)使用了JUnit,但讓我們將功能強(qiáng)大的Quartz庫添加到項(xiàng)目中。Quartz是一款用純Java編寫的關(guān)于時(shí)間安排的開源項(xiàng)目,它是您時(shí)間安排需求方面的很好的選擇。
<dependency>
?? <groupId>quartz</groupId>
?? <artifactId>quartz</artifactId>
?? <version>1.5.1</version>
?? <scope>compile</scope>
</dependency>
我們僅僅只需添加<dependencies>這個(gè)元素,Maven就能下載Quartz并將其作為項(xiàng)目中的一個(gè)依賴項(xiàng)。不用擔(dān)心Quartz的依賴項(xiàng),一個(gè)Maven的存儲(chǔ)庫將包含依賴項(xiàng)自身依賴的資源信息,當(dāng)Maven下載Quartz的時(shí)候,它自身的依賴資源也同樣會(huì)被下載。為了驗(yàn)證版本為1.5.1的Quartz存在于Ibiblio庫中,我們可以瀏覽Maven存儲(chǔ)庫。注意到scope參數(shù)的使用,它告訴了Maven依賴項(xiàng)在何種階段是所需的。在使用JUnit的情況下,我們?cè)O(shè)置scope參數(shù)的值為test來告訴Maven這個(gè)依賴項(xiàng)只是在測(cè)試階段所需的,而不是運(yùn)行時(shí)所需的資源。以下是scope參數(shù)值的說明:
--compile:默認(rèn)值。表明是所有任務(wù)所需的資源
--test:運(yùn)行所有的測(cè)試用例時(shí)所需資源
--runtime:表明是運(yùn)行時(shí)所需資源
--provided:JDK部分或應(yīng)用服務(wù)器的classpath所需的資源
現(xiàn)在,如何處理那些麻煩的Sun的jar包和那些需要但卻不能在遠(yuǎn)程存儲(chǔ)庫中找到的jar包了?我們必須使用Maven來手動(dòng)將這些jar包安裝到本地的存儲(chǔ)庫中。不用擔(dān)心,這沒有聽上去那么困難。為了做個(gè)示例,我們將安裝Java Activation框架的jar包。首先我們必須從Sun的站點(diǎn)上下載此jar包,接著我們使用Maven將它導(dǎo)入本地的存儲(chǔ)庫中。您自己也可以按照Maven上傳資源指南中的指導(dǎo)將缺少的jar包安裝到Ibiblio中。
mvn install:install-file -Dfile=activation.jar
????-DgroupId=javax.activation -DartifactId=activation
????-Dversion=1.0 -Dpackaging=jar現(xiàn)在,新的jar包就像其它的項(xiàng)目依賴項(xiàng)一樣安裝到了本地存儲(chǔ)庫中。在只需添加依賴聲明后,我們就已準(zhǔn)備就緒了。在添加jar包和聲明它們?yōu)橐蕾図?xiàng)時(shí),必須確保版本信息的正確性。版本的不匹配會(huì)導(dǎo)致Maven在尋找資源時(shí)的失敗。在導(dǎo)入Sun的jar包時(shí),如果您需要尋求標(biāo)準(zhǔn)命名參數(shù)的幫助,可以參考Sun標(biāo)準(zhǔn)jar包命名。記住,在目前您不能通過存儲(chǔ)庫來公開發(fā)布這些jar包,這將違反Sun的使用條款。
<dependency>
?? <groupId>javax.activation</groupId>
?? <artifactId>activation</artifactId>
?? <version>1.0</version>
?? <scope>compile</scope>
</dependency>
您或許想將依賴項(xiàng)存入一個(gè)源代碼控制器的庫中,源代碼控制器決不能執(zhí)行這個(gè)任務(wù)。依賴項(xiàng)是經(jīng)常變化的,并且通常有一套數(shù)字方案來標(biāo)明其版本。這就是說,您明確地希望有一個(gè)內(nèi)部遠(yuǎn)程存儲(chǔ)庫的備份,如果您有一個(gè),這將確保在存儲(chǔ)庫服務(wù)器崩潰并且不能恢復(fù)的情況下,您不會(huì)丟失所有的自定義資源。不將依賴項(xiàng)放入源代碼控制器中也會(huì)節(jié)省源代碼控制器的存儲(chǔ)庫服務(wù)器上的大量磁盤空間。
配置存儲(chǔ)庫要求項(xiàng)目的每個(gè)開發(fā)者必須在conf目錄中配置存儲(chǔ)庫是不方便的,所以Maven可以同時(shí)查看多個(gè)存儲(chǔ)庫并且將它們?nèi)颗渲迷趐om.xml文件中。讓我們看看一個(gè)例子,它展示了如何在應(yīng)用程序用使用多個(gè)存儲(chǔ)庫。在以下從pom.xml文件摘錄的片斷中,我們?cè)O(shè)置了兩個(gè)存儲(chǔ)庫來讓Maven尋找依賴項(xiàng)。Ibiblio一直是默認(rèn)的存儲(chǔ)庫,我們又添加了Planet Mirror作為后援存儲(chǔ)庫。我們也可以讓團(tuán)隊(duì)使用的本地web服務(wù)器作為第二個(gè)存儲(chǔ)庫。
<repositories>
????<repository>
??????<id>Ibiblio</id>
??????<name>Ibiblio</name>
??????<url>http://www.ibiblio.org/maven/</url>
????</repository>
????<repository>
??????<id>PlanetMirror</id>
??????<name>Planet Mirror</name>
??????<url>http://public.planetmirror.com/pub/maven/</url>
????</repository>
??</repositories>
使用pom.xml父文件來構(gòu)建多個(gè)項(xiàng)目軟件公司通常的一種做法就是將多個(gè)項(xiàng)目構(gòu)建到主要產(chǎn)品中。維護(hù)依賴關(guān)系鏈和一次性地構(gòu)建整個(gè)產(chǎn)品足以成為一個(gè)挑戰(zhàn),但是如果使用Maven的話,事情將變得簡單。如果您創(chuàng)建了一個(gè)指向其它子模塊的pom.xml父文件,Maven將為您處理整個(gè)構(gòu)建過程。它將分析每個(gè)子模塊的pom.xml文件,并且按照這些子模塊的相互依賴順序來構(gòu)建項(xiàng)目。如果每個(gè)項(xiàng)目明確地指明它們的依賴項(xiàng),那么子模塊在父文件中的放置順序是不造成任何影響的。但是考慮到其他的開發(fā)者,最好保證子模塊在pom.xml父文件中的放置順序和您期望的子項(xiàng)目被構(gòu)建的順序一樣。下面我們看個(gè)示例。
pom.xml主文件如下:
<project>
??<modelVersion>4.0.0</modelVersion>
??<groupId>com.oreilly</groupId>
??<version>1.0-SNAPSHOT</version>
??<artifactId>my-app</artifactId>
??<packaging>pom</packaging>
??<modules>
????<module>Common</module>
????<module>Utilities</module>
????<module>Application</module>
???? <module>WebApplication</module>
??</modules>
</project>
我們需要確保WebApplication子模塊包含了所有的三個(gè)jar包,所以需要將這些jar包聲明為依賴項(xiàng)。在這個(gè)例子中,Utilities項(xiàng)目依賴于Common項(xiàng)目,所以Utilities項(xiàng)目中需要添加一個(gè)對(duì)Common項(xiàng)目的依賴。Application子模塊也是同樣的道理,因?yàn)樗蕾囉贑ommon和Utilities項(xiàng)目,Utilities又賴于Common。如果這個(gè)例子中有60個(gè)子模塊,并且它們都相互依賴,這會(huì)使得新開發(fā)者難以算出什么項(xiàng)目依賴于其它項(xiàng)目,所以這正好是要求確保pom.xml父文件中項(xiàng)目放置順序要清除的原因。
以下是Utility模塊的依賴項(xiàng):
<dependencies>
????<dependency>
??????<groupId>com.oreilly</groupId>
??????<artifactId>Common</artifactId>
??????<version>1.0-SNAPSHOT</version>
????</dependency>
??</dependencies>
以下是如何聲明Application模塊的依賴項(xiàng):
<dependencies>
????<dependency>
??????<groupId>com.oreilly</groupId>
??????<artifactId>Common</artifactId>
??????<version>1.0-SNAPSHOT</version>
????</dependency>
????<dependency>
??????<groupId>com.oreilly</groupId>
??????<artifactId>Utilities</artifactId>
??????<version>1.0-SNAPSHOT</version>
????</dependency>
??</dependencies>
最后是WebApplication模塊的依賴項(xiàng):
<dependencies>
????<dependency>
??????<groupId>com.oreilly</groupId>
??????<artifactId>Common</artifactId>
??????<version>1.0-SNAPSHOT</version>
????</dependency>
????<dependency>
??????<groupId>com.oreilly</groupId>
??????<artifactId>Utilities</artifactId>
??????<version>1.0-SNAPSHOT</version>
????</dependency>
????
????<dependency>
??????<groupId>com.oreilly</groupId>
??????<artifactId>Application</artifactId>
??????<version>1.0-SNAPSHOT</version>
????</dependency>
????
</dependencies>
現(xiàn)在,我們只需為每個(gè)子模塊的pom.xml文件添加一個(gè)元素來表明它們是一個(gè)邏輯構(gòu)建的一部分:
<parent>
????<groupId>com.oreilly</groupId>
????<artifactId>my-app</artifactId>
????<version>1.0-SNAPSHOT</version>
??</parent>
在pom.xml父文件所在的同一個(gè)目錄中,存在有項(xiàng)目目錄:Common, Utilities, Application, 和WebApplication。當(dāng)我們?cè)谠撃夸浿羞\(yùn)行mvn package命令時(shí),這些項(xiàng)目會(huì)按照依賴順序而被構(gòu)建。
插件和報(bào)表Maven2.0有大量的插件可以使用。不幸的是,由于Maven的重寫,Maven1.0的插件不能在2.0中使用。盡管如此,還是存在一些可以使用的Maven2.0的插件。下面pom.xml文件中的插件配置示例是直接從Maven2.0網(wǎng)站上得來的。這個(gè)插件是用來配置編譯選項(xiàng)的。
<plugins>
????<plugin>
??????<groupId>org.apache.maven.plugins</groupId>
??????<artifactId>maven-compiler-plugin</artifactId>
??????<configuration>
????????<source>1.5</source>
????????<target>1.5</target>
??????</configuration>
????</plugin>
??</plugins>
Maven報(bào)表插件可以用來生成不同的報(bào)表,這些報(bào)表是在當(dāng)你使用mvn site命令生成項(xiàng)目的站點(diǎn)時(shí)產(chǎn)生的。下面的例子展示了如何使用<reporting>元素來配置這類插件中的一個(gè)。
<reporting>
????<plugins>
??????<plugin>
????????<groupId>org.apache.maven.plugins</groupId>
????????<artifactId>maven-project-info-reports-plugin</artifactId>
??????</plugin>
????</plugins>
??</reporting>
Maven Plugin Matrix是一個(gè)十分實(shí)用的工具,它能給出哪些Maven插件適合于哪些版本的Maven。
Maven 和 Eclipse
如何能使全世界最好的IDE變得更好了?答案是使用Maven2的插件,它能幫助您尋找依賴項(xiàng)并自動(dòng)地將它們添加到pom.xml文件中。雖然最好的方法是首先使用Maven來創(chuàng)建您的項(xiàng)目,然后再用命令mvn eclipse:eclipse來生成Eclipse項(xiàng)目文件,這樣最初就能得到一個(gè)好的目錄結(jié)構(gòu),但Maven也可通過其Eclipse插件來管理任何項(xiàng)目。
您可以在Eclipse自身的升級(jí)器中輸入站點(diǎn)http://m2eclipse.codehaus.org/來安裝插件。在安裝完成并重啟IDE后,您需要在Eclipse的參數(shù)選項(xiàng)中配置此插件,設(shè)置本地存儲(chǔ)庫的位置。這是很重要的一步,因?yàn)槿绻鸈clipse默認(rèn)的存儲(chǔ)庫不能匹配您默認(rèn)的需求,Maven會(huì)重新下載您的依賴項(xiàng)。配置完成后,將項(xiàng)目導(dǎo)入Eclipse,鼠標(biāo)右擊該項(xiàng)目,選擇Maven 2 -> Enable。現(xiàn)在您可以回到之前的步驟,您可以有更多的選項(xiàng)比如添加依賴項(xiàng),這將彈出一個(gè)搜索框,您可以搜索依賴項(xiàng)并添加它們,插件會(huì)替你編輯pom.xml文件。
插件會(huì)使用Maven來構(gòu)建您的項(xiàng)目,就像Eclipse使用Ant來構(gòu)建項(xiàng)目一樣。如果您想獲取更多的關(guān)于Eclipse整合Maven的信息,可以查閱Maven站點(diǎn)上的Eclipse集成Maven 2.x使用指南。
另一方面,如果您是一個(gè)IntelliJ使用愛好者,您也能通過運(yùn)行指令mvn idea:idea來完成同樣的任務(wù)。這些IDE????????工具能夠節(jié)省開發(fā)人員的時(shí)間。例如,如果一個(gè)開發(fā)人員為一個(gè)項(xiàng)目添加了一些特征,團(tuán)隊(duì)里的其他開發(fā)人員只需從源代碼控制器的存儲(chǔ)庫中重新獲取項(xiàng)目文件即可,這就節(jié)省了每個(gè)開發(fā)人員必須配置IDE的時(shí)間。
結(jié)論
Maven2.0有著許多實(shí)用的特點(diǎn),并且完成任務(wù)十分出色。Maven中最值得稱贊的地方就是使用了標(biāo)準(zhǔn)的目錄結(jié)構(gòu)和部署。這就使得開發(fā)人員能夠適應(yīng)不同的項(xiàng)目,并且不用學(xué)習(xí)任何結(jié)構(gòu)方面新的東西,也不用掌握特殊的指令來構(gòu)建結(jié)構(gòu)。Maven可以通過純腳本來實(shí)現(xiàn)。在文檔方面,由于使用了項(xiàng)目站點(diǎn)構(gòu)建工具,所以當(dāng)項(xiàng)目構(gòu)建完成后,您可以查看所有開發(fā)的當(dāng)前狀態(tài)。
毫無疑問,當(dāng)提到構(gòu)建配置的伸縮性,易用性和項(xiàng)目管理方面時(shí),Maven2.0足可以將Ant取而代之。在接下來的幾年內(nèi),我們將看到Maven作為標(biāo)準(zhǔn)構(gòu)建技術(shù)更多的使用,直到有人帶來了大家公認(rèn)的“高級(jí)捕鼠器”。您可以從下面列出的Maven項(xiàng)目站點(diǎn)上下載Maven。
資源
Matrix:http://www.matrix.org.cn/
Onjava:http://www.onjava.com/
Maven項(xiàng)目站點(diǎn)
Chris Hardin 是McLeod軟件公司的高級(jí)Java工程師。