摘要:
如果你已經(jīng)有十次輸入同樣的Ant targets來(lái)編譯你的代碼、jar或者war、生成javadocs,你一定會(huì)自問(wèn),是否有有一個(gè)重復(fù)性更少卻能同樣完成該工作的方法。Maven便提供了這樣一種選擇,將你的注意力從作業(yè)層轉(zhuǎn)移到項(xiàng)目管理層。Maven項(xiàng)目已經(jīng)能夠知道如何構(gòu)建和捆綁代碼,運(yùn)行測(cè)試,生成文檔并宿主項(xiàng)目網(wǎng)頁(yè)??赐瓯疚?,你應(yīng)該能夠從頭建立一個(gè)Maven的項(xiàng)目,使用Maven進(jìn)行相關(guān)管理,創(chuàng)建基于某些感興趣報(bào)告的簡(jiǎn)單的web站點(diǎn)。 本文Matrix永久鏡像:http://www./resource/article/43/43661_Maven.html 說(shuō)明:本文可能由Matrix原創(chuàng),也可能由Matrix的會(huì)員整理,或者由 Matrix的Crawler在全球知名Java或者其他技術(shù)相關(guān)站點(diǎn)抓取并永久 保留鏡像,Matrix會(huì)保留所有原來(lái)的出處URL,并在顯著地方作出說(shuō)明, 如果你發(fā)覺(jué)出處URL有誤,請(qǐng)聯(lián)系Matrix改正. 版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明 英文原文地址: http://www./pub/a/onjava/excerpt/mavenadn_ch01/index.html 中文地址: http://www./resource/article/43/43661_Maven.html 關(guān)鍵詞: Maven Ant Java 編者注: 如果你已經(jīng)有十次輸入同樣的Ant targets來(lái)編譯你的代碼、jar或者war、生成javadocs,你一定會(huì)自問(wèn),是否有有一個(gè)重復(fù)性更少卻能同樣完成該工作的方法。Maven便提供了這樣一種選擇,將你的注意力從作業(yè)層轉(zhuǎn)移到項(xiàng)目管理層。Maven項(xiàng)目已經(jīng)能夠知道如何構(gòu)建和捆綁代碼,運(yùn)行測(cè)試,生成文檔并宿主項(xiàng)目網(wǎng)頁(yè)。 O‘Reilly‘s的新書(shū)Maven:A Developer‘s Notebook幫你提升你的項(xiàng)目、使其盡快的運(yùn)行起來(lái),同時(shí)也提供了對(duì)Maven插件及其團(tuán)隊(duì)協(xié)作等高級(jí)特性的深度考察。在“Maven Jump-Start” (656K PDF)的示范章節(jié)中,作者Vincent Massol和Timothy M.O‘Brien向你展示了如何安裝Maven,如何開(kāi)始你初次的構(gòu)建,研究如何使其與IDEs集成極其資源管等特性。 Vincent Massol是Jakarta Catus framework(框架)的創(chuàng)建者。其后他花費(fèi)4年的時(shí)間在幾個(gè)大項(xiàng)目(主要是J2EE)的架構(gòu)技術(shù)上。他現(xiàn)在是Pivolis的創(chuàng)辦人和CTO,這是一家專注于應(yīng)用敏捷方法進(jìn)行軟件開(kāi)發(fā)的公司。他現(xiàn)在居住在法國(guó)的首都City of Light(巴黎)。 Timothy M. O‘Brien作為一個(gè)專業(yè)的歌手/程序員現(xiàn)正在芝加哥地區(qū)工作和生活。 ![]() 讓我們開(kāi)始使用Maven。在本章結(jié)束時(shí),你應(yīng)該能夠從頭建立一個(gè)Maven的項(xiàng)目,使用Maven進(jìn)行相關(guān)管理,創(chuàng)建基于某些感興趣報(bào)告的簡(jiǎn)單的web站點(diǎn)。 安裝Maven 開(kāi)始本書(shū)以前,你有一些必備的安裝工作。本書(shū)中的例子用Java1.4.2編寫(xiě),Maven能夠兼容Java1.4.2和Java1.5.0。本書(shū)中所寫(xiě)Maven的最新版本是在編寫(xiě)本書(shū)時(shí)發(fā)布的—Maven 1.0.2。除JDK和Maven1.0.2之外,你還需要連接到Internet,Maven將通過(guò)公網(wǎng)站點(diǎn)下載相關(guān)其需要的。那么,前進(jìn),安裝Maven吧。 我該如何做? 從Apache Software Foundation(ASF)下載Maven。進(jìn)入http://maven./從左側(cè)的導(dǎo)航菜單中的Getting Maven菜單選擇下載。它將帶你進(jìn)入一個(gè)讓你選擇Windows 安裝包、zip文件、tar‘d.bzip文件或者tar‘d.gzip文件。下載適合你平臺(tái)的分類。 我該如何做? 從Apache Software Foundation(ASF)下載Maven。進(jìn)入http://maven./從左側(cè)的導(dǎo)航菜單中的Getting Maven菜單選擇下載。它將帶你進(jìn)入一個(gè)讓你選擇Windows 安裝包、zip文件、tar‘d.bzip文件或者tar‘d.gzip文件。下載適合你平臺(tái)的分類。 綁定。請(qǐng)參考第6章并且附錄A有安裝Maven所需插件的全部 列表以及詳細(xì)說(shuō)明。 在Microsoft Windows平臺(tái),下載Windows安裝包(maven-1.0.2.exe),跟隨自動(dòng)安裝過(guò)程中的提示。在使用Maven Windows 安裝器進(jìn)行安裝后,你應(yīng)該定義一個(gè)用戶環(huán)境變量,MAVEN_HOME,指向你本地的Maven安裝。你此時(shí)需要進(jìn)入控制面版→系統(tǒng)→高級(jí)選擇環(huán)境變量按鈕,添加%MAVEN_HOME%\bin到你的PATH環(huán)境變量。進(jìn)入命令提示行運(yùn)行cmd.exe,如果Maven安裝成功,你將能夠看到命令行有下面的輸出: C:\dev\mavenbook\code>maven -v __ __ | \/ |__ _Apache__ ___ | |\/| / _` \ V / -_) ‘ \ ~ intelligent projects ~ |_| |_\__,_|\_/\___|_||_| v. 1.0.2 如果你愿意安裝Maven到一個(gè)除了C:\Program Files\Apache Software Foundation\Maven 1.0.2的目錄,你也可以下載Maven1.0.2.zip文件,解壓縮到任何目錄。設(shè)置MAVEN_HOME指 向到Maven解壓縮的目錄,并且添加%MAVEN_HOME%\Bin到你的PATH環(huán)境變量。 在Unix平臺(tái),下載tar‘d.zip文件(Maven-1.0.2.tar.gz)并接壓縮tar xvzf maven-1.0.2.tar.gz到你選擇的目錄。本試驗(yàn)假設(shè)你解壓Maven到/usr/local/maven-1.0.2目錄下。你此時(shí)需要設(shè)置兩個(gè)環(huán)境變量,MAVEN_HOME和PATH。下面的命令為這兩個(gè)變量設(shè)置適當(dāng)?shù)闹担?BR>[tobrien@mavenbook tobrien]$ export MAVEN_HOME=/usr/local/maven-1.0.2 [tobrien@mavenbook tobrien]$ export PATH=${PATH}:${MAVEN_HOME}/bin 如果Maven被成功安裝到你的機(jī)器,你能夠看到與Windows系統(tǒng)同樣的輸出。恭喜!你已經(jīng)成安裝了Maven。 Windows下的c:\apps。你可以根據(jù)個(gè)人喜好安裝Maven。 剛剛發(fā)生了什么? 你剛剛安裝了Maven1.0.2并且配置了一些環(huán)境變量。是的!一旦你對(duì)MAVEN_HOME進(jìn)行了有效的設(shè)置或是maven.bat或maven.sh已經(jīng)存在,你已經(jīng)能夠完成Developer‘s Notebook本次的實(shí)驗(yàn)。 關(guān)于.... ..Maven 2? 是時(shí)機(jī)提及Maven 2(有時(shí)也被稱為“m2”)。Maven 2完成了對(duì)Maven 1的重寫(xiě)。重寫(xiě)的首要目的是要提供了強(qiáng)大的Jave構(gòu)建和包含API的項(xiàng)目,允許Maven被植入任何地方,尤其是高級(jí)別的產(chǎn)品如IDEs、質(zhì)量工具、報(bào)告工具等這些。Maven 2構(gòu)建生命周期的概念正式話,其比Maven更易擴(kuò)展。 Maven 1和Maven 2有許多共同點(diǎn),但它們還有幾個(gè)主要的不同之處。在書(shū)中的各個(gè)部分我們盡可能提示你所希望了解的那些不同之處。更多關(guān)于Maven 2的信息,請(qǐng)轉(zhuǎn)到http://maven./下載Maven 2的體驗(yàn)版本,并加入Maven用戶或開(kāi)發(fā)者郵件列表。如果你聽(tīng)過(guò)Continuous Integration,你可能也想看一看命名為Continuum的Maven子項(xiàng)目,地址在http://maven./continuum。 開(kāi)始一個(gè)新的項(xiàng)目 創(chuàng)建新項(xiàng)目的爭(zhēng)論一部分在于有很大部分的工作努力被用到在“發(fā)展基礎(chǔ)設(shè)施”上—自動(dòng)構(gòu)建、單元測(cè)試、文檔、項(xiàng)目報(bào)告等。使用Maven你可以加速這個(gè)過(guò)程,生成項(xiàng)目的框架使其作為新應(yīng)用的種子。 我該如何做? Maven擁有一個(gè)應(yīng)用程序生成插件(Genapp)你能通過(guò)其創(chuàng)建一個(gè)新項(xiàng)目。首先創(chuàng)建一個(gè)空的目錄c:\dev\mavenbook\code\genapp\test-application這將成為應(yīng)用程序生成后的處所。通過(guò)執(zhí)行g(shù)enapp這個(gè)目標(biāo)來(lái)運(yùn)行Genapp插件,選擇默認(rèn)的模版并且提供一些你的新項(xiàng)目的相關(guān)信息。 C:\dev\mavenbook\code\genapp\test-application>maven genapp __ __ 本插件會(huì)要求用戶一些輸入,從這個(gè)輸出內(nèi)容你可以看到你使用了默認(rèn)的(defalut)應(yīng)用程序模板,并且你提供了新項(xiàng)目的應(yīng)用程序ID、name,和包名。默認(rèn)的(default)應(yīng)用程序模板創(chuàng)建了一個(gè)單獨(dú)的類,mdn.testapp.app,和一個(gè)靜態(tài)main函數(shù)和兩個(gè)JUnit測(cè)試。 Maven的應(yīng)用程序生成插件生成了下面的目錄和文件: test-application/ 所有Maven項(xiàng)目有一個(gè)參考了項(xiàng)目對(duì)象模型(POM)的標(biāo)準(zhǔn)目錄結(jié)構(gòu), (as described shortly)。如果你有一些現(xiàn)存的類你想添加到一個(gè)項(xiàng)目,添加它們到src/java,如果你有一些單元測(cè)試將它們添加到src/test。如果這些已有的類和單元測(cè)試依賴一些外部的苦,你將在隨后的章節(jié)看到如何添加一個(gè)附屬。xdos目錄包含了格式為XDoc的項(xiàng)目文檔。 的布局。在Maven項(xiàng)目中src/java和src/test不再出現(xiàn) 在固有的源代碼和單元測(cè)試位置。取而代之的是你可 以使用src/main/java和src/test/java。為了改變這些, 修改你項(xiàng)目的xml文件,改變src/java的引用為src/main- /java,src/test的引用為src/test/java。更多的信息, 請(qǐng)參見(jiàn)“Maven Conventions”,地址在 http://maven./-reference/conventions.html。 project.xml是項(xiàng)目的描述符;它是一個(gè)內(nèi)容為POM的XML文件。讓我們看看這個(gè)project.xml的拷貝,其已經(jīng)定義了這個(gè)項(xiàng)目: <project> 該文件告訴Maven有關(guān)你項(xiàng)目的全部。build元素定位應(yīng)用程序原碼,單元測(cè)試和資源文件包的位置。name, artifactId, currentVersion, inceptionYear, description。 shortDescription標(biāo)識(shí)該項(xiàng)目并且提供了該項(xiàng)目的信息被用作完成品的名字來(lái)創(chuàng)建項(xiàng)目。 artifactId的位置。該id元素已經(jīng)不被贊成使用, 你可以用artifactId替代。 resources元素被用于JAR插件拷貝資源到JAR生成物。在該元素你指定一批資源到資源庫(kù)。本例中,自src/conf的資源將被復(fù)制到classpath的根目錄。換言之,app.properties資源將被復(fù)制到所生成的JAR生成物的根目錄。如果你想所有位于src/conf的*.properties資源和*.xml資源在mdn.testapp包中生成的JAR有效,你可以按照以下來(lái)指定targetPath: <resource> project.properties讓你能夠定制Maven及其插件在本項(xiàng)目中的行為。你將在看過(guò)本書(shū)之后使用該文件定制所生成web站點(diǎn)的品質(zhì)和JAR文件的內(nèi)容。 提示 門指導(dǎo),參見(jiàn)BrettPorter的“The Ten Minute Test”, 地址在http://maven./start/ten-minute- test.html。 關(guān)于... ... Maven在有關(guān)協(xié)作項(xiàng)目中跟蹤信息的能力? 為簡(jiǎn)化本例,我們從project.xml文件中去掉了一些初期顯示的描 述項(xiàng)目郵件列表、知識(shí)庫(kù)、開(kāi)發(fā)者和web站點(diǎn)的元素。第4、5章深 入更多有關(guān)使用Maven發(fā)布web站點(diǎn)和在現(xiàn)有源碼庫(kù)中工作的細(xì)節(jié)。 在代理服務(wù)器下使用Maven Maven依賴于Internet連接,其通過(guò)HTTP下載相關(guān)的插件。如果你工作在公共環(huán)境,你可能需要配置Maven來(lái)與工作代理服務(wù)器系統(tǒng)。 我該如何做? 你可能需要設(shè)置你項(xiàng)目中project.properties文件的一些屬性。project.properties文件允許你通過(guò)設(shè)置命名的屬性來(lái)定制Maven的行為。配置代理服務(wù)器,放置下面的project.properties到與你項(xiàng)目中project.xml文件同樣的位置: maven.proxy.host = proxy.company.com maven.proxy.port = 80 并且,如果你需要連接到一個(gè)代理服務(wù)器必須有NTLM的授 權(quán),設(shè)置以下屬性: maven.proxy.ntlm.username = tobrien maven.proxy.ntlm.password = myp@ssw0rd ~/build.properties或%USERPROFILE%\build.properties 文件。現(xiàn)在,如果你需要完成本試驗(yàn),在 project.properties里定義這些屬性。 編譯和測(cè)試一個(gè)項(xiàng)目 你擁有了一個(gè)包含一個(gè)類文件和單元測(cè)試文件的項(xiàng)目。下 面,讓我們夠見(jiàn)這個(gè)項(xiàng)目和運(yùn)行應(yīng)用程序類吧。 我該如果做? 通過(guò)執(zhí)行jar:jar goal來(lái)創(chuàng)建一個(gè)包含應(yīng)用程序的類的jar 文件。JAR插件定義了一個(gè)速記目標(biāo)命名為jar其依賴之前的jar:jar goal。執(zhí)行任何一個(gè)目標(biāo)將得到相同的結(jié)果。所有的插件都定義了一條這樣的捷徑;例如,測(cè)試目標(biāo)執(zhí)行的是Test插件里的test:test goal。執(zhí)行jar goal和maven jar: C:\dev\mavenbook\code\genapp\test-application>maven jar Maven創(chuàng)建一個(gè)target(目標(biāo))目錄來(lái)保存中間文件和JAR文件。在JAR首次被建立后,按照下面執(zhí)行App類。 C:\dev\mavenbook\code\genapp\test-application> java ^ 如果你想重復(fù)此項(xiàng)工作,運(yùn)行maven clean來(lái)移除target目錄重新構(gòu)建。 剛剛發(fā)生了什么? 當(dāng)你運(yùn)行jar目標(biāo)時(shí),Maven使用JAR插件來(lái)創(chuàng)建了一個(gè)JAR生成物。首先,Maven找到一系列的目標(biāo)以便能夠創(chuàng)建這個(gè)應(yīng)用程序的JAR文件;JAR插件有一個(gè)其它目標(biāo)所依賴于目標(biāo)的jar:jar goal,反過(guò)來(lái),它也依賴于其他的目標(biāo)。Maven找出下列需要的目標(biāo)來(lái)執(zhí)行:java:prepare-filesystem,java:compile,java:jarresources, test:prepare-filesystem,test:test-resources,test:compile,and test:test。 Maven查看其需要執(zhí)行目標(biāo)中的Test插件來(lái)執(zhí)行單元測(cè)試,并且檢查本地Maven庫(kù)中的JUnit JAR文件。因?yàn)槟氵€沒(méi)有使用過(guò)Maven,所以它將從位于http://www./ maven/的Maven默認(rèn)庫(kù)中下載junit-3.8.1.jar。你將在本章后學(xué)習(xí)到有關(guān)Maven本地庫(kù)和Maven強(qiáng)大的相關(guān)管理能力的內(nèi)容。 與項(xiàng)目對(duì)象模型一同工作 Project Object Model(POM)是Maven的重要部分,你將與其一同工作貫穿本書(shū)。 我該如何做? POM同樣涉及到項(xiàng)目的描述。project.xml描述了項(xiàng)目的源代碼、開(kāi)發(fā)者、源控制,許可和標(biāo)示信息譬如項(xiàng)目名稱和發(fā)起組織。Maven打破了過(guò)去傳統(tǒng)的構(gòu)建系統(tǒng);取而代之的是為每個(gè)構(gòu)建提供了外在說(shuō)明,Maven使用聲名的方法管理構(gòu)建。換句話說(shuō),你不用過(guò)多的告訴Maven做什么,Maven知道去查找基于project.xml中的內(nèi)容。另一方面,Ant以命令方式進(jìn)行項(xiàng)目構(gòu)建;你最終要告訴Ant編譯這個(gè)文件,建立這個(gè)目錄,綁定這些文件到WAR等等。Maven維護(hù)一個(gè)插件的分類來(lái)與標(biāo)準(zhǔn)的POM—一個(gè)結(jié)構(gòu)聲明、標(biāo)示和內(nèi)容工作。 如果你看了上次練習(xí)所生成的project.xml文件,你將注意到許多元素都在上次討論中被忽略。下面的XML列出了POM中頂級(jí)的元素,(in the order in which they are expected: ): <project> 本章探究更多以上XML列出的元素,包括contributors,developers,dependencies,reports和repository。本章的式樣將提供這些細(xì)節(jié),但你應(yīng)該使用上面XML的摘錄來(lái)以適當(dāng)?shù)捻樞蚍胖眠@些元素到你的project.xml中。 列出有效的Goals 當(dāng)你使用Maven時(shí),你將執(zhí)行目標(biāo)。Maven插件是一組相關(guān)的插件。例如,要為一個(gè)項(xiàng)目創(chuàng)建JAR文件,你將如下所示執(zhí)行JAR插件中的jar:jar goal。 C:\dev\mavenbook\code\genapp> maven jar:jar 冒號(hào)之前的jar分類這個(gè)目標(biāo)屬于JAR插件。查看全部的JAR插件列表,鍵入以下命令: C:\dev\mavenbook\code\genapp> maven -P jar __ __ | \/ |__ _Apache__ ___ | |\/| / _` \ V / -_) ‘ \ ~ intelligent projects ~ |_| |_\__,_|\_/\___|_||_| v. 1.0.2 Goals in jar ============ [jar] Create the deliverable jar file. deploy ......................... Deploy a jar to the remote repository deploy-snapshot ................ Deploy a snapshot jar to the remote repository install ........................ Install the jar in the local repository install-snapshot ............... Install a snapshot jar in the local repository jar ............................ Create the deliverable jar file. snapshot ....................... Create a snapshot jar, ie ‘ id-YYYYMMDD.hhmmss.jar‘ Plugin for creating JAR files. Requires Maven 1.0 RC2. 如果你需要查看每個(gè)有效的插件和目標(biāo),輸入下面內(nèi)容: C:\dev\mavenbook\code\genapp\test-application> maven -g | more 全部的插件可能使人有些畏懼,Maven有關(guān)于一切的插件,從生成項(xiàng)目文件到IDEs到生成WAR文件以及開(kāi)始和停止應(yīng)用服務(wù)器。你將在下面的實(shí)驗(yàn)中學(xué)習(xí)到一些更有用的插件。 生成調(diào)試信息 現(xiàn)在,你可能已經(jīng)注意到Maven執(zhí)行了許多繁重的工作。如果你使用Ant,你可能已經(jīng)開(kāi)始編寫(xiě)Ant的build.xml文件并且添加編譯.jar任務(wù)和單元測(cè)試。Maven隱藏了許多復(fù)雜性,但當(dāng)調(diào)試問(wèn)題時(shí),它也能夠查看“幕后”。這個(gè)能力運(yùn)行于Maven的調(diào)試模式并且這個(gè)工具打印輸出每個(gè)構(gòu)建的細(xì)節(jié)重要的是你可以根據(jù)需要來(lái)驗(yàn)證構(gòu)建是否正確執(zhí)行。 我該如何做? 本次實(shí)驗(yàn),參考上一個(gè)測(cè)試應(yīng)用程序。當(dāng)你運(yùn)行maven test,你將收到如下信息: java:compile: 在執(zhí)行java:comile或java:jar-resources目標(biāo)時(shí)到底發(fā)生了什么?執(zhí)行構(gòu)建項(xiàng)目中運(yùn)行maven -x test將顯示全部目標(biāo)的調(diào)試信息。讓我們來(lái)是一下,把注意力放在最早的第三個(gè)目標(biāo)上。運(yùn)行maven -x test生成下面的輸出: [...] java:compile的打印輸出任務(wù)可能看起來(lái)很熟悉。它是Ant的echo和javac任務(wù)的輸出。Maven常常使用Ant的進(jìn)程來(lái)執(zhí)行常用操作如:拷貝、刪除、編譯和創(chuàng)建JAR文件。 剛剛發(fā)生了什么? 這兩個(gè)目標(biāo)執(zhí)行的都是非常簡(jiǎn)單的調(diào)試輸出。java:compile目標(biāo)簡(jiǎn)單的掃描源目錄中java源碼中較新的相關(guān)類文件。java:jar-resources目標(biāo)尋找資源中包含的JAR文件。更復(fù)雜的如test:test將產(chǎn)生有關(guān)虛擬機(jī)和類加載器的調(diào)試信息。 當(dāng)Maven有問(wèn)題或某個(gè)目標(biāo)拋出異常,Maven將簡(jiǎn)單打印較少的錯(cuò)誤信息來(lái)告訴你有錯(cuò)誤發(fā)生。如果你需要等多信息,并且看到堆棧跟蹤,添加-e標(biāo)志到命令行。與-e標(biāo)志一起,Maven將打印完整的堆棧信息當(dāng)其遇到錯(cuò)誤時(shí)。 添加依賴關(guān)系 你有了一個(gè)擁有單個(gè)類文件并且已經(jīng)成功編譯執(zhí)行的項(xiàng)目。下面,你將添加一個(gè)依賴關(guān)系到項(xiàng)目描述器并且開(kāi)始使用Maven管理項(xiàng)目依賴關(guān)系。本次實(shí)驗(yàn)的目的是,假設(shè)你需要工作在Spring框架中。添加Spring框架-spring-core-1.1.4.jar和spring-web-1.1.4.jar的依賴關(guān)系。 我該如何做? 首先,你需要根據(jù)需要定位Maven默認(rèn)中心源碼庫(kù)中的JAR文件。在http://www./maven/提供了這些。在Web瀏覽器中加載這個(gè)URL你將看到一系列的目錄;我們關(guān)心的是springframework的目錄,springframework下子目錄的結(jié)構(gòu)如下所示: http://www./maven /springframework /jars spring-core-1.1.4.jar spring-dao-1.1.4.jar spring-web-1.1.4.jar 依照人造物,你使用dependency—groupId, artifactId和version三個(gè)元素。你能夠添加兩個(gè)依賴關(guān)系的完成品以替代test-application/project.xml中的dependencies元素如下所示: <dependencies> 現(xiàn)在,運(yùn)行jar目標(biāo)并且看看Maven的輸出吧;它將包含下面如下這些。 Attempting to download spring-core-1.1.4.jar. 圖1-1顯示了jar目標(biāo)觸發(fā)的一系列事件: 1.Maven查看POM,依據(jù)project.xml的定義,看到在springframework組中的兩個(gè)人造物的依賴關(guān)系。它將載你本地Maven的資源庫(kù)中檢查spring-core-1.1.4.jar和spring-web-1.1.4.jar。 2.當(dāng)Maven找不到這些文件,它將到http://www./maven/springframework/jars/尋找JAR文件。這些JAR文件會(huì)被下載并放置于你本地Maven的資源庫(kù)中。它們也被添加到你項(xiàng)目的classpath中。下次在你的項(xiàng)目查詢這些文件時(shí),Maven將在你本地的資源庫(kù)中提供它們。 ![]() 圖1-1.Maven本地和遠(yuǎn)程資源庫(kù)為test application項(xiàng)目提供的spring Jar。 剛剛發(fā)生了什么? Maven為你節(jié)省了相當(dāng)?shù)臅r(shí)間和不必要的麻煩。Maven到來(lái)之前,依賴關(guān)系常常被捆綁到一個(gè)項(xiàng)目的目錄或者項(xiàng)目應(yīng)該指向到添加正確的JAR到你的classpath。使用Maven管理依賴關(guān)系顯然有著明顯的優(yōu)勢(shì);作為初學(xué)者,如果你的項(xiàng)目依賴30個(gè)外部的JAR文件,這就不需要在你的資源庫(kù)中存儲(chǔ)成兆的JAR文件。這意味著當(dāng)你在項(xiàng)目的外部檢查資源控制的時(shí)候更少的存儲(chǔ)空間和更快的下載時(shí)間。另外,如果你有多個(gè)項(xiàng)目依賴相同的外部依賴,Maven僅需要下載一次依賴關(guān)系,并且每個(gè)項(xiàng)目引用一個(gè)單獨(dú)的副本在你本地的資源庫(kù)中。當(dāng)依賴關(guān)系能夠從Maven資源庫(kù)遠(yuǎn)程下載的時(shí)候,沒(méi)有強(qiáng)制的原因讓你存儲(chǔ)你項(xiàng)目的依賴關(guān)系的版本。 當(dāng)Maven下載依賴關(guān)系,其在你本地的機(jī)器上從遠(yuǎn)程的Maven資源庫(kù)拷貝一個(gè)文件到你本地的Maven資源庫(kù)。Maven如何定位依賴關(guān)系的?它使用project.xml中dependency元素的信息,如圖1-2所示。 ![]() 圖1-2.POM和Maven資源庫(kù)的映射。 指定的groupId告訴Maven查看特定的目錄-springframework。指定type告訴Maven查找特定的子目錄如jar和war(注意s是Maven附加到type元素上的);本例中,type是被忽略的,JAR類型是默認(rèn)類型。當(dāng)你指定了artifactId,你正告訴Maven哪個(gè)文件將從jar目錄下載。頂級(jí)目錄表現(xiàn)為組標(biāo)示符,JAR文件名的第一部分表現(xiàn)為artifact標(biāo)示符,文件名最后的部分,包括擴(kuò)展名表現(xiàn)為version標(biāo)示符。Maven使用下面的公式來(lái)決定一個(gè)來(lái)自于資源庫(kù)中的依賴關(guān)系。[REPO_ROOT]參考你遠(yuǎn)程的資源庫(kù): [REPO_ROOT]/<groupId>/<type>s/<artifactId>-<currentVersion>.<type> 結(jié)構(gòu)。作為springframework的替代,groupId被提議 的結(jié)構(gòu)為org.springframework。另外,每個(gè)版本將有 一個(gè)分隔目錄用以增加Maven資源庫(kù)的效率。更多有關(guān) 改變的提交建議,參見(jiàn)http://docs./display/ MAVEN/Repository+Layout+-+Final。 一個(gè)本地的資源庫(kù)來(lái)處理依賴關(guān)系。在Unix機(jī)器上,你的Maven資源庫(kù)能在~/.maven/repository目錄找到,在Windows機(jī)器上,你的Maven的資源庫(kù)在你的%USERPROFILE%目錄。如果你看一看本地Maven的資源庫(kù),你將會(huì)注意到它正包含一個(gè)springframework的目錄。%USERPROFILE%\.maven\repository\springframework\jars目錄包含spring-core依賴關(guān)系的兩個(gè):spring-core-1.1.4.jar文件和spring-core-1.1.4.jar.md5文件,其包含MD5文件用于驗(yàn)證sprint-core JAR文件的完整性。Maven 1當(dāng)前并沒(méi)有使用MD5來(lái)驗(yàn)證完成品的完整性,但在將來(lái)的版本可能會(huì)用其來(lái)驗(yàn)證完成品的完整性。 ocuments and Settings\vmassol這種目錄。%USERPR- OFILE%被用在Unix的主目錄。(%USERPROFILE% is used in the spirit of the abbreviation for a Unix home directory。) 關(guān)于... ...使用id元素? 如果你工作在現(xiàn)存的Maven項(xiàng)目,你可能有依賴關(guān)系使用id元素。下面的dependencies元素示范了使用單獨(dú)id元素來(lái)附加Jakarta Commons Math的1.0版本: <dependencies> 單獨(dú)使用id元素工作僅在groupId和artifactId匹配時(shí),如果你瀏覽Maven資源庫(kù),你將看到下面的目錄結(jié)構(gòu): /commons-math /jars commons-math-1.0.jar commons-math-1.1.jar 使用id元素工作,單獨(dú)的id標(biāo)記已經(jīng)不被贊成使用并在Maven 2中消失。當(dāng)你看到別的Maven項(xiàng)目中使用dependencies的速記符號(hào)時(shí),請(qǐng)嘗試使用groupId和artifactId來(lái)標(biāo)識(shí)你的依賴關(guān)系。 依賴快照 如果你開(kāi)發(fā)的程序依賴的依賴關(guān)系經(jīng)常改變,你可能想將依賴的每個(gè)依賴關(guān)系替代為最近構(gòu)件的硬編碼的版本。在一個(gè)項(xiàng)目依賴的依賴關(guān)系還處在beta的版本,或你正開(kāi)發(fā)一系列項(xiàng)目依賴的Maven項(xiàng)目時(shí)時(shí)特別有用,這將在第3章論述。本實(shí)驗(yàn),你將學(xué)習(xí)到如何依靠快照。 我該如何做? 在你的依賴關(guān)系塊兒中指定一個(gè)明確的版本,使用SNAPSHOT關(guān)鍵字作為版本名稱的一部分。每次你執(zhí)行Maven目標(biāo)時(shí),Maven將從遠(yuǎn)程資源庫(kù)中檢查較新的依賴關(guān)系。如果遠(yuǎn)程資源庫(kù)的版本較新Maven將下載其到本地資源庫(kù)。例如:下面的依賴關(guān)系將一直下載spring的新版JAR文件。 <dependency> 剛剛發(fā)生了什么? 當(dāng)你使用SNAPSHOT依賴關(guān)系,你正告訴Maven使用遠(yuǎn)程資源庫(kù)的最新版本。在你使用多項(xiàng)目插件或者當(dāng)你依賴的一個(gè)完成品尚處于開(kāi)發(fā)階段這將得心應(yīng)手。在你工作的團(tuán)隊(duì)僅有較少的開(kāi)發(fā)者組成時(shí),最好也常這么做。你將使用SNAPSHOT依賴關(guān)系當(dāng)你的項(xiàng)目依賴一個(gè)最近的開(kāi)發(fā)或者非正式版本的特別組件。SNAPSHOT依賴關(guān)系應(yīng)該在開(kāi)發(fā)階段被保留,并且,概括說(shuō),你不用改發(fā)布一個(gè)依賴于SNAPSHOT依賴關(guān)系的項(xiàng)目。 執(zhí)行脫機(jī)構(gòu)建 如果你需要在一個(gè)離線的情況下使用Maven,你可能需要知道如何確使Maven不檢查最新的SNAPSHOT依賴關(guān)系。本實(shí)驗(yàn)將向你展示如何用Maven執(zhí)行脫機(jī)構(gòu)建。 我該如何做? 這個(gè)方法很簡(jiǎn)單:僅僅使用-o命令行選項(xiàng)。例如,如果你沒(méi)有網(wǎng)絡(luò)連接,但又想執(zhí)行測(cè)試目標(biāo),運(yùn)行Maven -o test。Maven將執(zhí)行這個(gè)test目標(biāo)而不檢查依賴關(guān)系。如果你的項(xiàng)目沒(méi)有依賴SNAPSHOT構(gòu)建,你也可以斷看你的環(huán)境來(lái)添加-o標(biāo)志。如果你依賴SNAPSHOT構(gòu)建,你將需要使用-o標(biāo)志,Maven將在每次執(zhí)行目標(biāo)時(shí)嘗試檢查最新的SNAPSHOT。在這種情況下不使用-o標(biāo)志本項(xiàng)目將不會(huì)構(gòu)建成功。 關(guān)于... ... 執(zhí)行離線構(gòu)建如果你不想下載任何完成品? 當(dāng)然,這將不會(huì)工作。離線構(gòu)建的工作,你必須已經(jīng)有必需的依賴關(guān)系在你本地的資源庫(kù)。項(xiàng)目最簡(jiǎn)單的獲得Maven下載依賴 關(guān)系的方法是在每個(gè)Maven項(xiàng)目實(shí)例簡(jiǎn)單的運(yùn)行“noop”目標(biāo),build:start。這個(gè)目標(biāo)執(zhí)行之前任何其它的目標(biāo)并不執(zhí)行任何動(dòng)作。如果你運(yùn)行build:start,Maven將從project.xml獲得獲取任何依賴關(guān)系。 使用Maven控制臺(tái) 如果你再三的從命令行運(yùn)行Maven,你可以通過(guò)Maven控制臺(tái)來(lái)節(jié)省時(shí)間。Maven控制臺(tái)提供一個(gè)“外殼”,在這你可以鍵入目標(biāo)的名稱來(lái)執(zhí)行Maven。通過(guò)使用Maven可以避免每次載你想運(yùn)行一個(gè)Maven目標(biāo)時(shí)Java Virtual Machine(JVM)啟動(dòng)的等待。 我該如何做? Maven Console是一個(gè)插件,你可以通過(guò)鍵入maven console在命令提示符。這將產(chǎn)生下面的輸出: __ __ 目前,你可以在命令行執(zhí)行任何你能執(zhí)行的目標(biāo)。開(kāi)始是一下;鍵入 java:compile。Maven將執(zhí)行 java:compile目標(biāo)并返回提示符其它的目標(biāo)。在一個(gè)序列中運(yùn)行兩個(gè)目標(biāo),你可以在提示符處輸入它們,通過(guò)“空格”-例如, clean test。眾所周知作為“goal chaining”這是你想通過(guò)Maven獲得指定一系列目標(biāo)的方法。退出Maven Console,鍵入quit,查看有效目標(biāo)列表,鍵入list。 剛剛發(fā)生了什么? 在Maven Console下Maven執(zhí)行java:compile目標(biāo)非常之快,不信么?當(dāng)你使用Maven Console時(shí)你所執(zhí)行的目標(biāo)是在一個(gè)現(xiàn)成的JVM下。當(dāng)你從命令行運(yùn)行Maven時(shí),你每次運(yùn)行一個(gè)目標(biāo)都不得不等待JVM的啟動(dòng)。如果你不確信其對(duì)性能的提升,自己試試看。在命令行下運(yùn)行java:complie 10次,再在Maven Console下同樣運(yùn)行java:compile 10次。注意時(shí)間的差別,你將發(fā)現(xiàn)JVM啟動(dòng)的時(shí)間開(kāi)始增加。如果你找到你自己常用的Maven目標(biāo),Maven Console將通過(guò)啟動(dòng)JVM一次為來(lái)節(jié)省時(shí)間。 生成Eclipse項(xiàng)目 我打賭你一定想在IDE下工作。Maven通過(guò)插件來(lái)與Eclipse,InelliJ,IDEA,JBuilder,JDeveloper以及Emacs集成。Maven很好的與全部這些工作集成,本實(shí)驗(yàn)關(guān)注其在Eclipse上的集成,一個(gè)開(kāi)源的IDE。 我該如何做? 這個(gè)過(guò)程很簡(jiǎn)單;僅僅執(zhí)行eclipse插件: C:\dev\mavenbook\code\genapp\test-application> maven eclipse Maven創(chuàng)建兩個(gè)文件以識(shí)別Eclipse的項(xiàng)目:.project和.classpath。在Eclipse中,你就可以通過(guò)下面的步驟導(dǎo)入這個(gè)工程了: 1.啟動(dòng)Eclipse。 2.從菜單欄選擇File→Import... 3.選擇現(xiàn)存項(xiàng)目放入Workspace并單擊Next按鈕。 4.在Import對(duì)話框選擇C:\dev\mavenbook\code\genapp\test-application目錄,并單擊Finish按鈕。 你稍候?qū)?zhí)行更多步來(lái)指向Eclipse到本地Maven資源庫(kù)。Eclipse使用一個(gè)名叫MAVEN_REPO來(lái)指向到本地Maven資源庫(kù)。你能通過(guò)在命令行執(zhí)行下面的操作設(shè)置MAVEN_REPO來(lái)使用Maven: maven -Dmaven.eclipse.workspace=c:\eclipse\workspace eclipse:add-maven-repo 執(zhí)行這個(gè)目標(biāo)可以設(shè)置位于目錄c:\eclipse\workspace的全局變量MAVEN_REPO。 作為選擇,你可以按照這些步驟手工配置該變量: 1.從菜單欄中選擇Window→打開(kāi)Eclipse Preferences選擇preferences。 2.在樹(shù)型菜單左手邊的Preferences對(duì)話框,選擇Java→Build Path→Classpath變量。 3.單擊New按鈕來(lái)創(chuàng)建一個(gè)新的變量;這可以帶入到新變量對(duì)話框。 4.輸入MAVEN_REPR到Name域。 5.單擊Folder按鈕選擇你本地的Maven資源庫(kù)。 6.單擊OK并重新構(gòu)建你的項(xiàng)目。 你可能需要配置MAVEN_REPO僅一次;該變量是全局的它可以與全部Eclipse項(xiàng)目共享。 關(guān)于... ... JBuilder, JDeveloper, and IntelliJ IDEA? 所有這些IDE有著Eclipse一樣簡(jiǎn)單的插件。為JBuilder 項(xiàng)目生成必需的文件,運(yùn)行mave jbuilder,對(duì)于JDeveloper運(yùn)行mave jdeveloper,為IntelliJ IDEA項(xiàng)目運(yùn)行mave idea。 使用Maven的Eclipse插件 是的,這是一個(gè)你可以使用的高品質(zhì)的Maven插件。它提供了許多有趣的特性,如編輯project.xml文件的能力,支持Maven自定義,Maven資源庫(kù)瀏覽等其他功能。 我該如何做? Mevenide (http://mevenide./mevenide-ui-eclipse/update/index.html) 是一個(gè)Eclipse插件其允許你使用Maven在Eclipse中工作。你能夠按照如下指導(dǎo)從Eclipse更新站點(diǎn)上下載它: 1.啟動(dòng)Eclipse。 2.從菜單中選擇Help→Software Updates→Find and Install。 3.在Install/Update和更新的對(duì)話框中,選擇“Search for new feature to install,”并單擊下一步。 4.在Install對(duì)話框中,單擊New Remote Site。 5.在New Update Site對(duì)話框中,鍵入Mevenide在Name域,其位置在Eclipse Updates站點(diǎn)的URL區(qū)域。Mavenid在Eclipse Update站點(diǎn)中的位置是http://mevenide./release/eclipse/update/site.xml。 6.當(dāng)單詞Mevenide出現(xiàn)在Install對(duì)話框中,選擇兩個(gè)子目標(biāo),Maven和Mevenide并單擊Next。 7.直到Maven和Mevenide被下載和安裝,重起Eclipse。 首先你會(huì)注意到Mevenide標(biāo)注所有project.xml文件為綠色圖標(biāo)。在Project Object Model編輯器中打開(kāi)project.xml,右擊任何project.xml文件并選擇Open With...→Project Object Model編輯器。該編輯器如下圖1-3所顯示。 ![]() Mevenide在Eclipse中提供了一系列tab讓你編輯不同的project.xml片斷。如果你學(xué)到了很多的project.xml語(yǔ)法,就知道Mevenide的Project Object Model編輯器提供了GUI接口來(lái)維護(hù)這個(gè)XML文件。如果你仍然希望直接編輯這個(gè)XML,你能夠選擇最右邊的Source tab。 除POM編輯器之外,Mevenide也為你提供了Eclipse以外執(zhí)行Maven目標(biāo)的方法。要在Eclipse中執(zhí)行一個(gè)Maven目標(biāo),選擇Run→External Tools…→External Tools…你就能夠創(chuàng)建一個(gè)Maven的配置并從全部有效的目標(biāo)中選擇你希望執(zhí)行的目標(biāo)。當(dāng)目標(biāo)在Eclipse中被執(zhí)行,通過(guò)Console視圖有效得顯示它的輸出。 Mevenide提供的另一個(gè)有趣的功能是Repository Browser。這個(gè)工具允許你檢查許多遠(yuǎn)程資源庫(kù)的內(nèi)容。打開(kāi)Repository Browser,選擇Window→Show View…→Other…,此時(shí)在Maven目錄的結(jié)果對(duì)話框中選擇Repository Browser。Repository Browser簡(jiǎn)單的以樹(shù)型顯示了資源庫(kù)中的全部依賴關(guān)系(dependency),如圖1-4所示,其顯示了HTTPClient和abbot group的依賴關(guān)系。 ![]() 圖1-4.Mevenide Repository Browser view 如果你想搜索資源庫(kù)中完成品的細(xì)節(jié),Mevenide同樣提供了資源庫(kù)搜索功能。這將是得心應(yīng)手的因?yàn)闉榱四硞€(gè)依賴關(guān)系的細(xì)節(jié)搜索http://www./maven是非常惱人的。檢查Mevenide;它將為你節(jié)省時(shí)間。 關(guān)于... ... NetBeans和JBuilder? Mevenide當(dāng)前的版本支持這兩個(gè)IDE的表現(xiàn)。更多詳情參見(jiàn)http://mevenide./。 ... IntelliJ? IDEA插件維持了一些目標(biāo)如同你在Eclipse中使用的目標(biāo)。更多詳情參見(jiàn)位于http://maven./reference/plugins/idea/goals.html的IDEA插件的聯(lián)機(jī)文檔。 生成Ant構(gòu)建文件 當(dāng)你想用Apache的Ant構(gòu)建的某些時(shí)候??赡苣愕捻?xiàng)目使用自動(dòng)化處理正依賴于Ant,又可能你有一些團(tuán)隊(duì)成員沒(méi)有完成到Maven的轉(zhuǎn)換并且他們希望繼續(xù)使用Ant。目前為止許多IDE提供通過(guò)Ant構(gòu)建項(xiàng)目文件,你能夠使用Maven生成build.xml文件這樣你的項(xiàng)目就能夠被Apache的Ant所構(gòu)建。 我該如何做? 運(yùn)行Ant插件。運(yùn)行maven ant將創(chuàng)建build.xml文件其包含到聚合的依賴關(guān)系的目標(biāo),build和test你的應(yīng)用程序。看看運(yùn)行默認(rèn)的jar目標(biāo)的輸出: C:\dev\mavenbook\code\genapp\test-application>ant 你可能注意到這里存在一個(gè)問(wèn)題,這是個(gè)說(shuō)明性的問(wèn)題。Apache Ant沒(méi)有自動(dòng)管理依賴關(guān)系用于可選的Ant任務(wù)。如果你向運(yùn)行JUnit單元測(cè)試,你就需要從本地Maven資源庫(kù)拷貝junit-3.8.1.jar到${ANT_HOME}/lib下。這個(gè)構(gòu)建文件包含了一個(gè)get-deps的目標(biāo)其從位于http://www./maven的遠(yuǎn)程Maven資源庫(kù)為所有的項(xiàng)目依賴關(guān)系執(zhí)行Ant獲得任務(wù)到gran。 關(guān)于... ... 試圖離開(kāi)Ant?Maven是Ant的替代者么? 是或不是。Ant并不“差”,并且多數(shù)工具仍然同Ant工作。沒(méi)有理由不提供與Apache Ant的交互,一旦你學(xué)到更多關(guān)于第2章的Jelly,你將發(fā)現(xiàn)Ant工作在Maven里應(yīng)用的更廣泛。許多項(xiàng)目使用持續(xù)集成的系統(tǒng)如其期望的Ant構(gòu)建文件。運(yùn)行maven ant provides很容易找到繼續(xù)支持這些工具。 移植一個(gè)Ant項(xiàng)目到Maven 一定數(shù)量的項(xiàng)目使用Ant作為構(gòu)建系統(tǒng),你可能打算移植到Maven上來(lái)。 我該如何做? 從頭開(kāi)始。創(chuàng)建一個(gè)默認(rèn)的Maven模版,并且移動(dòng)你的代碼到適當(dāng)?shù)奈恢?。不要設(shè)法使Maven適合你項(xiàng)目的目錄和構(gòu)建位置。Maven強(qiáng)過(guò)一個(gè)構(gòu)建工具;它是一個(gè)標(biāo)準(zhǔn)方式考慮到項(xiàng)目的布局和管理。如果你試圖使Maven適應(yīng)你項(xiàng)目的想法來(lái)構(gòu)建,你將結(jié)束使用Maven。如果你的項(xiàng)目由一個(gè)復(fù)雜的buil.xml文件組成其產(chǎn)生許多不同的交付結(jié)果,你將需要“組件化”你的項(xiàng)目請(qǐng)跟隨第3章的多項(xiàng)目描述。你可能要開(kāi)始移動(dòng)你項(xiàng)目的目錄結(jié)構(gòu)轉(zhuǎn)向標(biāo)準(zhǔn)的Maven項(xiàng)目目錄結(jié)構(gòu)。換而言之,不要試圖生搬硬套你的項(xiàng)目到Maven。 如果你對(duì)遷移到Ant感興趣,但你沒(méi)有時(shí)間停止開(kāi)發(fā),你可以使用Maven調(diào)用你現(xiàn)存的Ant目標(biāo)。如果你這么做,你將錯(cuò)失使用Maven的大部分益處,但僅僅是可能。更多信息參見(jiàn)位于http://maven./using/migrating.html的“Migrating from Ant”。 關(guān)于... ... 靈活性和選擇? 靈活性和選擇是個(gè)比較老的問(wèn)題了。我們保證Maven將改變你構(gòu)建和維護(hù)項(xiàng)目的方式方法,重要的是應(yīng)該有意的使用Maven。Ant和Maven間的差別是什么呢?Ant提供塊構(gòu)建的可重用任務(wù)如copy,move,delete和junit,Maven提供了可重用的任務(wù)構(gòu)建。Maven是一個(gè)“構(gòu)建容器”,其允許你在一系列項(xiàng)目上重用任務(wù)構(gòu)建。以單元測(cè)試為例,使用Ant,你將通過(guò)在你項(xiàng)目的build.xml文件里包含下面來(lái)執(zhí)行JUnit測(cè)試。 <junit printsummary="yes" haltonfailure="yes"> 該片斷省略的不同路經(jīng)和變量的定義如build.tests和java.class.path,同時(shí)也省略的Ant目標(biāo)的定義。另外一些單元測(cè)試類,你也需要定義一個(gè)標(biāo)以目標(biāo)在源文件和單元測(cè)試中,并且一個(gè)目標(biāo)對(duì)應(yīng)創(chuàng)建一個(gè)目錄。每個(gè)項(xiàng)目需要定義同樣的邏輯以執(zhí)行單元測(cè)試。最后,大多數(shù)的Ant項(xiàng)目使用了相似的目錄結(jié)構(gòu),并且構(gòu)建邏輯重用是通過(guò)拷貝和粘貼到build.xml文件。時(shí)間推移,項(xiàng)目將變的更復(fù)雜和用戶化,目錄標(biāo)準(zhǔn)增加并且每個(gè)項(xiàng)目趨于不同的編譯、測(cè)試方法和包;久而久之,build.xml變成項(xiàng)目中的一部分了。你定制的Ant構(gòu)建文件越大,越多的(entropy creeps)會(huì)進(jìn)入到你的構(gòu)建工作。Ant作為一個(gè)構(gòu)建工具的能力要少于其作為語(yǔ)言提供構(gòu)特性的API。1.6的Ant,含有了Ant庫(kù)和宏。在完成全局可重用的表現(xiàn)上與Maven相比Ant還有一段很長(zhǎng)的路要走。 利用Maven的Test插件為所有項(xiàng)目定義通用邏輯其需要編譯和執(zhí)行單元測(cè)試。單元測(cè)試插件為編譯和執(zhí)行單元測(cè)試獲得了最好的實(shí)踐,并且它為所有項(xiàng)目達(dá)成了最有效的實(shí)踐。當(dāng)你運(yùn)行maven test,Maven從POM傳遞信息到Test插件,Test插件則依賴于Java插件來(lái)執(zhí)行編譯。在Maven中沒(méi)有一處你明確的告訴構(gòu)建容器如何執(zhí)行JUnit單元測(cè)試。如果你這么做了,在Ant中你將會(huì)面對(duì)同樣的問(wèn)題。正如你不用告訴你的Servlet容器如何解壓WAR文件一樣,你不用告訴Maven如何構(gòu)建你的項(xiàng)目。Maven是一個(gè)構(gòu)建容器。許多人最初被Maven吸引是因?yàn)樗峁┝艘蕾囮P(guān)系管理,但Maven最大的好處是它提供了標(biāo)準(zhǔn)的開(kāi)發(fā)結(jié)構(gòu)來(lái)訪問(wèn)多個(gè)項(xiàng)目。依賴關(guān)系管理僅僅是標(biāo)準(zhǔn)開(kāi)發(fā)結(jié)構(gòu)的一個(gè)簡(jiǎn)單的副產(chǎn)品。 以嘗試讓Maven照管許多構(gòu)建任務(wù)的細(xì)節(jié)。與其花費(fèi)你 重要的時(shí)間來(lái)寫(xiě)構(gòu)建腳本,不如使用Maven插件來(lái)把焦 點(diǎn)放到編寫(xiě)你應(yīng)用程序上來(lái)。 下面的章節(jié)將向你展示如何調(diào)整和定制Maven,但你需要確定你并不要求Maven成為另一個(gè)Ant。很有可能你有一個(gè)巨大的重建于Ant的build.xml文件充滿了Jelly腳本(見(jiàn)第2章)并且的Maven項(xiàng)目和一個(gè)大的maven.xml文件。但如果這么做你則失去了所有Maven的指向。如果你發(fā)想自己包含了很多構(gòu)建相關(guān)的邏輯在你的Maven構(gòu)建,你需要慎重考慮使用Maven。高定制化的Maven構(gòu)建是矛盾的;你的Maven項(xiàng)目應(yīng)該對(duì)現(xiàn)存插件起到杠桿作用。例如,如果你的項(xiàng)目需要編譯Jave源文件,創(chuàng)建JAR文件,使用Jave插件和JAR插件。如果你忽略重用Maven插件使用Maven的Ant集成則是重復(fù)制造輪子,你最好不要使用Maven。不要濫用Maven;合理使用Maven,省省你的火氣。 生成項(xiàng)目文檔 如果你正開(kāi)發(fā)Java應(yīng)用程序或者庫(kù),你可能想生成JavaDoc。 我該如何做? 簡(jiǎn)單的執(zhí)行javadoc目標(biāo),Maven將生成項(xiàng)目的文檔。下面是執(zhí)行javadoc目標(biāo)的輸出: C:\dev\mavenbook\code\genapp\test-application>maven javadoc 剛剛發(fā)生了什么? 再次,Maven作了全部繁重的工作。你想要JaveDoc,你告訴Maven生成JaveDoc,故事結(jié)束。注意你不用告訴Maven任何你項(xiàng)目的情況;它“知道”如何做,Maven這很多這樣的事都是直截了當(dāng)?shù)?;在你告訴Maven有關(guān)你的項(xiàng)目后你就不用做什么了。Maven操作細(xì)節(jié)。 介紹Maven給你的團(tuán)隊(duì) Maven是一個(gè)偉大的協(xié)作工具,你能夠使用它生成開(kāi)發(fā)者活動(dòng)報(bào)告,項(xiàng)目捐贈(zèng)者和郵件列表。 我該如何做? 許多項(xiàng)目有一個(gè)郵件列表其被用于討論架構(gòu)和實(shí)現(xiàn)。并且,通過(guò)透視圖,如Tomcat,Maven和Ant等項(xiàng)目,并不僅僅是一個(gè)開(kāi)發(fā)者社區(qū)來(lái)共享捐贈(zèng)到同樣的郵件列表。郵件列表不僅用于開(kāi)源項(xiàng)目;許多組織開(kāi)始使用同樣的協(xié)作模型用于開(kāi)啟,發(fā)布開(kāi)發(fā)。因?yàn)猷]件列表是協(xié)作的關(guān)鍵部分,Maven提供了在一個(gè)項(xiàng)目的project.xml中指定郵件列表的途徑。下面引用project.xml添加郵件列表的元素: <mailingLists> 有兩種類型的團(tuán)隊(duì)成員位于Maven項(xiàng)目中:捐贈(zèng)者和開(kāi)發(fā)者。這種定義可能改變你的項(xiàng)目,捐贈(zèng)者通常被認(rèn)為是開(kāi)源社區(qū)中捐贈(zèng)過(guò)補(bǔ)丁或文檔者,開(kāi)發(fā)者是一個(gè)項(xiàng)目的核心成員。在ASF,提交者和捐獻(xiàn)者可以一同捐獻(xiàn)一個(gè)項(xiàng)目,但捐獻(xiàn)者既不寫(xiě)資源庫(kù)代碼又不提交大的項(xiàng)目決定。下面引用了project.xml添加contributor和developer元素到project.xml文件: <developers> 剛剛發(fā)生了什么? 你告訴Maven誰(shuí)在這個(gè)項(xiàng)目工作,對(duì)于今后你生成項(xiàng)目的web站點(diǎn)很有用。開(kāi)發(fā)者和捐贈(zèng)者的信息在POM中以列表的通過(guò)站點(diǎn)生成插件,很多插件為資源控制生成報(bào)告。跟資源控制對(duì)話...。 向Maven到資源控制 你使用資源控制么?把它告訴給Maven,在本書(shū)的下面你將能夠生成一些有興趣的描述報(bào)告。一旦你關(guān)聯(lián)了源代碼資源庫(kù)到你的項(xiàng)目,你將能夠是用Maven的Source Control Management(SCM)插件,其提供了許多目標(biāo)(goal)用于從諸如CVS和其子版本的版本控制系統(tǒng)更新和發(fā)布。 我該如何做? 你需要添加一個(gè)respository元素到你項(xiàng)目的project.xml文件。下面的respository元素來(lái)自于Apache Struts項(xiàng)目,并且它指向到位于有效的子版本資源庫(kù)http://svn./repos/asf/struts/core/trunk: <repository> connection元素告訴Maven有關(guān)SCM只讀的位置。scm標(biāo)識(shí)該URL起始于SCM位置,svn告訴Maven該URL將是資源庫(kù)的子項(xiàng)目,并且最終的片斷定位于項(xiàng)目的trunk。你可能也指定了developerConnection,你使用該元素在你需要分隔觀眾人群的不可寫(xiě)訪問(wèn)和一般人群的可寫(xiě)訪問(wèn)源代碼。url元素提供了能夠被瀏覽的資源庫(kù)的URL。在Struts的案例中,他們選擇了指向資源庫(kù)到它自己,它能夠被一個(gè)正常的瀏覽器所瀏覽。Struts團(tuán)隊(duì)也可以指向到ViewCVS實(shí)例配置指向到ASF的資源庫(kù)的子版本,它能夠在http://cvs./viewcvs.cgi/struts/core/trunk/?root=Apache-SVN的位置找到。 當(dāng)你在一個(gè)詳細(xì)的資源控制系統(tǒng)指定了project.xml,你也可以指向到一個(gè)詳細(xì)項(xiàng)目的不同版本和分之。下面的XML展示了簡(jiǎn)化版的Apache Struts項(xiàng)目的version和branche元素。 <versions> Version被用于幾個(gè)插件,如Announcements插件,其用于為每個(gè)版本創(chuàng)建發(fā)布紀(jì)錄。 關(guān)于... ... CVS? 如果你的項(xiàng)目使用CVS,在Jakatta Catus項(xiàng)目中你將需要添加一個(gè)如repository元素的資源庫(kù)元素如下所示: <repository> 在使用CVS paserver如果你暴露你的資源庫(kù)上面的引用是合適的。如果你在SSH之上訪問(wèn)CVS,你就需要按照下面的語(yǔ)法設(shè)置你的CVS_RSH環(huán)境變量。 <repository> 創(chuàng)建項(xiàng)目Web站點(diǎn) Maven能夠創(chuàng)建項(xiàng)目web頁(yè),包含項(xiàng)目的有關(guān)信息。 我該如何做? 創(chuàng)建一個(gè)Maven項(xiàng)目web站點(diǎn),使用Site插件運(yùn)行下面的Maven目標(biāo): C:\dev\mavenbook\code\genapp\test-application> maven site 運(yùn)行Site插件將在test-application/target/docs/index.html目錄創(chuàng)建默認(rèn)的項(xiàng)目站點(diǎn)。如果你加載這個(gè)HTML,你將發(fā)現(xiàn)這個(gè)站點(diǎn)與眾不同的Maven感觀。圖1-5展示了一個(gè)輕量的定制web站點(diǎn),包含定制的組織logo和項(xiàng)目logo。作為替換向你展示了人工的web站點(diǎn),你能夠看出這個(gè)站點(diǎn)的項(xiàng)目當(dāng)前正使用Maven的構(gòu)建系統(tǒng)-Jaxen。 ![]() 圖1-5.簡(jiǎn)單的Maven項(xiàng)目站點(diǎn)。 許多Maven站點(diǎn)有一個(gè)項(xiàng)目導(dǎo)航部分用于提供鏈接系統(tǒng)向所有的Maven項(xiàng)目。項(xiàng)目信息包含項(xiàng)目的有關(guān)信息,項(xiàng)目的郵件列表,項(xiàng)目的資源控制及問(wèn)題跟蹤(你將在第4章找到所有的這些)。通過(guò)在xdocs目錄里創(chuàng)建和修改XML標(biāo)記生成Maven web站點(diǎn)的目錄。在圖5,項(xiàng)目包含5個(gè)項(xiàng)目細(xì)節(jié)文檔:Overview,FAQ,Releases,CVS Access和Status。這些文檔因?yàn)楸话ㄔ趚docs/navigation.xml文件中所以他們被包含在左邊的導(dǎo)航欄。xdocs目錄是Maven存放XML XDoc格式的項(xiàng)目細(xì)節(jié)文檔的地方。下面是Jaxen的navigation.xml文檔的內(nèi)容: <?xml version="1.0" encoding="ISO-8859-1"?> link元素放置一個(gè)鏈接http://www.到頁(yè)面的右手邊,項(xiàng)目的logo之下,menu元素包含了用以顯示的左右邊的導(dǎo)航區(qū)域。菜單中的一個(gè)文件是xdocs/index.xml。下面是Jaxen的xdocs/index.xml文件的簡(jiǎn)短目錄: <?xml version="1.0"?> 一旦你生成了你的項(xiàng)目站點(diǎn),加載target/docs/index.html到一個(gè)瀏覽器來(lái)查看你項(xiàng)目的web站點(diǎn)。 關(guān)于... ... 這些文件的語(yǔ)法? 你能在Maven XDoc插件的FAQ(http://maven./reference/plugins/xdoc/faq.html)找到navigation.xml文件的更多相關(guān)語(yǔ)法和格式信息。并且你也能在Maven XDoc Plug-in page(http://maven./reference/plugins/xdoc/index.html)上找到更多有關(guān)individual pages格式的信息。這個(gè)插件也面也包含更多定制站點(diǎn)生成插件的輸出和行為的說(shuō)明。 看第4章有關(guān)多樣化報(bào)告的更深的分析,這樣你句能夠把項(xiàng)目活動(dòng)和結(jié)構(gòu)搞清楚了。 定制站點(diǎn)報(bào)告 站點(diǎn)生成創(chuàng)建了許多有用的報(bào)告,但依照你的風(fēng)格,你可能想取出其中的某些報(bào)告。 我該如何做? 修改project.xml中的reports元素內(nèi)容來(lái)改變Maven站點(diǎn)生成對(duì)報(bào)告的生成。下面是reports元素中的幾個(gè)有效的報(bào)告活動(dòng): <reports> 從Maven的站點(diǎn)生成中排除一個(gè)報(bào)告,僅需要移除reports元素中的report的插件元素。Maven項(xiàng)目并未指定reports元素生成一套默認(rèn)的報(bào)告:jdepend,Checkstyle,changes,changelog,developer-activity,file-activity,license,javadoc,jxr,junit,linkcheck和tacklist。當(dāng)你添加一個(gè)reports元素到你項(xiàng)目的project.xml文件,你必須列出所有你希望獲得的報(bào)告。 剛剛發(fā)生了什么? reports元素列出了所有這些多樣的reports,但你可能想了解報(bào)告提供的全部這些。表1-1提供了報(bào)告的一些摘要描述。 ![]() 更多全面的插件和報(bào)告列表,參見(jiàn): Maven插件: http://maven./reference/plugins/index.html Maven插件沙箱: http://maven./plugins-sandbox/index.html Maven 在SourceForge上的插件: http://maven-plugins./ 第三方Maven插件: http://maven./reference/3rdparty.html |
|
來(lái)自: smoking_boy > 《我的圖書(shū)館》