Ant是軟件構建工具,Maven的定位是軟件項目管理和理解工具。總的來講:java
第一: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最好的方法仍是命令行,又快又方便。mysql
一 POM(Project Object Model)與項目管理web
每個Maven工程都包含一個pom.xml文件,其餘存儲了該工程相關的信息,從而達到必定的項目管理的功能。例如包含了工程的配置,缺陷跟蹤系統信息,工程的組織,許可協議,工程的路徑,依賴等信息。sql
典型的pom.xml以下:apache
<project … >
<modelVersion>4.0.0</modelVersion>app
<!-- The Basics -->
<groupId>...</groupId>
< artifactId>...</artifactId>
< version>...</version>
< packaging>...</packaging>
< dependencies>...</dependencies>
< parent>...</parent>
< dependencyManagement>...</dependencyManagement>
< modules>...</modules>
< properties>...</properties>maven
<!-- Build Settings -->
<build>...</build>
< reporting>...</reporting>工具
<!-- Project Meta Data -->
<name>...</name>
< description>...</description>
< url>...</url>
< inceptionYear>...</inceptionYear>
< licenses>...</licenses>
< organization>...</organization>post
<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上。