幫助整合-手冊2maven學習教程實戰(zhàn)_第1頁
幫助整合-手冊2maven學習教程實戰(zhàn)_第2頁
幫助整合-手冊2maven學習教程實戰(zhàn)_第3頁
幫助整合-手冊2maven學習教程實戰(zhàn)_第4頁
幫助整合-手冊2maven學習教程實戰(zhàn)_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Java社區(qū)事實標準的項目管理工具,能幫你從瑣碎的手工勞動中解脫出來,幫你規(guī)范整個組織的構建系統(tǒng)。不《Maven實戰(zhàn)》是國內(nèi)第一本公開的Maven專著。它內(nèi)容新穎,基于發(fā)布的Maven3.0,不僅詳盡講解Maven3.0Maven2.x版本進行了對比,以便于正在件、聚合與繼承等Maven的概念,建議所有讀者仔細閱讀;系統(tǒng)性地闡述了使用Nexus建立、使用Mavenm2eclipse插件等實用性較強的高級知識,讀者可有選擇性的閱讀;擴展性地講解第4章設計了一個背景案例,后面的很多章節(jié)都是圍繞這個案例展開的,可操作性極強。JavaMavenMaven很長一段時間了,相信你MavenMaven的技術文章,而且還翻譯了開源書Maven倉庫,是Maven倉庫管理器Nexus(著名開源軟件)的開發(fā)者之一,受邀到淘寶等MavenJava開發(fā)和敏捷開發(fā)實專家開發(fā)人員對Maven相關的資料的需求也越來越迫切。JuvenXu作為Sonatype的員工和《Maven指南》的譯者,對Maven有著非常深刻的理解,他為Maven中文社區(qū)所做的工作也為推動Maven的發(fā)展做出了非常大的貢獻。這本書是Juven犧牲了年的業(yè)余時間創(chuàng)作而成的,內(nèi)容全面、實戰(zhàn)性強、深度和廣度兼?zhèn)?,是中文社區(qū)不可多得的優(yōu)秀參考資料。——Maven中文社區(qū)專家正好有條件編寫一本關于Maven的中文。他的新書《Maven實戰(zhàn)》將帶領你一步步從認識Maven開始MavenWebMaven員,該書是必備的!——JohnSmartWakaleoConsuting首席咨詢顧問,《JavaPowerTools(O'Reilly)作者1MavenMaven2Maven2.1Windows2.2在基于Unix2.3安 2.4HTTP2.52.6NetBeansMaven2.83Maven163.1173.2183.3193.4223.7NetBeansMaven233.8為什么寫這本實踐。于是我慢慢開始學習并推廣Maven,這期間有人支持,也有人抵觸,而我則盡力地為大家排除,并做文檔是當時最主要的問題。為了能改善這個問題,我開始在博客中撰寫各類關于Maven的中文博客,翻譯了這在一定程度上推動了Maven這一優(yōu)秀的技術在國內(nèi)的。后來我加入了Maven之父JasonVanZyl創(chuàng)建的Sonatype,參與Nexus的開發(fā)并負責Maven倉庫,這些MavenMaven的書的信心。我希望它能夠更貼近該書寫作后期Maven3的發(fā)布,這距離我剛接觸Maven時已經(jīng)過去3年有余,感嘆時光的流逝!Maven在2007年至2010年取得了飛速的發(fā)現(xiàn)在幾乎已經(jīng)成為了所有Java開源項目的標配,StrutsHibernateEhcacheMavenMaven管理本向的讀JavaJavaJava2~3Maven的一個入門介紹,這些內(nèi)容對初學者很有幫助,如果你已經(jīng)比較熟悉Maven,可以跳過。第4章介紹了本書使用的背景案例,后面的很多章節(jié)都會基于該案例展開,因此建議讀者至少簡單瀏覽一遍。10~16Hudson、Web項目與自動化部署、自動化版本管理、智能適應環(huán)境差異的靈活構建、站點生成,以及Maven的Eclipse插件m2eclipse,等等。讀者可以根據(jù)自己實際需要和選擇性地閱讀。17~18章介紹了如何編寫ArcheypeMaven插件。一般Maven用戶在實際工作中往往不需要接觸這些知識,如果你需要編寫插件擴展Maven,或者需要編寫Archetype自己的項目骨架以方便團隊開發(fā),那么可以仔細本書代碼 歡迎大家與我交流任何關于本書的問題和關于Maven的問題。咖啡Yin還了我如何自己研磨咖啡豆、手沖滴率咖啡,讓我能夠每天在家里也能享受香氣四溢的新鮮咖啡。本書的書稿是使用Git和Unfuddle( /)進行管理的,大量截圖是通過 致給了本書不少建議,并在我寫作過程中不斷鼓勵我和支持我,是我寫作最大的動力之一。1Maven小結1.1MavenMavenApache組織中的一個頗為成功的開源項目,Maven主要服務Java業(yè)級應用;無論是傳統(tǒng)的瀑布式開發(fā),還是流行的敏捷模式,Maven都能大顯身手。 不管你是否,構建(build)是每一位程序員每天都在做的工作。早上來到公司,我們做的會感激IDE隨出的編譯錯誤提示。忙到午飯時間,代碼編寫得差不多了,測試也通過了,開心地午餐,然后休息。下午先在昏昏QAbugIDEWARWebbugbug??快下班的時候,bug修好了,提交代碼,通知QA小組,在愉快中結束了一天的工作。 令,一次又一次地點擊鼠標,我們要做的是使用Maven配置好項目,然后輸入簡單令(如mvnMaven是跨平臺的,這意味著無論是在Windows上,還是在Linux或者Mac上,都可以使用同樣的直接使用大量成Maven插件來完成我們的任務(很多時候我們可能都不知道自己在使用Maven插件)。此外,如果有非常特殊的需求,我們也可以輕松實現(xiàn)自己的插件。綜上所述,Maven作為一個構建工具,不僅能幫我們自動化構建,還能夠抽象構建過程,提供構建 Java不僅是一門編程語言,還是一個平臺,通過JRuby和Jython,我們可以在Java平臺上編寫和RubyPython程序。我們也應該認識到,Maven不僅是構建工具,還是一個依賴管理工具和項目信息管理工具。它提供了倉庫,能幫我們自動構件。Java應用都會借用一些第的開源類庫,這些類庫都可通過依統(tǒng)準確地定位每一個構件(artifact),MavenJava類庫(如jar文件)。Maven給這個類庫世界引入了經(jīng)緯,讓它們變得有秩序,于是我們可以借助它Maven就能夠幫我們自動,省去了手工勞動。MavenMaven對于項目結構、測試用例命名方式等內(nèi)容都有既說是約定優(yōu)于配置(ConventionOverConfiguration)。1.2MavenJavaMaven的必要性,并介紹其他構建解決方案,如IDE、MakeAnt,并將它們與Maven進行比較。1.2.1PCPC供應商的使用建立高度自定義的構建系統(tǒng)就像買組裝PC,耗時費力,結果也不一定很好。當然,你可以享受從須為此。如果有,你還能去了解Maven是如何工作的,而我們無法知道那些PC巨頭的商業(yè)。1.2.2IDE當然,我們無法否認優(yōu)秀的IDE能大大提高開發(fā)效率。當前主流的IDEEclipseNetBeans等都提供了強人愿意那樣做。然而,IDE是有其天生缺陷的:以成功運行的任務,到了機器B的IDE中可能就會失敗。IDEIDE中一次次地點擊鼠標是愚蠢的1.2.3Make也許是最早的構建工具,它由StuartFeldman于1977年在Bell創(chuàng)建。StuartFeldman也因此于BSDMakeWindows平臺的nmake等。Make由一個名為Makefile的文件驅動,該文件使用Make自己定義的語法格式。其基本組成部分為一(Rules(arget(CommandJava代碼……能、強大令能夠幫助Make快速高效地完成任務。是一個難以發(fā)現(xiàn)的空格或Tab使用錯誤。1.2.4ToolJamesDuncanDavidsonMakefileAntJava版本的Make,也正因為使用了Java,Ant是跨平臺的。此外,Ant使用XML定義構建,相對于Makefile來與Make類似,Ant有一個構建build.xml,如下所示<?xml<project o"<targetname="compile"description="compiletheJavasourcecodetoclass<mkdir<javacsrcdir="."<targetname="jar"depends="compile"description="createaJarfile<jar (target(depends編譯當前的pile目標完成后,jar目標再執(zhí)行自己的任務。Ant有大量內(nèi)置的用Java實現(xiàn)的任務,這保證了其跨平臺的特質,同時,Ant也有特殊的任務exec來執(zhí)行本地命令。Make一樣,Ant也都是過程式的,開發(fā)者顯式地指定每一個目標,以及完成該目標所需要執(zhí)行的任務。針對每一個項目,開發(fā)者都需要重新編寫這一過程,這里其實隱含著很大的重復。Maven是式的,項目構建Maven就執(zhí)行內(nèi)置的、完整的構建過程。這在很大程度上消除了重復。AntAnt用戶都不得不手工管理依賴,這是一個令人頭疼的問題。幸1.2.5【該小節(jié)內(nèi)容整理自ArthasMavenMSN的群內(nèi)的討論,在此表示感iBatisTapstry。jar包去哪里找呢?公司里估計沒有Spring、iBatisTapstry所使jar包一個不少地找出來。大家的做法是,先到Spring的站點上去找一個spring.with.dependencies,然后去iBatis的上把所有列出來的jar包下來,對Tapstry、Apachecommons等執(zhí)行同樣的操作。項目還沒有開始,WEB.INF/lib下已經(jīng)有近百個jar包了,帶版本號的、不帶版本號的、有用的、沒用的、相的,怎一個“亂”字了得!經(jīng)理發(fā)現(xiàn)最終部署的應用的體積實在太大了,要求去掉一些沒用的jar包,于是只能加班加點地一個個喜歡學習流行的技術,前幾年Ant十分流行,他學了,并成為了公司這方面的專家。知道,Ant打包,無非就是創(chuàng)建,文件,編譯源代碼,使用一堆任務,如copydir、fileset、classpath、ref、target,然后再jar、zip、war,打包就成功了?!笆?,保證完成任務!”接著,繼續(xù)創(chuàng)建一個新的XML文件。targetclean;targetcompile;targetjar;……不知道他是否想過,在他寫的這么多的Ant中,有多少是重復勞動,有多少代碼會在一個又一個項目中重現(xiàn)。吧,新的項目只要遵循我定義 結構就可以了?!苯?jīng)理聽后覺得很有道理:“嗯,確實是個進步。這時新來的發(fā)言了:“經(jīng)理,用Maven吧,這個在開源社區(qū)很流行,比Ant更方便?!币宦牶荏@訝,JDBC”?1.3Maven的創(chuàng)始人KentBeck提出了XP所追求的價值、實施原則和推薦實踐。下面看一下Maven是如何適應XP的。簡單。Maven了一組一致、簡潔的操作接口,能幫助團隊成員從原來的高度自定義的、復雜的構建系統(tǒng)中解脫出來,使用Maven現(xiàn)有的成、穩(wěn)定的組件也能簡化構建系統(tǒng)的復雜度。交流與反饋。與版本控制系統(tǒng)結合后,所有人都能執(zhí)行的構建并快速得到反饋。此外,自動生成的測試驅動開發(fā)(TDD。TDDMaven生命周只需要一些配置,之后用一條簡單令就能讓Maven幫你清理、編譯、測試、打包、部署,然后得到持續(xù)集成(CI。CI強調(diào)項目以很短的周期(如15分鐘)集成的代碼。實際上,CI的前提是源碼管理系統(tǒng)和構建系統(tǒng)。目前業(yè)界流行的CI服務器如Hudson和CruiseControl都能很好地和Maven進行集成。也就是說,使用Maven后,持續(xù)集成會變得更加方便。上述這些實踐并非只在XP中適用。事實上,除了其他敏捷開發(fā)方法如SCRUM之外,幾乎任何軟件開發(fā)方法都能借鑒這些實踐。也就是說,Maven幾乎能夠很好地支持任何軟件開發(fā)方法。Maven最后,Maven還能幫助我們快速地發(fā)布項目。2Maven第1章介紹了Maven是什么,以及為什么要使用Maven,從本章實際開始實際接觸Maven。本章首先將介紹如何在主流的操作系統(tǒng)下安裝Maven,并詳細解釋Maven的安裝文件;其次還會介紹如何在主流的IDEMaven,Maven安裝的最佳實踐。 2.1Windows2.1.1JDK的所有樣例都基于JDK5及以上版本。打開Windows令行,運行如下令來檢查你的Java安裝:C:\Users\JuvenXu>echoC:\Users\JuvenXu>java-上述命令首先檢查環(huán)境變量JAVA_HOME是否指向了正確的JDK,接著嘗試運行java命令。如果變量是否設置正確。關于環(huán)境變量的設置,請參考2.1.3節(jié)。2.1.2請Maven的頁面:,其中包含針對不同平臺的各種版本的Maven文件。對于首次接觸Maven的讀者來說,推薦使用Maven3.0,,因此apache-maven-3.0-bin.zip。當然,如果你對Maven的源代碼感并想自己構建Maven,還可以apache-maven-3.0-src.zip。該頁面還提供md5校驗和(checksum)ascMaven分發(fā)包的正確性和安全性。在本書編寫的時候,Maven2的版本是2.2.1,Maven3基本完全兼容Maven2,而且較之于Maven2它2.1.3 D:\bin>jarxvf"C:\Users\JuvenXu\Downloads\apache-maven-3.0--Maven安裝D:\bin\apache-maven-3.0Maven安裝配置到操作系統(tǒng)變量M2_HOME,變量值Maven的安裝D:\bin\apache-maven-3.0。點擊確定,接著在系統(tǒng)變量中找到一個名為Path的變量,在變量值的末尾加上%M2_HOME%\bin;,注意多個值之間需要有分號隔開,然后點擊確定。至此,環(huán)境變量設置完成,詳細情況如圖2-2所示:Pathcmd中輸入命令時,Windows首先會在當前中尋找可執(zhí)添加到了Path中,而這里%M2_HOME%實際上是了我們前面定義的另一個變量,其值是Maven的安裝。因此,Windows會在執(zhí)行命令時搜索D:\bin\apache-maven-3.0\bin,而mvn執(zhí)行的位置就是這里。的cmd窗口才能生效Maven的安裝情況:C:\Users\JuvenXu>echoC:\Users\JuvenXu>mvn-第一條命令echo%M2_HOME%用來檢查環(huán)境變量M2_HOME是否指向了正確的Maven安 2.1.4避免一些舊的bug。在Windows上更新Maven非常簡便,只需要新的Maven安裝文件,解壓至本地 M2_HOME環(huán)境變量便可。例如,假設Maven推出了新版本3.1,其然后解壓至D:\bin\apache-maven-3.1,接著遵照前一節(jié)描述的步驟編輯環(huán)境變量M2_HOME,更改其值為M2_HOME環(huán)境變量指向舊版本的安裝 MavenUnix的系統(tǒng)( juven@juven-ubuntu:~$echo$JAVA_HOMEjuven@juven-ubuntu:~$java–version運行結果如圖2-4所示:接著到Maven安裝文件, juven@juven-ubuntu:bin$tar-xvzfapache-maven-3.0- 配置環(huán)境變量之后就能使Maven了,但這里我更推薦做法是,在安 旁平行地創(chuàng)建一個符號,以方便日后的升級juven@juven-ubuntu:bin$ln-sapache-maven-3.0apache-mavenjuven@juven-ubuntu:bin$ls-ltotallrwxrwxrwx1juven 182009-09-2015:43apache-maven->apache-maven-drwxr-xr-x6juvenjuven40962009-09-2015:39apache-maven- 下的juven@juven-ubuntu:bin$exportM2_HOME=/home/juven/bin/apache-mavenjuven@juven-ubuntu:bin$exportPATH=$PATH:$M2_HOME/bin一般來說,需要將這兩行命令加入到系統(tǒng)的登錄s juven@juven-ubuntu:bin$echo$M2_HOMEjuven@juven-ubuntu:bin$mvn–version2-52.2.2在基于Unix的系統(tǒng)上,可以利用符號這一工具來簡化Maven的升級,不必像在Windows上那樣,每次升與前一版本平行的下,然后更新符號指向3.1版的便可:juven@juven-ubuntu:bin$rmapache-juven@juven-ubuntu:bin$ln-sapache-maven-3.1/apache-mavenjuven@juven-ubuntu:bin$ls-ltotallrwxrwxrwx1juven 172009-09-2016:13apache-maven->apache-maven-3.1drwxr-xr-x6juvenjuven40962009-09-2015:39apache-maven-3.0drwxr-xr-x2juven40962009-09-2016:09apache-maven-2.3安 2.3.1前面我們講到設置M2_HOME環(huán)境變量指向Maven的安裝 Bin:該 包含了mvn運行的,這些用來配置Java命令,準備好classpath和相關的Java系統(tǒng)屬性,然后執(zhí)行Java命令。其中mvn是基于UNIX平臺的s bat。在命令行輸入任何一條mvn命令時,實際上就是在調(diào)用這些。該 還包含了mvnDebug和mvnDebug.bat兩個文件,同樣,前者是UNIX平臺的s ,后者是windows的bat。那么 還包含m2.conf文件,這是classworlds的配置文件,稍微會介紹classworlds。 框架加載自己的類庫。關于classworlds的信息請參考。對于一般的Maven用戶來說,不必關心該文件。行為。一般情況下,我們更偏向于該文件至~/.m2/下(這里~表示用戶),然后修改該文件,在用戶范圍定制Maven的行為。本書的后面將會多次提到該settings.xml,并逐步分析其中的各個元素。Lib:該包含了所有MavenJava類庫,Maven本身是分模塊開發(fā)的,因此用戶能看到諸如mavn-core-3.0.jar、maven-model-3.0.jar之類的文件,此外這里還包含一些Maven用到的第依賴如common-cli-1.2.jar、-collection-1.0.jar等等。(對于Maven2來說,該只包含一個如maven-2.2.1-uber.jar的文件原本各為獨立JAR文件的Maven模塊和第類庫都被拆解后重新合并到了JAR文件中l(wèi)ibMaven。關于該文件,還有一點值得一提的是,用戶可以在這個中找到MavenPOM8.5LICENSE.txt記而README.txt則包含了Maven的簡要介紹,包括安裝需求及如何安裝的簡要指令等等。2.3.2在講述該小節(jié)之前,我們先運行一條簡單令:mvnhelp:system。該命令會打印出所有的Java系統(tǒng)屬性目的是為了讓Maven執(zhí)行一個真正的任務。我們可以從命令行輸出看到Maven會maven-help-plugin,包括pom文件和jar文件。這些文件都被到了Maven本地倉庫中?,F(xiàn)在打開用戶,比如當前的用戶是C:\Users\JuvenXu\,你可以在Vista和Windows7中找到類似的用戶。如果是更早版本的Windows,該應該類似于C:\ andSettings\JuvenXu\。在基于Unix的系統(tǒng)上,直接輸入cd回車,就可以轉到用戶。為了方便,本書統(tǒng)一使用符號~指代用戶。在用戶下,我們可以發(fā)現(xiàn).m2Maven本地倉庫.m2/repository。Maven(artifact)~/.m2/repository/org/apache/maven/plugins/maven-help-plugins/下找到剛才的maven-help-plugin的pom文jar文件。Maven6章將會詳細闡述。由于Maven倉庫是通過簡單文件系統(tǒng)透明地展示給Maven用戶的,有些時候可以繞過Maven直接查看或修改倉庫默認情況下,~/.m2repository倉庫之外就沒有其他和文件了,不過大多數(shù)Maven用戶需要M2_HOME/conf/settings.xml文件到~/.m2/settings.xml。這是一條最佳實踐,在本章最后一小節(jié)詳細解2.4HTTP為Maven配置HTTP,才能讓它正常外部倉庫,以所需要的資源。果真的需要,先檢查一下服務器是否暢通,比如現(xiàn)在有一個IP地址為97,端口為3128的 net973128來檢測該地址的該端口是否暢通。如果得到出錯信息,需要先獲取正確的服務信息;如果net連接正確,則輸入ctrl+],然后q,回車,退出即可$M2_HOME/conf/setting.xl?<id>my-<!- --?這段配置十分簡單,proxies下可以有多個proxy元素,如果你了多個proxy元素,則默認情況下第一個被激活的proxy會生效。這里了一個id為my-proxy的,active的值為true表示激活該,protocol表示使用的協(xié)議,這里是http。當然,最重要的是指定正確的主機名(host元素)和端口(port元素。上述XML配置中我注釋掉了username、password、nonProxyHost幾個元素,當你的服務需要認證時,就需要配置username和password。nonProxyHost元素用來指定哪些主機名不需要,可以使用|符號來分隔多個主機 結尾的都不要通過。2.5Eclipse是一款非常優(yōu)秀的IDE。除了基本的語法標亮、代碼補齊、XML編輯等基本功能外,版的Eclipse還能很好地支持重構,并且集成了JUnit、CVS、Mylyn等各種流行工具??上clipse默認沒有集成對Maven的款十分強大的Maven插件,可以了解該項目的信息。InstallNewSoftware…,接著你會看到一個Install框,點擊Workwith:字段邊上的Add按鈕,你會得到一個新的AddRepository對話框,在Name字段中輸入m2e,Location字段中輸入,然后點擊OK。Eclipse會m2eclipse安裝站點上的資源信息。等待資源載入完成之后,我們再將其全部展開,就能看到圖2-6所示的界面:圖2-6m2eclipse的安裝資源列如圖顯示了m2eclipse的模塊MavenIntegrationforEclipse(Required),選擇后點擊Next>,Eclipse會自然后點擊Finish,接著就耐心等待Eclipse安裝這些模塊,如圖2-7所示:這些組件的安裝地址為。使用前面類似的安裝方法,我們可以看到如圖2-8的組件列表:重要(OptionalSubversion們直接從Subversion服務器簽出Maven項目,不過前提是需要首先安裝Subclipse(Optional:Eclipse具如SVN實現(xiàn)Maven項目的簽出和具體化等操作。不重要Optional統(tǒng)信息連接Mylyn至服務器。Optional在使用CVS,就需要安裝它。(Optional(然后選擇AboutEclipse,在彈出的框中,點擊InstallationDetails按鈕,會得到一個框,在InstalledSoftware欄中,檢查剛才我們選擇的模塊是否在這個列表中,如圖2-9所示:New→Other,在彈出的框中,找到Maven一項,再將其展開,你應該能夠看到如圖2-10所示的框:如果一切正常,說明m2eclipse已經(jīng)正確安裝了。09-10-6011449EclipseisrunninginaJRE,butaJDKisrequiredSomeMavenpluginsmaynotworkwhenimportingprojectsorupdatingsourcefolders. ----2.6NetBeansMavenNetBeans6.7MavenMaven插件安如圖2-11所示:2-11NetBeansMavenNetBeansMaven插件,下面我們以NetBeans6.1為例,介紹Maven插件的安裝。輸入Maven,這時你會在左邊的列表中看到一個名為Maven的插件,選擇該插件,然后的安裝按鈕,如圖2-12所示:2-12NetBeansMaven接著在隨后的框中根據(jù)提示操作,閱讀相關證并接受,NetBeans會自動幫我們并安裝右邊會相應地顯示Maven項目和基于現(xiàn)有POMMaven項目2-13所示:如果你能看到類似的框,說明NetBeansMaven已經(jīng)正確安裝了。2.7Maven2.7.1MAVEN_OPTS本章前Maven安裝時我們了解到mvn命令實際上是Java命令,既然是Java,那么運行Java命令可用的參數(shù)當然也應該在運行mvn命令時可用。這個時候,MAVEN_OPTS環(huán)境變量就能派上用我們很容易得到java.lang.OutOfMemeoryError。因此,一開始就配置該變量是推薦的做法。 2.7.2Maven用戶可以選擇配置$M2_HOME/conf/settings.xml或者~/.m2/settings.xml。前者是全局范圍的,整臺機器除了影響范圍這一因素,配置用戶范圍settings.xml文件還便于Maven升級。直接修改 下settings.xml會導致Maven升級不便,每次升級到新版本的Maven,都需要settings.xml文件,如果使用~/.m2下的settings.xml,就不會影響到Maven安裝文件,升級時就不需要觸動settings.xml文件。因此,我們應該在IDE中配置Maven插件時使用與命令行一致的Maven。在m2eclipse環(huán)境中,點擊菜單欄中的Windows,然后選擇Preferences,在彈出的框中,展開左邊的MavenInstallationEmbeddedMaven安裝被選中了,點Add…然后選擇Maven安裝M2_HOME,添加完畢之后選擇這一Maven2-142-14Eclipse單欄中的工具→選項→其他→Maven欄,你就能看到如圖2-15所示的配置:2-15NetBeans2.8本章詳細介紹了在系統(tǒng)平臺上安裝Maven,并對Maven安裝進行了深入的分析,在命令行的基礎上,本章又進一步介紹了Maven與主流IDEEclipseNetBeans的集成,本章最后還介紹了一些與Maven安裝相關的最佳實踐。本書下一章會創(chuàng)建一個oWorld項目,帶領讀者配置和構建Maven項目。3Maven到目前為止,我們已經(jīng)大概了解并安裝好了Maven,現(xiàn)在,我們開始創(chuàng)建一個最簡單的m2eclipseNetBeansMaven3.1就像Make的Makefile,Ant的build.xml一樣,Maven項目的是pom.xml。POM(ProjectObjectModel, oWorld項目編寫一個最簡單的pom.xml。新建一個名為pom.xml的文件,輸入其內(nèi)容如代碼3-1:代碼3-1:oWorld的POMJava代碼xmlns:xsi=" <version>1.0-<name>MavenoWorld代碼的第一行是XML頭,指定了該xmlprojectproject是所有pom.xml的根元素,它還了一些POM相關名空間及xsd元素,雖然這些屬性不是必須的,但使用這些屬性能夠讓第工具(如IDE中的XML編輯器)幫助我們快速編輯POM。modelVersionPOMMaven2Maven3來說,它只能是4.0.0。groupId定義了項目屬于哪個組,這個組往往和項目所在的組織或公司存在關聯(lián),譬如你在code上建立了一個名為myapp的項目,那么groupId就應該是com.code.myapp,如果你的公司是,有一個項目為myapp,那么groupId就應該是 本書其他章節(jié)代碼會被分配其他的artifactId。而面的groupId為com.code.myapp的例子中,你可能會為不同的子項目(模塊)分配artifactId,如:myapp-util、myapp-、myapp-web等等。顧名思義,version指定了 oWorld項目當前的版本——1.0-SNAPSHOT。SNAPSHOT意為快照,說明該項目還處于開發(fā)中,是不穩(wěn)定的版本。隨著項目的發(fā)展,version會不斷更新,如升級為1.0、1.1-SNAPSHOTname,以方便信息交流。沒有任何實際的Java代碼,我們就能夠定義一個Maven項目的POM,這體現(xiàn)了Maven的一大優(yōu)點,它能讓項目對象模型最大程度地與實際代碼相獨立,我們可以稱之為解耦,或者正交性,這在很大程度上避免了JavaPOMPOMJava代碼;而在POM穩(wěn)定之后,日常的Java代碼開發(fā)工作基本不涉及POM的修改。3.2jar,時用到,不會被打包。默認情況下,Mavensrc/main/javaMaven的約定,創(chuàng)建該,然后在該下創(chuàng)建文件com/juvenxu/mvnbook/oworld/oWorld.java,其內(nèi)容如代碼3-2:代碼3-2:oWorld的主代Java代碼publicclass{publicString {return o publicstaticvoidmain(String[]{System.out.print( o() 14.15.下(Maven的約定),而無須額外的配置,MavenJava類com.juvenxu.mvnbook.oworldPOMgroupIdartifactId相吻合。一般來說,項目中Java類的包都應該基于項目的groupId和artifactId,這樣更加清晰,更加符合邏輯,也方便搜索構件或者Java類。Maven進行編譯,在項目根下運行命令mvncleancompile,我們會得到如Java代碼<SPANstyle="FONT-SIZE:small">[INFO]Scanningfor[INFO]BuildingMavenoWorld task-segment:[clean,[INFO][clean:clean{execution:default-[INFO]DeletingdirectoryD:\code\o-[INFO][resources:resources{execution:default-[INFO]skipnonexistingresourceDirectoryD:\code\o-[INFO] pile [INFO]Compiling1sourcefiletoD:\code\o-[INFO]BUILD[INFO]Totaltime:1[INFO]Finishedat:FriOct0902:08:09CST[INFO]FinalMemory:clean告訴Maven清理輸出target/,compile告訴Maven編譯項目主代碼,從輸出中我們看到Maven首先執(zhí)行了clean:clean任務,刪除target/,默認情況下Maven構建的所有輸出都在target/中;接著執(zhí)行resources:resources任務(未定義項目資源,暫且略過最后執(zhí)行 pile任務,將項目主代碼編譯至target/classes(編譯好的類為com/juvenxu/mvnbook/oworld/oorld.Class。上文提到的clean:clean、resources:resources,以及 pile對應了一些Maven插件及插件目標,比如clean:clean是clean插件的clean目標, 測試代碼并讓Maven執(zhí)行自動化測試。3.3為了使項目結構保持清晰,主代碼與測試代碼應該分別位于獨立的中。3.2Maven項目中默認的主代碼是src/main/java,對應地,Maven項目中默認的測試代碼是src/test/java。因此,在編寫測試用例之前,我們先創(chuàng)建該。Java世界中KentBeckErichGammaJUnit是事實上的單元測試標準。要JUnit,我們首先需要為oWorld項目添加一個JUnit依賴,修改項目的POM如代碼3-3:Java代碼xmlns:xsi=" <version>1.0-<name>MavenoWorld代碼中添加了dependencies元素,該元素下可以包含多個dependency元素以項目的依有了這段,Maven就能夠自動junit-4.7.jar。也許你會問,Maven從哪里 這個jar呢?在Maven之前,我們可以去JUnit的官網(wǎng)分發(fā)包。而現(xiàn)在有了Maven,它會自動倉庫(),需要的文件。讀者也可以自己該倉庫,打開路徑庫及倉庫。POMtestscope,scopetest則表示該依賴只對importJUnitimportJUnit代碼,就會造成編譯錯誤。如果不依賴范圍,那么默認值就是compile,表示該依賴對主代碼和測試代碼都方法,檢查其返回值是否為“oMaven”。在src/test/java 代碼3-4:oWorld的測試代碼Java代碼importstaticimportpublicclass{publicvoidtestSay{ Stringresult=oWorld.sayo(); assertEquals( oMaven",result 16.樣例中,我們首先初始化了一個要測試的oWorld實例,接著執(zhí)行該sayo()方法并保resultJUnitAssert類檢查結果是否為我們期望的”oMaven”JUnit3中,約定所有需要執(zhí)試的方法都以test開頭,這里我們使用了JUnit4,但我們?nèi)匀蛔裱@一約定,在JUnit4中,需要執(zhí)行的測試方法都應該以@Test進行標注。測試用例編寫完畢之后就可以調(diào)用Maven執(zhí)試,運行mvncleantestJava代碼[INFO]Scanningfor[INFO]Building oWorld task-segment:[clean,[INFO][clean:clean{execution:default-[INFO]DeletingdirectoryD:\git-juven\mvnbook\code\o-[INFO][resources:resources{execution:default-…Downloading:1Kdownloaded(junit-[INFO] pile [INFO]Compiling1sourcefiletoD:\code\o-[INFO][resources:testResources{execution:default-…Downloading:226Kdownloaded(junit-[INFO] pile [INFO]Compiling1sourcefiletoD:\code\o-world\target\test-[ERROR]BUILD[INFO]Compilation(請使用-source5或更高版本以啟用注釋[INFO]Formoreinformation,runMavenwiththe-e 略去了。命令行輸入的是mvncleantest,而Maven實際執(zhí)行的可不止這兩個任務,還有clean:clean、 pile、resources:testResources以及 在Maven執(zhí)試(test)之前,它會先自動執(zhí)行項目主資源處理,主代碼編譯,測試資源處理,測試代碼編譯等工作,這是Maven生命周期的一個特性,本書后續(xù)章節(jié)會詳細解釋Maven的生命周期。從輸出中我們還看到:Maven從倉庫了junit-4.7.pom和junit-4.7.jar這兩個文件到本地倉 pile任務的時候失敗了,Maven輸出提示我們需要使用-source5或更高版本以啟動注釋,也就是前面提到的JUnit4的@Test注解。這是Maven初學者常常會遇到的一個問題。由于歷史原因,Maven的插件之一compiler插件默認只支持編譯Java1.3,因此我們需要配置該插件使其支持Java5,見代碼3-5: Java代碼… 15.16.支持Java5的編譯。現(xiàn)在再執(zhí)行mvncleantest,輸出如下:Java代碼 [INFO] pile [INFO]Compiling1sourcefiletoD: o-world\target\test-[INFO][surefire:test{execution:default-[INFO]Surefirereportdirectory:D:\code\ TESTRunning Testsrun:1,Failures:0,Errors:0,Skipped:0,Timeelapsed:0.055ResultsTestsrun:1,Failures:0,Errors:0,Skipped:[INFO]BUILD… pile任務執(zhí)行成功了,測試代碼通過編譯之后在target/test-classes下生成了二進制文件,緊接著surefire:test任務運試,surefire是Maven世界中負責執(zhí)試的插件,這里它運試用例我們的測試通過了——BUILDSUCCESSFUL3.4(package型,使用默認打包類型jar,我們可以簡單地執(zhí)行命令mvncleanpackage進行打包,可以看到如下輸出:Java代碼 Testsrun:1,Failures:0,Errors:0,Skipped:[INFO][jar:jar{execution:default-[INFO]Buildingjar:D:\code\o-world\target\o-world-1.0-[INFO]BUILD…類似地,Mavenjar:jarjarjar目標將項目主代碼打包成一個名為o-world-1.0-SNAPSHOT.jar的文件,該文件target/輸出目錄中,它是根據(jù)artifact-version.jar規(guī)則進行命名的,需要,我們還可以使用finalName來自定義該文件的名至此,我們得到了項目的輸出,如果有需要的話,就可以這個jar文件到其他項目的Classpath中從而使oWorld類。但是,如何才能讓其他的Maven項目直接這個jar呢?我們還需要一個安裝的步驟,執(zhí)行mvncleaninstall:Java代碼 [INFO][jar:jar{execution:default-[INFO]Buildingjar:D:\code\o- [INFO][install:install{execution:default-[INFO]InstallingD:\code\o- o-world-1.0-SNAPSHOT.jarto\com\juvenxu\mvnbook\o-world\1.0-SNAPSHOT\o-world-1.0-[INFO]BUILD…在打包之后,我們又執(zhí)行了安裝任務install:install,從輸出我們看到該任務將項目輸出的jar安裝到了Maven本地倉庫中,我們可以打開相應的文件夾看到oWorld項目的pom和jar。之前講述JUnit的POM及jar的下載的時候,我們說只有構件被到本地倉庫后,才能由所有Maven項目使用,這里是同樣的道理,只有將oWorld的構件安裝到本地倉庫之后,其他Maven項目才能使用它。installtestcompilepackagetest的,而類似地,install之前會執(zhí)行package。我們可以在任何一個Maven項目中執(zhí)行這些命令,而且我們已經(jīng)清楚它們是用來做什么的。到目前為止,我們還沒有運行oWorld項目,了oWorld類可是有一個main方法的。默認打包生成的jar是不能夠直接運行的,因為帶有main方法的類信息不會添加到manifest中(我們可以打開jar文件中的META-INF/MANIFEST.MF文件,將無法看到Main-Class一行)。為了生成可執(zhí)行的jar文件,我們需要借助Java代碼<artifactId>maven-shade-<transformer plugin元素在POM中的相對位置應該在<project><build><plugins>下面。我們配置了mainClass為com.juvenxu.mvnbook.oworld.oWorld,項目在打包時會將該信息放到MANIFEST中?,F(xiàn)在執(zhí)行mvncleaninstall,待構建完成之后打開target/目錄,我們可以看到o-world-1.0-SNAPSHOT.jar和original-o-world-1.0-SNAPSHOT.jar,前者是帶有Main-Class信息的可運行jar,后者是原始的jar,打的 中執(zhí)行該jar文件D:\code\o-world>java-jartarget\o-world-1.0-SNAPSHOT.jaroMaven本小節(jié)介紹了oWorld項目,側重點是Maven而非Java代碼本身,介紹了POM、Maven項目結構、以3.5Archetype 中放置項初學者的你得到最實際的感受。我們稱這些基本的pom.xml文件內(nèi)容稱為項目的骨架,當你第一次創(chuàng)還是以oWorld為例,我mavenarchetype來創(chuàng)建該項目的骨架,離開Maven項目。如果是Maven3,簡單的運行:mvnmvnorg.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-令沒有指定archetype插件的版本,于是Maven會自動去的版本,進而可能得到不穩(wěn)定的SNAPSHOT版本,導致運行失敗。然而在Maven3中,即使用戶沒有指定版本,Maven也只會解析的穩(wěn)定版本,因此這是安全的,具體內(nèi)容見7.7小節(jié)。我們實際上是在運行插件maven-archetype-plugin,注意冒號的分隔,其格式為groupId:artifactId:version:goalorg.apache.maven.plugins是maven插件的groupIdmaven-archetype-plugin是archetype插件的artifactId,2.0-alpha-5是目前該插件的穩(wěn)定版,generate是我們要使用的插件目標。緊接著我們會看到一段長長的輸出,有很多可用的archetype供我們選擇,包括著名的Appfuse項目的archetype,JPAarchetypearchetype前面都會對應有一個編號,同時命令行會提示一個默認的編號,其對應的archetype為maven-archetype-quickstart,我們直接回車以選擇該archetype,緊接著Maven會提示我們輸入要創(chuàng)建項目的groupId、artifactId、version、以及包名package,如下輸入并確認:Java代碼DefinevalueforgroupId::DefinevalueforartifactId::o-Definevalueforversion:1.0-SNAPSHOT:Definevalueforpackage:com.juvenxu.mvnbook::com.juvenxu.mvnbook.ConfirmpropertiesgroupId:artifactId:o-version:1.0-Y::Archetype插件將根據(jù)我們提供的信息創(chuàng)建項目骨架。在當 下,Archetype插件會創(chuàng)建一個名o-world(artifactId)的子,從中可以看到項目的基本結構:基本的pom.xml已經(jīng)被創(chuàng)建,里junit依賴;主代碼src/main/javaJava類com.juvenxu.mvnbook.oworld.App,注意這里使用到了我們剛才定義的包名,而這個類也僅僅只有一個簡單的輸出oWorld!的main方法;測試代碼目錄src/test/java也被創(chuàng)建好了,并且包含了一個測試用例com.juvenxu.mvnbook.oworld.AppTest。的基礎上開發(fā)oWorld項目以節(jié)省我們大量時間。archetypearchetype來快速生成項目骨架,本書后面的章節(jié)會詳細闡述如何開發(fā)MavenArchetype。3.6m

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論