Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          來自:http://www.linuxpk.com/43786.html
          聯系:linuxmine#gmail.com
          分類:[開發工具]

            摘要:Maven1.0已經歷了幾年的時間,并且作為Ant的替代品已被廣大的開發人員所接收,但它并沒有在很大程度使開發人員從Ant的build.xml文件中解脫出來。Maven1.0速度慢并且笨拙,使用起來的困難度并不亞于使用Ant的項目。事實上,它的核心是基于Ant實現的。在經過了幾乎徹底的重寫后,Maven2.0誕生了。

            一個Java項目中最困難的地方就是如何著手啟動它。在啟動項目之前,我們必須配置好所有的邏輯關系。比如,Java源代碼應該放在何處?單元測試應該在何處進行?依賴的jar包應該如何放置?如何構建項目,如何形成文檔,如何測試和部署項目?在這種情況下,開發人員不同的處理選擇將會影響項目的余下部分。您的選擇可能會使你陷入困境,也可能會在將來證明您是一位Java架構大師。我們假定后者是我們奮斗的目標,接下來就進入我們的正題。

            構建一個Java項目可以使用很多工具,其中包括Ant。Ant作為一款具有革命性的工具,一直是眾多開發者使用工具中的首選,它能使開發人員擺脫使用大量make命令的苦海。對于那些不太熟悉make命令的人來說,他們有充足的理由來表明使用命令并不是構建Java項目的最好工具,因為它不具備平臺獨立性并且不易使用。Ant的出現解決了以上的問題,它使用了一個平臺獨立的工具,該工具能夠解析XML配置文件,即build.xml。雖然Ant由于其諸多的優點而備受歡迎,但它同樣有一些缺點。build.xml文件由于采用了極其簡短的描述方式,使得開發人員需要預先學習它的語法。雖然學習曲線不是很陡峭,但Java開發人員更應該把時間放在開發上面。

            Maven是新一代的生力軍,它的境遇正好和幾年前的Ant十分類似。Maven1.0已經歷了幾年的時間,并且作為Ant的替代品已被廣大的開發人員所接收,但它并沒有在很大程度使開發人員從Ant的build.xml文件中解脫出來。Maven1.0速度慢并且笨拙,使用起來的困難度并不亞于使用Ant的項目。事實上,它的核心是基于Ant實現的。在經過了幾乎徹底的重寫后,Maven2.0誕生了。

            版權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者信息和鏈接

            作者:Chris Hardin;mycj(作者的blog:http://blog.matrix.org.cn/page/mycj)

            原文:http://www.onjava.com/pub/a/onjava/2006/03/29/maven-2-0.html

            Matrix:http://www.matrix.org.cn/resource/article/44/44475_Maven2.html

            關鍵字:Maven2

            Maven2.0的優點

            Maven2.0有許多很好功能,這些功能不僅僅是幫助您構建項目。如果您剛剛開始啟動一個Java項目,并且想使該項目快速地開展下去,Maven2.0能夠在幾分鐘內達到您的要求。以下是Maven2.0的一些優點:

            --標準的項目布局和項目結構生成器

            --標準的依賴管理機制

            --多項目支持

            --在開發者需要的時候及時地下載新的插件和功能部件

            --生成最新項目信息的網站

            --集成了源代碼控制軟件:CVS和Subversion

            以上列表展示的只是Maven2.0特點中的一小部分。但這足以使Maven2.0成為一個構建管理系統可靠的選擇。既然我們已經知道Maven是個什么東西了,接下來讓我們看看如何使用它。

            入門

            我們要做的第一件事情就是設置目錄結構,但這并不需要讓我們手動設置,Maven會根據您開發的項目類型來為您做這件事。一旦您下載并解壓了最新發布的Maven 2.0,您應該將Maven所在目錄下面的bin目錄添加到您的系統路徑下。您可以運行命令mvn -version來測試您的安裝。

            既然已經安裝上了工具,讓我們看看創建一個簡單的Java項目的例子。Maven使用原型來決定目錄結構是如何展現的。Maven自帶了幾個內建的原型,您也可以自定義原型。

            mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app

            您看,這就生成了我們的項目布局。

            my-app

            ----src

            ----main

            ----java

             ----com

             ----oreilly

            ----test

            ----java

            ----com

            ----oreilly

            對,就這么簡單。這種目錄結構可以通過創建一個新的原型來覆寫,但并不推薦這么做,因為Maven的一個優點就是使用標準的目錄結構。該目錄結構包含兩個源代碼樹,一個是Java應用程序的源代碼,另一個是單元測試代碼。同時您也許會注意到,當第一次運行Maven的時候,它會進行一些下載工作。當您開始調用工具時,Maven會根據您使用的插件來更新自身的一些所需功能。Maven默認會從Ibiblio存儲庫中得到更新。您可以在Maven安裝目錄下的conf目錄中,或者項目自身中修改Maven遠程存儲庫的選擇。

            您會發現Maven在my-app目錄下創建了一個pom.xml文件。這是項目的最基本部分。pom.xml文件包含了一組指令,這些指令告訴Maven如何構建項目和包含哪些其它的特殊指令(POM是“項目對象模型”的縮寫)。在默認的情況下,Maven包含了JUnit的依賴以此來鼓勵單元測試。

            
          <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>


            創建完項目后,我們可以往項目里添加代碼并使用Maven的所有全新技巧。注意以下命令必須在pom.xml文件所在的目錄中運行。

            --mvn test:運行應用程序中的單元測試

            --mvn package:依據項目生成jar文件

            --mvn install:將項目的jar文件添加到庫中,以備依賴此項目時使用

            --mvn site:生成項目相關信息的網站

            --mvn clean:清除目標目錄中的生成結果

            --mvn eclipse:eclipse:生成Eclipse項目文件

            接下來我們看看稍微復雜點的地方,我們知道手動開始一個Java web項目比手動開始一個簡單的Java項目更耗時,然而Maven的使用則能化難為易。下面的例子(實際上是一行命令)展現了項目結構的構造。

            mvn archetype:create -DgroupId=com.oreilly

            -DartifactId=Oreilly

            -DarchetypeArtifactId=maven-archetype-webapp

            生成的結果結構如下所示:

            Oreilly

            ----src

            ----main

            ----resources

            ----webapp

            ----WEB-INF

            這一次,我們的項目由于支持了將包含在war文件中的web資源而設置有所不同。pom.xml文件中將包含一行來表明項目應該被打包成war文件:<packaging>war</packaging>。現在就可以使用mvn package命令來生成war文件。不用擔心如何從WEB-INF/lib目錄中得到依賴項,在依賴屬性值被設置成compile的情況下,Maven會自動包含依賴項。也可以將以下代碼添加到pom.xml文件中來改變war文件的名稱:

            
          <build>

            <finalName>PromoteC</finalName>

             </build>


            依賴管理

            創建好項目結構,添加完一些代碼,測試并編譯好應用程序后,接下來可以看看Maven是如何處理依賴關系的。為了給項目添加一個依賴項,必須將此依賴項添加到pom.xml文件中。下次運行Maven的時候,它將從Ibiblio存儲庫中得到這個依賴項,并且將此依賴項添加到項目構建路徑中。

            關于依賴的問題有幾個重要的事情值得注意。在寫這篇文章的時候,Maven中最大的麻煩之處就是不能從Maven存儲庫中獲取Sun的jar文件。這個問題歸因于Sun在其代碼中設置的許可證限制。解決這個問題的辦法有兩種,一種是下載這些代碼并將它們安裝在您本地的存儲庫中,另一種是做一個外部聲明,并將這個聲明指向文件系統中依賴項所在的位置。希望Sun能夠盡早地創建自己的存儲庫,盡管如此,Maven也會被升級來使之能夠下載這些資源,只是在下載之前它會提示用戶接受許可證協議。

            另外一個麻煩的地方就是有時候使用的最新的庫文件可能在遠程存儲庫中不存在。另一種可能是由于無法訪問Internet,需要所有的依賴項都能在本地獲取。這些問題的最好解決方案就是將jar文件安裝到本地的存儲庫中。將本地的存儲庫放在一臺web服務器上也同樣是個便利之舉,這樣整個開發團隊就能從此獲益,每個人都沒有必要去管理自己的存儲庫了。改變Maven的存儲庫路徑只需簡單地編輯其安裝目錄下conf文件夾下面的settings.xml文件即可。

            在Maven中使用依賴是簡單的。讓我們看看往上述pom.xml文件中添加一個依賴項的情況。我們雖然已經使用了JUnit,但讓我們將功能強大的Quartz庫添加到項目中。Quartz是一款用純Java編寫的關于時間安排的開源項目,它是您時間安排需求方面的很好的選擇。

            
          <dependency>

             <groupId>quartz</groupId>

             <artifactId>quartz</artifactId>

             <version>1.5.1</version>

             <scope>compile</scope>

             </dependency>


            我們僅僅只需添加<dependencies>這個元素,Maven就能下載Quartz并將其作為項目中的一個依賴項。不用擔心Quartz的依賴項,一個Maven的存儲庫將包含依賴項自身依賴的資源信息,當Maven下載Quartz的時候,它自身的依賴資源也同樣會被下載。為了驗證版本為1.5.1的Quartz存在于Ibiblio庫中,我們可以瀏覽Maven存儲庫。注意到scope參數的使用,它告訴了Maven依賴項在何種階段是所需的。在使用JUnit的情況下,我們設置scope參數的值為test來告訴Maven這個依賴項只是在測試階段所需的,而不是運行時所需的資源。以下是scope參數值的說明:

            --compile:默認值。表明是所有任務所需的資源

            --test:運行所有的測試用例時所需資源

            --runtime:表明是運行時所需資源

            --provided:JDK部分或應用服務器的classpath所需的資源

            現在,如何處理那些麻煩的Sun的jar包和那些需要但卻不能在遠程存儲庫中找到的jar包了?我們必須使用Maven來手動將這些jar包安裝到本地的存儲庫中。不用擔心,這沒有聽上去那么困難。為了做個示例,我們將安裝Java Activation框架的jar包。首先我們必須從Sun的站點上下載此jar包,接著我們使用Maven將它導入本地的存儲庫中。您自己也可以按照Maven上傳資源指南中的指導將缺少的jar包安裝到Ibiblio中。

            mvn install:install-file -Dfile=activation.jar

            -DgroupId=javax.activation -DartifactId=activation

            -Dversion=1.0 -Dpackaging=jar

            現在,新的jar包就像其它的項目依賴項一樣安裝到了本地存儲庫中。在只需添加依賴聲明后,我們就已準備就緒了。在添加jar包和聲明它們為依賴項時,必須確保版本信息的正確性。版本的不匹配會導致Maven在尋找資源時的失敗。在導入Sun的jar包時,如果您需要尋求標準命名參數的幫助,可以參考Sun標準jar包命名。記住,在目前您不能通過存儲庫來公開發布這些jar包,這將違反Sun的使用條款。

            
          <dependency>

             <groupId>javax.activation</groupId>

             <artifactId>activation</artifactId>

             <version>1.0</version>

             <scope>compile</scope>

             </dependency>


            您或許想將依賴項存入一個源代碼控制器的庫中,源代碼控制器決不能執行這個任務。依賴項是經常變化的,并且通常有一套數字方案來標明其版本。這就是說,您明確地希望有一個內部遠程存儲庫的備份,如果您有一個,這將確保在存儲庫服務器崩潰并且不能恢復的情況下,您不會丟失所有的自定義資源。不將依賴項放入源代碼控制器中也會節省源代碼控制器的存儲庫服務器上的大量磁盤空間。

            配置存儲庫

            要求項目的每個開發者必須在conf目錄中配置存儲庫是不方便的,所以Maven可以同時查看多個存儲庫并且將它們全部配置在pom.xml文件中。讓我們看看一個例子,它展示了如何在應用程序用使用多個存儲庫。在以下從pom.xml文件摘錄的片斷中,我們設置了兩個存儲庫來讓Maven尋找依賴項。Ibiblio一直是默認的存儲庫,我們又添加了Planet Mirror作為后援存儲庫。我們也可以讓團隊使用的本地web服務器作為第二個存儲庫。

            
          <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父文件來構建多個項目

            軟件公司通常的一種做法就是將多個項目構建到主要產品中。維護依賴關系鏈和一次性地構建整個產品足以成為一個挑戰,但是如果使用Maven的話,事情將變得簡單。如果您創建了一個指向其它子模塊的pom.xml父文件,Maven將為您處理整個構建過程。它將分析每個子模塊的pom.xml文件,并且按照這些子模塊的相互依賴順序來構建項目。如果每個項目明確地指明它們的依賴項,那么子模塊在父文件中的放置順序是不造成任何影響的。但是考慮到其他的開發者,最好保證子模塊在pom.xml父文件中的放置順序和您期望的子項目被構建的順序一樣。下面我們看個示例。

            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子模塊包含了所有的三個jar包,所以需要將這些jar包聲明為依賴項。在這個例子中,Utilities項目依賴于Common項目,所以Utilities項目中需要添加一個對Common項目的依賴。Application子模塊也是同樣的道理,因為它依賴于Common和Utilities項目,Utilities又賴于Common。如果這個例子中有60個子模塊,并且它們都相互依賴,這會使得新開發者難以算出什么項目依賴于其它項目,所以這正好是要求確保pom.xml父文件中項目放置順序要清除的原因。

            以下是Utility模塊的依賴項:

            
          <dependencies>

            <dependency>

            <groupId>com.oreilly</groupId>

            <artifactId>Common</artifactId>

            <version>1.0-SNAPSHOT</version>

            </dependency>

            </dependencies>


            以下是如何聲明Application模塊的依賴項:

            
          <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模塊的依賴項:

            
          <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>


            現在,我們只需為每個子模塊的pom.xml文件添加一個元素來表明它們是一個邏輯構建的一部分:

            
          <parent>

            <groupId>com.oreilly</groupId>

            <artifactId>my-app</artifactId>

            <version>1.0-SNAPSHOT</version>

            </parent>


            在pom.xml父文件所在的同一個目錄中,存在有項目目錄:Common, Utilities, Application, 和WebApplication。當我們在該目錄中運行mvn package命令時,這些項目會按照依賴順序而被構建。

            插件和報表

            Maven2.0有大量的插件可以使用。不幸的是,由于Maven的重寫,Maven1.0的插件不能在2.0中使用。盡管如此,還是存在一些可以使用的Maven2.0的插件。下面pom.xml文件中的插件配置示例是直接從Maven2.0網站上得來的。這個插件是用來配置編譯選項的。

            
          <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報表插件可以用來生成不同的報表,這些報表是在當你使用mvn site命令生成項目的站點時產生的。下面的例子展示了如何使用<reporting>元素來配置這類插件中的一個。

            
          <reporting>

            <plugins>

            <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-project-info-reports-plugin</artifactId>

            </plugin>

            </plugins>

            </reporting>


            Maven Plugin Matrix是一個十分實用的工具,它能給出哪些Maven插件適合于哪些版本的Maven。

            Maven 和 Eclipse

            如何能使全世界最好的IDE變得更好了?答案是使用Maven2的插件,它能幫助您尋找依賴項并自動地將它們添加到pom.xml文件中。雖然最好的方法是首先使用Maven來創建您的項目,然后再用命令mvn eclipse:eclipse來生成Eclipse項目文件,這樣最初就能得到一個好的目錄結構,但Maven也可通過其Eclipse插件來管理任何項目。

            您可以在Eclipse自身的升級器中輸入站點http://m2eclipse.codehaus.org/來安裝插件。在安裝完成并重啟IDE后,您需要在Eclipse的參數選項中配置此插件,設置本地存儲庫的位置。這是很重要的一步,因為如果Eclipse默認的存儲庫不能匹配您默認的需求,Maven會重新下載您的依賴項。配置完成后,將項目導入Eclipse,鼠標右擊該項目,選擇Maven 2 -> Enable。現在您可以回到之前的步驟,您可以有更多的選項比如添加依賴項,這將彈出一個搜索框,您可以搜索依賴項并添加它們,插件會替你編輯pom.xml文件。

            插件會使用Maven來構建您的項目,就像Eclipse使用Ant來構建項目一樣。如果您想獲取更多的關于Eclipse整合Maven的信息,可以查閱Maven站點上的Eclipse集成Maven 2.x使用指南。

            另一方面,如果您是一個IntelliJ使用愛好者,您也能通過運行指令mvn idea:idea來完成同樣的任務。這些IDE工具能夠節省開發人員的時間。例如,如果一個開發人員為一個項目添加了一些特征,團隊里的其他開發人員只需從源代碼控制器的存儲庫中重新獲取項目文件即可,這就節省了每個開發人員必須配置IDE的時間。

            結論

            Maven2.0有著許多實用的特點,并且完成任務十分出色。Maven中最值得稱贊的地方就是使用了標準的目錄結構和部署。這就使得開發人員能夠適應不同的項目,并且不用學習任何結構方面新的東西,也不用掌握特殊的指令來構建結構。Maven可以通過純腳本來實現。在文檔方面,由于使用了項目站點構建工具,所以當項目構建完成后,您可以查看所有開發的當前狀態。

            毫無疑問,當提到構建配置的伸縮性,易用性和項目管理方面時,Maven2.0足可以將Ant取而代之。在接下來的幾年內,我們將看到Maven作為標準構建技術更多的使用,直到有人帶來了大家公認的“高級捕鼠器”。您可以從下面列出的Maven項目站點上下載Maven。

            資源

            Matrix:http://www.matrix.org.cn

            Onjava:http://www.onjava.com

            Maven項目站點

            Chris Hardin 是McLeod軟件公司的高級Java工程師。
          本文來自:http://www.linuxpk.com/43786.html
          posted on 2008-01-10 19:27 禮物 閱讀(907) 評論(0)  編輯  收藏 所屬分類: maven2
          主站蜘蛛池模板: 建阳市| 贡山| 内丘县| 乡城县| 泾阳县| 丰都县| 襄汾县| 白朗县| 涞水县| 三明市| 麻栗坡县| 宜春市| 松滋市| 九龙县| 石棉县| 西乡县| 清水县| 嘉义县| 乌苏市| 青神县| 名山县| 黄冈市| 绍兴县| 沙田区| 三都| 勐海县| 东阿县| 沈阳市| 池州市| 榆社县| 西昌市| 静乐县| 色达县| 来凤县| 大埔区| 巴马| 卓资县| 汕头市| 堆龙德庆县| 商河县| 当阳市|