Ant是軟件構建工具,Maven的定位是軟件項目管理和理解工具。總的來說:
第一:ant腳本是可以直接運行在maven中的。maven和ant最大的差別就是在於maven的編譯以及所有的腳本都有一個基礎,就是POM(project object model)。這個模型定義了項目的方方面面,然后各式各樣的腳本在這個模型上工作,而ant完全是自己定義,顯然maven更勝一籌。
第二:Maven對所依賴的包有明確的定義,如使用那個包,版本是多少,一目了然。而ant則通常是簡單的inclde 所有的jar。導致的最終結果就是,你根本無法確定JBoss中的lib下的common-logging 是哪個版本的,唯一的方法就是打開 META-INF 目錄下MANIFEST.MF。估計JBoss遲早會轉向Maven的。
第三:Maven是基於中央倉庫的編譯,即把編譯所需要的資源放在一個中央倉庫里,如jar,tld,pom,等。當編譯的時候,maven會自動在倉庫中找到相應的包,如果本地倉庫沒有,則從設定好的遠程倉庫中下載到本地。這一切都是自動的,而ant需要自己定義了。這個好處導致的結果就是,用maven編譯的項目在發布的時候只需要發布源碼,小得很,而反之,ant的發布則要把所有的包一起發布,顯然maven又勝了一籌。
第四:maven有大量的重用腳本可以利用,如生成網站,生成javadoc,sourcecode reference,等。而ant都需要自己去寫。試試 maven site 的效果。
第五:maven目前不足的地方就是沒有象ant那樣成熟的GUI界面,不過mavengui正在努力中。目前使用maven最好的方法還是命令行,又快又方便。
一 POM(Project Object Model)與項目管理
每一個Maven工程都包含一個pom.xml文件,其他存儲了該工程相關的信息,從而達到一定的項目管理的功能。例如包含了工程的配置,缺陷跟蹤系統信息,工程的組織,許可協議,工程的路徑,依賴等信息。
典型的pom.xml如下:
<project … >
<modelVersion>4.0.0</modelVersion>
<!-- The Basics -->
<groupId>...</groupId>
< artifactId>...</artifactId>
< version>...</version>
< packaging>...</packaging>
< dependencies>...</dependencies>
< parent>...</parent>
< dependencyManagement>...</dependencyManagement>
< modules>...</modules>
< properties>...</properties>
<!-- Build Settings -->
<build>...</build>
< reporting>...</reporting>
<!-- Project Meta Data -->
<name>...</name>
< description>...</description>
< url>...</url>
< inceptionYear>...</inceptionYear>
< licenses>...</licenses>
< organization>...</organization>
<developers>...</developers>
< contributors>...</contributors>
<!-- Environment -->
<issueManagement>...</issueManagement>
< ciManagement>...</ciManagement>
< mailingLists>...</mailingLists>
< scm>...</scm>
< prerequisites>...</prerequisites>
< repositories>...</repositories>
< pluginRepositories>...</pluginRepositories>
< distributionManagement>...</distributionManagement>
< profiles>...</profiles>
< /project>
二 隱形的規則和簡單的構建文件
Maven工程的目錄結構必須為如下的結構
Maven還有內置的構建生命周期,內置定義了build,test,package,deploy等task。
由於Maven工程目錄的規則和內置的構建生命周期,從而使得構建文件簡單,例如如下的構建文件中甚至沒有出現build,package等task的定義,但是我們已經可以調用wvm package等內置的task了:
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</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>
三 依賴管理和Repository
Maven的dependence management用來管理所有此project的dependences,且在dependence repository中自動查找和下載dependence。
1) 依賴管理
例如工程以來MySQL如下:
<dependencyManagement>
< dependencies>
< dependency>
< groupId>mysql</groupId>
< artifactId>mysql-connector-java</artifactId>
< version>5.1.2</version>
< /dependency>
< dependencies>
< /dependencyManagement>
<dependency>
< groupId>mysql</groupId>
< artifactId>mysql-connector-java</artifactId>
< /dependency>
2)dependence repository
更好的辦法是公司或每個team有自己的repository,例如下圖:
四 構建生命周期的定義
構建生命周期顯式地定義了構建,測試,和發布的過程,是每個Maven工程的核心。Maven包含了3個內置的生命周期:default,clean和site。
1)default生命周期處理了工程的編譯,測試和部署,他一共包含20多個階段,主要的階段如下:
Validate: 驗證所有的工程信息是否可用且正確
Compile: 編譯源代碼
Test: 在一套framework下運行但願測試
Package: 以發布的格式打包編譯的代碼
Integration-test: 在集成測試環境中處理(部署)發布包
Verify: 檢測發布包是否正確可用
Install: 在本地的repository上安裝發布包
Deploy: 在遠程的repository上安裝發布包
以上的階段具有先后順序,執行某個階段時,此階段前的所有階段都會被自動地執行。
2)clean生命周期處理工程的清理工作,包含3個階段:pre-clean, clean, post-clean。
3)site生命周期處理工程site文檔的生成和部署,包含下列階段:
pre-site, site, post-site 和site-deploy,其中site-deploy用來將site文檔部署到指定的web server上。