![apache mavenMaven權威指南是一本關于ApacheMaven書_第1頁](http://file4.renrendoc.com/view/6a4cd9e968666f83b80147bb95f1fc5b/6a4cd9e968666f83b80147bb95f1fc5b1.gif)
![apache mavenMaven權威指南是一本關于ApacheMaven書_第2頁](http://file4.renrendoc.com/view/6a4cd9e968666f83b80147bb95f1fc5b/6a4cd9e968666f83b80147bb95f1fc5b2.gif)
![apache mavenMaven權威指南是一本關于ApacheMaven書_第3頁](http://file4.renrendoc.com/view/6a4cd9e968666f83b80147bb95f1fc5b/6a4cd9e968666f83b80147bb95f1fc5b3.gif)
![apache mavenMaven權威指南是一本關于ApacheMaven書_第4頁](http://file4.renrendoc.com/view/6a4cd9e968666f83b80147bb95f1fc5b/6a4cd9e968666f83b80147bb95f1fc5b4.gif)
![apache mavenMaven權威指南是一本關于ApacheMaven書_第5頁](http://file4.renrendoc.com/view/6a4cd9e968666f83b80147bb95f1fc5b/6a4cd9e968666f83b80147bb95f1fc5b5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Maven指TimO'Brien(Sonatype,Inc.),JohnCasey(Sonatype,Inc.),BrianFox(Sonatype,Inc.),BruceSnyder(),JasonVanZyl(Sonatype,Inc.),JuvenXu()CreativeCommonsBY-ND-NCForeword:Beta0.16HowtoUsethisYourFontMavenWritingApache在MacOSX上安裝在Windows上安裝3.1.1.本章的例Maven(Pluginsand(SiteGenerationand4.1.1.本章樣Yahoo!WeatherMavenExec5.1.1.本章樣6.1.1.本章樣7.1.1.本章樣LATESTRELEASE屬性多模塊vsMavenProcessProcessTestTest構建激活外部Settings全局SettingsMavenAssemblyPredefinedAssemblyBuildinganAssembliesasAssemblingAssembliesviaAssemblyOverviewoftheAssemblyTheAssemblyPropertyReferencesinAssemblyRequiredAssemblyControllingtheContentsofanFilesFileSetsDefaultExclusionPatternsforCustomizingDependencyOutputInterpolationofPropertiesinDependencyOutputIncludingandExcludingDependenciesbyFineTuning:DependencyIncludesandTransitiveDependencies,Project ents,andProjectAdvancedUnpackingSummarizingDependencymoduleSetsModuleSourcesInterpolationofoutputDirectoryMapinBinariesmoduleSets,ParentPOMsandthebinariesRepositoriesManagingtheAssembly’sRootcomponentDescriptorsandBestStandard,ReusableAssembly:m2eclipseAspectJToolsPlatformWebToolsPlatformMavenSCMMaven創(chuàng)建一個MavenMavenJavaMaven站 結 模創(chuàng)建自定義的安裝從Sonatype使用配置.定務器配部署第構WritingWhatisInversionofIntroductiontoWhyWhatisaPluginTop-levelPluginDescriptorMojoPluginWritingaCustomCreatingaPluginASimpleJavaConfiguringaPluginLoggingfromaMojoClassWhenaMojoMojoSupplyingValuesforMojoMulti-valuedMojoDependingonPlexusMojoParameterPluginsandtheMavenExecutingaParallelCreatingaCustomOverridingtheDefaultWritingPluginsinAlternativeWritingPluginsinCreatinganAntWritingPluginsinCreatingaJRubyRubyMojoLoggingfromaRubyRaisingaReferencingPlexusComponentsfromWritingPluginsinCreatingaGroovyAppendix:SettingsQuickSettingsSimplePluginActiveAppendix:SunSpecificationListofsimple-weather和simple-persist令行應用maven-bookvs企業(yè)級多模塊vsAssemblyDescriptorMaterializingaMaven具體化Apache 16.2.用戶的Nexus界ListofDom4JJaxenVelocityLog4JSimpleWeatherWeatherSimpleWeatherMainSimpleWeatherYahooRetrieverSimpleWeatherYahooParserSimpleWeatherWeatherFormatterSimpleWeatherLog4JSimpleWeatherOutputVelocitySimpleWeatherYahooParserTestXMLMavenJettyJSP2.0WeatherServiceWeatherServicesimple-persistSpringApplicationmandmandMainweather.vmVelocityhistory.vmVelocitymand指定一個依賴界限:JUnit3.8JUnit指定一個依賴界限:JUnit為AdobeFlexSWF)過濾資 定義用戶特定的SettingProfile~定義激活的Settings/AssemblyDescriptorforExecutableConfiguringtheprojectassemblyintop-levelActivatingtheAssemblyPluginConfigurationinChildPOMfortheAssemblyBundlingRequiredAssemblyDescriptorIncludingaJARfileinanAssemblyusingIncludingFileswithDefinitionofDefaultExclusionPatternsfromPlexusDefiningDependencySetsUsingUsingDependencyExcludesandIncludesinExcludingFilesfromaDependencyIncludesandExcludingModuleswithaIncludingJavaDocfromModulesinanIncludingModuleArtifactsandDependenciesinan在資源中Maven屬 為Nexus配置MavenSettings~OracleJDBCJARPluginAPluginProject'sASimpleMavenMetadatafortheMavenPluginCustomizingthePluginGroupsinMavenConfiguringaPluginAPluginwithMulti-valuedDependingonaPlexusDefineaCustomLifecycleinForkingaCustomerLifecyclefromaOverridingtheDefaultConfiguringaPluginasanPOMforanAntMavenEchoAntEchoAntMojoPOMforaJRubyMavenTheEchoRubyReferencingaMavenProjectfromaRubyRaisingaMojoErrorfromaRubyDependingonaPlexusComponentfromaRubyPOMforaGroovyMavenPluginOverviewoftop-levelelementsinSimpletop-levelelementsinServerconfigurationinMirrorconfigurationinProxyconfigurationinDefiningActivationParametersinSettingthe${user.install}propertyinRepositoryConfigurationinSettingactiveprofilesinAddingJTA1.0.1BtoaMavenChapter1介紹ApacheMavenMaven...它是什么像Ant這樣的構建工具僅僅是關注預處理,編譯,打包,測試和分發(fā)。像Maven一個更正式的ApacheMavenMaven是一個項目管理工具,它包含了一個項目對象模型(ProjectObjectModel),一組標準集合,一個項目生命周期(ProjectMaven來構建和分發(fā)你的項目。約定優(yōu)于配置(ConventionOverRubyonRailsEJB3已經(jīng)開始堅持這些原則,以對像原始的EJB2.1EJB3持久化,將一個特殊的Bean@Entity。${basedir}/src/test。項目假定會產(chǎn)生一個JAR文件。${basedir}/target創(chuàng)建一個可分發(fā)的JAR 。 位置 當然Maven有一些觀點不應該被懷疑,但是其實很多默認行為還是可配置的。Maven也會允許你自定義默認值來適應你的需求。在2001年,構建一個項目如TurbineTomcat,兩者方法是完全不同的。如果一個新的進行靜態(tài)源碼分析的源碼分析工具面世了,或者爭論所描述刻畫。Maven之前的時代是低效率的時代,是“構建工程師”的時代。ServiceMix,然后從源碼進行構建,你需要為每個項目留出一個小時來理解給它的構建系統(tǒng)。這個mvninstallMaven有很多優(yōu)點,包括依賴管理和通過插件重用一般的構建邏輯,但它成功的最原因是它定義了構建軟件的一般的接口。每當你看到一個使用MavenApache基于MavenMaven的其實不做什么實際的事情,除了解析一些文檔,管理生命周期與插件之外,它什么也不懂。MavenMaven插件,這些插件可以影響Maven生命周期,提供對目標的。絕大多數(shù)Maven的動作發(fā)生于MavenApacheMaven不知道如何打包WAR安裝運行諸如mvninstall命令的時候,它會從Maven倉庫大部分插件。這不僅僅是一個最小化從倉庫獲取依賴和插件的這一事實允許了構建邏輯的全局性重用。MavenSurefire1.0發(fā)展到目前廣泛使用的在Surefire插件編譯運行你的JUnit3單元測試,然后你升級到了版本的運行單元測試,那么感謝Surefire插件的者,你已經(jīng)可以使用了。你也能運行支持注解的JUnit4單元測試。不用升級這種機制不僅僅適用于Surefire插件,項目使用Compiler插件進行編譯,通過Jar插件變成文件,還有一些插件生成報告,運行JRubyMaven插件獲益,這些插件有人,可以從倉庫到。這就是基于Maven插件的全局性重用一個“項目”為項目指定一組唯一的坐標。你要描述項目的的屬性。項目的僅是一個“構建工具”,它不僅僅是在類似于makeAnt用這些坐標來依賴。IDEMaven是Ant當然,MavenAnt的另一種選擇,但是Apache構建的者,而你很容易的在你項目的Maven構建中集成Ant構建。這是不僅僅是一個工具,它更是一個平臺,當你只是將MavenAnt有一個觀點使得所有的關于Maven和.Ant,Maven和Buildr,Maven和 涉及的比構建工具本身多得多。當本書討論Maven的時候,它也設計到支持的軟件,系統(tǒng)和標準。Buildr,Ivy,Gradle,所有這些工具都和太大關系?!罢l是勝利者?Ant還是構建的基本技術,MavenAnt的更好選擇;同時,Maven的邊界在持續(xù)的移動,Maven的財產(chǎn)是性構建,依賴管理,倉庫管理,基于插件的高度和重用,但是當前,和開源社區(qū)比較Maven和copyjavacjar任務。在你使用Ant的時候,你為Example1.1Antbuild.xml<projectname="my-project"default="dist"simpleexamplebuild<!--setglobalpropertiesforthisbuild--<propertyname="src"<propertyname="build"<propertyname="dist"<target<!--Createthetimestamp--<!--Createthebuilddirectorystructureusedbycompile--<mkdir<targetname="compile"depends="init"description="compilethesource"><!--Compilethejavacodefrom${src}into${build}--<javacsrcdir="${src}"<targetname="dist"depends="compile"description="generatethedistribution"><!--Createthedistributiondirectory--<mkdir<!--Puteverythingin${build}intotheMyProject-${DSTAMP}.jarfile--><jarjarfile="${dist}/lib/MyProject-${DSTAMP}.jar"<targetname="clean"description="cleanup"><!--Deletethe${build}and${dist}directorytrees--<delete<delete在這個簡單的AntAnt。你必須明確告訴Ant減少程序,但一個開發(fā)者對AntMavenAnt樣例做個比較。在Maven中,要從Java源碼創(chuàng)建一個${basedir}/src/main/javamvninstall。下面的樣例MavenExample1.2MavenJAR,然后把這個 找到一個index.html文件,這個文件了JAR的項目。一個遵循Mavenpom.xmlMavenPOM項目的構建文件的信息是完全不同的。MavenPOM包含:“這是一個JAR項目”,“源代碼在 ”。Ant構建文件包含顯式的指令:“這是一個項目”,“源代碼在src/main/java”,“針對這個 運行javac”,“把結果放到target/classes”,“從……創(chuàng)建一個JAR,等等。AntAntMaven的區(qū)別是:Apache 結構,你必須明確的告訴Apachetarget/classestarget生成一個JAR Mavenmvninstall的時候被調用。這條命令告訴Maven運行了許多默認的插件目標,這些目標完成了像編譯和創(chuàng)建一個${basedir}/src/test/java,添加一個對于TestNGJUnitJAR,你需要做的是改變你的項目類型為war,然后文檔 ${basedir}/src/main/webapp。當然,你可以用做這些事情,但是你將需要從零開始寫這些指令。使用Ant,你首先需要確定JUnit文件應該放在哪里,然后你需要創(chuàng)建一個包含這個JUnitJAR文件的classpath,然后告訴MavenPOM,相對于XML。Maven的另一個優(yōu)點是它依靠廣泛公用的些Ant通過一種明確的方法完成一個明確的過程,而這種過程不適合Maven標準,你仍然可以在Maven中用這些。作為一個Maven的插件,還是可用的。自定義的插件可以用Ant來實現(xiàn),Maven項目可以配置成在生命周期中運行的總MavenChapter2.安裝和運行.2.2.在MacOSX上安裝 驗證你的Java%java-javaversionJava(TM)SERuntimeEnvironment(build1.6.0_02-JavaHotSpot(TM)ClientVM(build1.6.0_02-b06,mixedmode,試的。如果你正在使用Linux,你可能需要自己Sun的JDK,并且確定JDK的版本(運行java-當你Maven的時候,確認你選擇了版本的ApacheMaven。本書書寫的時候版本是Maven2.0.9。如果你不熟悉Apache軟件證,你需要在使用產(chǎn)品之前去熟悉該證的條款。的關于Apache軟件證的信息可以Section2.8,“關于Apache軟件證”找到。安裝在MacOSX上安裝2.0.9;你可能會需要創(chuàng)建一個符號,那樣就能更容易使用,當你升級Maven的時候也不再需要/usr/local%ln-smaven-2.0.9/usr/local%export/usr/local%export ven2.0.9,因為隨著Maven2.0.9的發(fā)布很多bug被修正了,還有很多改進。exportM2_HOME=/usr/local/mavenexportPATH=${M2_HOME}/bin:${PATH} c:\ProgramFiles\maven-2.0.9,但是,只要你設置的正確的環(huán)境變量,把Maven安裝到其它 C:\Users\tobrien>setM2_HOME=c:\ProgramFiles\maven-C:\Users\tobrien>set,“遵循Section2.3.1在驗證Maven當Mavenmvn$mvn-MavenMaven/usr/local/maven$ls-LICENSE.txt包含了ApacheMaven的軟件 證。Section2.8, 是你本地的倉庫。當你從Maven倉庫依賴的時候,Maven在你本地倉庫 s上,我們?nèi)匀皇褂脋來表示你的home 。在WindowsXP上,你的home sandSettings\tobrien,在Windows 升級cton..,“在c上安裝avn”和cton..,“Linu上安裝aen,在c或者nixaveaenaen(n)aen(n-),然將符n從n9改成如果你在Windows上安裝了Maven,將Mavenc:\ProgramFiles\maven-獲得Maven雖然本書的目的是作為一本全面的參考手冊,但是仍然會有一些我們會不遺漏,一些特殊情你個自定義的搜索框,以用來搜索已有的Maven站點MavenUserMailing f178html。你也可以按照這里的指令來加入用戶郵件列表:listshtml。
使用MavenHelp目標。MavenHelp插件能讓你列出活動的MavenProfile,顯示一個實際POM(effectivePOM),打印實際settings(effectivesettings),或者列出Maven插件的屬性?!? 最后一個目標describe——相對比較復雜,展示某個插件或者插件目標的相關信息。, help:describeplugin參數(shù)你可以指定你想要研究哪個插件,你可以傳入插件的前綴(helpmaven-help-plugin),groupId:artifact[:versionversion是可選的。比如,下面令使用help插件的describe目標來輸出MavenHelp插件的信息$mvnhelp:describe-GroupId:org.apache.maven.pluginsArtifactId:maven-help-plugin GoalPrefix:helpTheMavenHelppluginprovidesgoalsaimedatheltomakesenseoutthebuildenvironment.ItincludestheabilitytoviewtheeffectivePOMandsettingsfiles,afterinheritanceandactiveprofileshavebeenapplied,aswellasadescribeaparticularplugingoaltousage助,你通常還是需要了解的詳情。如果你想要Help$mvnhelp:describe-Dplugin=help-GroupId:org.apache.maven.pluginsArtifactId:maven-help-plugin GoalPrefix:helpTheMavenHelppluginprovidesgoalsaimedatheltomakesenseoutthebuildenvironment.ItincludestheabilitytoviewtheeffectivePOMandsettingsfiles,afterinheritanceandactiveprofileshavebeenapplied,aswellasadescribeaparticularplugingoaltogiveusageGoal:'active-ListstheprofileswhicharecurrentlyactiveforthisImplementation:org.apache.maven.plugins.help.ActiveProfilesMojoLanguage:javaName:outputType:java.io.FileRequired:falseDirectlyeditable:trueThisisanoptionalparameterforafiledestinationfortheoutputofthismojo...thelistingofactiveprofilesperName:projectsType:java.util.ListRequired:trueDirectlyeditable:falseThisisthelistofprojectscurrentlyslatedtobebuiltbyThismojodoesn'thaveanycomponent...removedtheothergoals取單個目標的信息,設置mojo參數(shù)和plugin參數(shù)。下面令列出了Compiler插件的compile目標的所有信息$mvn pile-關于Apache軟件。 它允許?自由的和使用Apache軟件,無論是軟件的整體還是部分,在你創(chuàng)建的類庫或分發(fā)版本里使用Apache 軟 軟 它要求在你重新分發(fā)的包含Apache軟件的軟件里,包含一份該證的副本對于任何包含Apache它不要求你提交你對軟件的改動至Apache軟件(雖然我們鼓勵這種反饋)PartIMaven實的參考書,或者“動物”書,提供全面的材料,覆蓋了整個的課題。兩種書都有優(yōu)缺點,因此只不同的想法:數(shù)百的的開發(fā)人員有著不同的書寫風格,語氣以其方言。除去很多好心的所做本書想要改變這種情況,通過提供,第一:在PartI,“習Maven的很有價值的材料。在本書的第一部分中我們“邊做邊介紹”,然后在PartII,“MavenReference”中我們填充空白,鉆研細節(jié),介紹那些Maven新手不感的高級話題。PartII,“MavenReference”可能使用與樣例項目無關的一個參考列表和一程序列表,而PartI,插件來開始自定義你的項目,或者想了解特定插件細節(jié)的時候,才可能需要回到PartII,“MavenTableof3.1.1.本章的例Maven(Pluginsand(SiteGenerationand4.1.1.本章樣Yahoo!WeatherMavenExec5.1.1.本章樣6.1.1.本章樣7.1.1.本章樣Chapter3.一個簡單的Maven3.1.1.本章的例Maven(Pluginsand(SiteGenerationand簡在后介紹一些使Maven成為一個可靠的構建平臺的概念。讀完本章后,你將會對構建生命周期(buildlifecycle),Maven(repositories)(dependencymanagement)和項目對象模型(ProjectObjectModel)有一個基本的理解。3.1.1.本章的例,你應該不需要這些例子來重新創(chuàng)建那些Maven已經(jīng)生成好的代碼。會使用Maven $mvnarchetype:create-DgroupId=org.sonatype.mavenbook.ch03-DartifactId=simple[INFO]Scanningfor[INFO]Searchingrepositoryforpluginwithprefix:'archetype'.[INFO]artifactorg.apache.maven.plugins:maven-archetype-plugin:checkingfor\updatesfromcentral[INFO]BuildingMavenDefault task-segment:[archetype:create](aggregator-style)[INFO][INFO]artifactorg.apache.maven.archetypes:maven-archetype-\checkingforupdatesfrom[INFO]Parameter:groupId,Value:org.sonatype.mavenbook.ch03[INFO]Parameter:packageName,Value:org.sonatype.mavenbook[INFO]Parameter:basedir,Value:/Users/tobrien/svnw/sonatype/examples[INFO]Parameter:package,Value:org.sonatype.mavenbook[INFO]Parameter:version,Value:1.0-SNAPSHOT[INFO]Parameter:artifactId,Value:simple[INFO]*EndofdebuginfofromresourcesfromgeneratedPOM*[INFO]Archetypecreatedindir:mvn是Maven2令。archetype:create稱為一個Maven目標(goal)。如果你熟悉Apacheofwork)。而像-Dname=value這樣的對是將會被傳到目標中的參數(shù),它們使用- MavenArchtype插件創(chuàng)建了一個與artifactId匹配的 我們項目的源碼了資源文件被放在了src/main下面。在我們簡單Java項目這樣的情況下,這個包含了一下java類和一些配置文件。在其它的項目中,它可能是web應用的文檔根,或者還放一些應用服務器的配置文件。在一個Java項目中,Java類放在src/mai我們項目的測試用例放在src/test下。在這個下面,src/test/java存放像使用JUnit或者TestNG這樣的Java測試類。src/test/resources下存放測試classpath資源文package*o*publicclass{publicstaticvoidmain(String[]args{System.out.println( oWorld!"}} ,“ 下運行mvninstall。$mvn[INFO]Scanningforprojects...[INFO]Building task-segment:[install][INFO][INFO]Usingdefaultencodingtocopyfiltered[INFO] [INFO]Compiling1sourcefileto/simple/target/classes[INFO][resources:testResources][INFO]Usingdefaultencodingtocopyfilteredresources.[INFO][ [INFO]Compiling1sourcefileto/simple/target/test-classes[INFO][surefire:test][INFO]Surefirereportdirectory:/simple/target/surefire-TESTRunningTestsrun:1,Failures:0,Errors:0,Skipped:0,Timeelapsed:0.105ResultsTestsrun:1,Failures:0,Errors:0,Skipped:0[INFO][jar:jar][INFO]Buildingjar:/simple/target/simple-1.0-SNAPSHOT.jar[INFO][install:install][INFO]Installing/simple/target/simple-1.0-SNAPSHOT.jarto~/.m2/repository/org/sonatype/mavenbook/ch03/simple/1.0-SNAPSHOT/\$java-cptarget/simple-1.0-SNAPSHOT.jaro(ProjectObjectavenArchetype插件的create目標創(chuàng)建的默認的pom.xml文件。Example3.1Simplepom.xml<project<project"packaging,version——是avn(cordnae)和是ebepndeces(tet- 下跑下面令$mvnhelp:effective-概 ?什么是生命周期?什么是“本地倉庫”?下面的小結闡述了一些Maven的概念Maven(Pluginsand$mvnarchetype:create-DgroupId=org.sonatype.mavenbook.ch03-DartifactId=simple[INFO][INFO]artifactorg.apache.maven.archetypes:maven-archetype-\checkingforupdatesfrom的插件可以用Java編寫,或者用一些其它的語言如Ant,Groovy,beans Figure3.1.目標一起運行。一個目標是Maven中的一個“工作單元(unitofwork)”。目標的例子包括插件中的pile目標,它用來編譯項目中的所有源文件,或者例如,插件的pile目標定義了一組配置參數(shù),它們允許你設置目標JDK版本或者選擇一個artifactId。這是我們對于約定優(yōu)于配置(conventionoverarcetpecetye得多但是是一快速始新目的錯方法。本書后面會讓看到chtypebcetye 給了Maven插件,像Compiler插件和Jar插件,它們在需要的時候被 你Maven的時候,你得到的是一個包含了基本軀殼的Maven,它知道如何解析命令行,管件,在需要的時候插件。通過保 果你不喜歡這個Compiler插件,你可以用你的實現(xiàn)來覆蓋它)。一個WAR文件。Figure3.2,Figure3.2.Figure3.3. 。 Figure3.4.mvnresources:resourcespile\resources:testResources\pilesurefire:test\項目的性描述。當Maven運行一個目標的時候,每個目標都會定義在項目POM里的信息。 來找出這個文件的名字。當?shù)摹OM為項目命名,提供了項目的一組唯一標識符(坐標)(dependencies,父(parents)(prerequisite)Figure3.5.一個Maven,件或者父項目和另外一個項目關聯(lián)的時候,Maven通過坐標來精確定位一個項目。Maven坐標d 樣的groupId,artifactId和version標識的項目。在Figure3.6.Maven當你第一次運行Maven的時候,你會注意到Maven從一個的Maven倉庫了許多文件。如果這需要的時候從的倉庫取來的。初始的Maven包的大小相當?shù)男。?.8兆),其中一個原因是幾近的最少值,而在需要的時候再從倉庫去取。Maven自帶了一個用來Maven插件和依賴的倉庫地址(/maven2)。你是 開瀏覽器,然后瀏覽Maven倉庫 倉庫構件和插件到你本機上, 然后才是其它地方。在WindowsXP上,你的本地倉庫很可能在C:\ sand$mvn[INFO][INFO]Installing.../simple-1.0-SNAPSHOT.jarto~/.m2/repository/org/sonatype/mavenbook/simple/1.0-SNAPSHOT/\程倉庫的構件的緩存,也允許你的項目相互依賴。depndeces)(pring或者berae)aenaen賴中同時讓你定義認行,者排除些特的傳性依。 ,還有ve用來證已構準確校驗和件。要注的是ave不只下載JitJ文件它同為這Jit賴了一文件。aen時構件和文aen當你把目的件安到本倉庫,你發(fā)現(xiàn)JR文件一 下,ve發(fā)布一個微修改過的的版。件在庫里給其它目了項目信息其中重要的就是有哪依賴如果目賴于目,么也依賴項目依賴當aen過一組ave坐標處理賴構的時,它會獲取通依賴的尋找遞性賴。些傳性依賴會被加到前項的依列表。在Maven中一個依賴不僅僅是一個JAR。它是一個POM文件,這個POM可能也了對其它構件的依賴。這些依賴的依賴叫做傳遞性依賴,Maven倉庫不僅僅存貯二進制文件,也了這些構建的Figure3.7.MavenHibernate,ApacheStrutsSpring范圍是test。當一個依賴的范圍是test的時候,說明它在插件運行pile目標的時候 編譯的時候需要,但是它不應該被在構建的輸出中。當你開發(fā)web應用的時候provided范圍變得十分有用,你需要通過ServletAPI來編譯你的代碼,但是你不希望Servlet 中(SiteGenerationand $mvn 。TML源代碼相互間,這在代碼的時候非常有用,PMD報告針對各種編碼問題來分析源代小我[1]“java-help”查看Java的解釋。Maven的bin Chapter4.定制一個Maven4.1.1.本章樣Yahoo!WeatherMavenExec介MavenMaven開始創(chuàng)建真正的項目。4.1.1.本章樣本章開發(fā)一個和Yahoo!Weather服務交互的實用程序。雖然沒有樣例源碼你也應該能夠理解這個開發(fā)過程,但還是推薦你本章本章的樣例項目包含在本書的樣例代碼中,你可以從兩個地方,http: mvn-examples-1.0.zip或者http: 。在 ,它包含了本章開發(fā)出來的 1.0,然后點擊 定義SimpleWeather在定制本項目之前,讓我們退后一步,討論下這個simpleweathersimpleMaven特征的樣例。simpleweather是一個基本令行驅動的應用程序,它接受輸入,然后從Yahoo!WeatherRSS首先,它很直觀;用戶通過命令行提供輸入,程序,對Yahoo!WeatherXML解析和一些日志語句。Velocity,Dom4jLog4jMaven,但我們不會回避那些介紹有趣工具的機會。Yahoo!Weather在開始構建這個應用之前,你需要了解一下Yahoo!WeatherYahoo!Weather連接你數(shù)據(jù)源應用的權限。”換句話說,如果你考慮集成該數(shù)據(jù)源到你的商業(yè)本章我們提倡的使用是個人教育用途。要了解的Yahoo!Weather服務條款,請參考Yahoo!WeatherAPI文檔:http://d /weather/。創(chuàng)建SimpleWeather首先,讓我們用MavenArchetype插件創(chuàng)建這個simpleweather項目的基本輪廓。$mvnarchetype:create-DgroupId=org.sonatype.mavenbook.ch04\[INFO]
[INFO]artifactorg.apache.maven.archetypes:maven-archetype-\checkingforupdatesfromcentral[INFO]UsingfollowingparametersforcreatingArchetype:\[INFO]Parameter:groupId,Value:org.sonatype.mavenbook.ch04[INFO]Parameter:packageName,Value:org.sonatype.mavenbook[INFO]Parameter:basedir,Value:~/examples[INFO]Parameter:package,Value:org.sonatype.mavenbook[INFO]Parameter:version,Value:1.0[INFO]Parameter:artifactId,Value:simple-[INFO]***EndofdebuginfofromresourcesfromgeneratedPOM***[INFO]Archetypecreatedindir:~/examples/simple-weather Example4.1simple-wheather<project archetype:createversion1.0-weather1.0版本。XML。Example4.2pom.xml<project <name>Apache <comments>Abusiness-friendlyOSS <name>JasonVan ,“元素的開始后面跟著“…”或者在project元素的結束前“…”Simpleweather應用程序必須要完成以下三個任務:從Yahoo!WeatherXML引入一些新的依賴。為了解析來自Yahoo!的XML響應,會使用Dom4JJaxen,為了格式化這個命令行程序的輸出,會使用Velocity,我們還需要加入對的依賴,用來做日志。加入這些依賴之后,我們的dependenciesExample4.3Dom4JJaxenVelocityLog4J正如你從上面所看到的,我們在范圍為test的JUnit依賴基礎上又加了四個依賴元素。如果你把這些依賴添加到項目的pom.xml文件然后運行mvninstall,你會看到Maven這些依賴及其它傳遞性依賴到你的本地Maven倉庫。我們?nèi)绾握疫@些依賴呢?我們都“知道”適當?shù)膅roupId和artifactId的值嗎?有些依賴(像Log4J被廣泛使用,以至于每次你需要使用它們的時候你都會記得它們的groupId和artifactId。而Velocity,Dom4J和Jaxen是通過一個十分有用的站點來定位的。該站點提供了針對Maven倉庫的搜索接口,你可以用它來搜索依賴。你可以自己測試一下,載入然后搜索一些常用的類庫,如Hibernate或者SpringFramework。當你在這上面搜索構件時,它會顯示一個artifactId和所有Maven 所知道的版本。點擊某個特定的版本后,它會載入一個頁面,這個頁面就包括了你需要 自己項目pom.xml中的依賴元素。你經(jīng)常會發(fā)現(xiàn)某個特定的類庫擁有多于一個的groupId, SimpleWeather命令行應用程序包含五個JavaWeather類是個很簡單的JavaYahooParser解析來自YahooWeatherXMLWeathersimple-weather 在src/main/java $cd$rm$cd$cd$rm$mkdir$cd Example4.4SimpleWeatherWeatherpackagepublicclassWeather{privateStringcity;privateStringregion;privateStringcountry;privateStringcondition;privateStringtemp;privateStringchill;privateStringpublicWeather()publicStringgetCity(){returncity;publicvoidsetCity(Stringcity){this.city=city;publicStringgetRegion(){returnregion;publicvoidsetRegion(Stringregion){this.region=region;publicStringgetCountry(){returncountry;publicvoidsetCountry(Stringcountry){this.country=country;publicStringgetCondition(){returncondition;publicvoidsetCondition(Stringcondition){this.condition=condition;}publicStringgetTemp(){returntemp;publicvoidsetTemp(Stringtemp){this.temp=temp;publicStringgetChill(){returnchill;publicvoidsetChill(Stringchill){this.chill=chill;publicStringgetHumidity(){returnhumidity;publicvoidsetHumidity(Stringhumidity){this.humidity=humidity;}Weather類定義了一個簡單的bean,用來由Yahoo!Weather 下,創(chuàng)建Main.java文件。Main這個類有一個靜態(tài)的main()函數(shù)——Example4.5SimpleWeatherMainpackageimportimportpublicclassMainpublicstaticvoidmain(String[]args)throwsException//Configure//ReadtheZipCodefromtheCommand-line(ifnoned,useintzipcode=tryzipcode=}catch(Exceptione)//Startthenew}privateintpublicMain(intzip)this.zip=}publicvoidstart()throwsException//RetrieveInputStreamdataIn=newYahooRetriever().retrieve(zip//ParseWeatherweather=newYahooParser().parse(dataIn//Format(Print)System.out.print(newWeatherFormatter().format(weather)}}main(函數(shù)通過獲取classpath如果 的時候拋出了異常,程序會設置默認為60202一旦有 調用YahooRetriever來獲取天氣的XML數(shù)據(jù)。YahooRetriever返回一個InputStreem,傳給YahooParser。YahooParser解析XML數(shù)據(jù)并返回Weather對象。最后,WeatherFormatter接受一個Weather對象并返回一個格式化的在相 Example4.6SimpleWeatherYahooRetrieverpackageimportimportimport.URLConnection;importorg.apache.log4j.Logger;publicclassYahooRetriever{privatestaticLoggerlog=publicInputStreamretrieve(intzipcode)throwsException{("RetrievingWeatherData");Stringurl= /forecastrss?p="+URLConnectionconn=newreturn}}這個簡單的類打開接到Yahoo!WeatherAPI的URLConnection并返回一 下創(chuàng)建文件YahooParser.java用以解析這個數(shù)據(jù)源Example4.7SimpleWeatherYahooParserpackageimportjava.io.InputStream;importjava.util.HashMap;importjava.util.Map;importimport import importpublicclassYahooParserprivatestaticLoggerlog=publicWeatherparse(InputStreaminputStream)throwsException{Weatherweather=newWeather();("CreatingXMLReader");SAXReaderxmlReader=createXmlReader();doc=xmlReader.read(inputStream);("ParsingXMLResponse"weather.setCity(doc.valueOf("/rss/channel/y:location/@city"));weather.setRegion(doc.valueOf("/rss/channel/y:location/@region"));weather.setCountry(doc.valueOf("/rss/channel/y:location/@country"));weather.setCondition(doc.valueOf("/rss/channel/item/y:condition/@text")weather.setTemp(doc.valueOf("/rss/channel/item/y:condition/@temp"));weather.setChill(doc.valueOf("/rss/channel/y:wind/@chill"));weather.setHumidity(return}privateSAXReadercreateXmlReader()Map<String,String>uris=newHashMap<String,String>();uris.put("y"," Factoryfactory=new factory.setXPathNamespaceURIs(uris);SAXReaderxmlReader=newSAXReader();xmlReader.setFactory(factory);returnxmlReader;}}YahooParser是本例中最復雜的類,我們不會深入Dom4JWeatherDom4J文檔。因為我們對Yahoo!WeatherXML命名空間的元素感,我們需要用createXmlReader()方法創(chuàng)建一個包含命名空間信息的SAXReader。一旦我們創(chuàng)建了這個reader并且解析了文檔,得到了返回的org.dom4j. ,只需要簡單的使用XPathJaxen提供了XPath功能。(源碼網(wǎng) Example4.8SimpleWeatherWeatherFormatterpackageimportimportimportimportimportimportpublicclassWeatherFormatterprivatestaticLoggerlog=publicStringformat(Weatherweather)throwsException{("FormattingWeatherData");ReaderreadernewInputStreamReader(VelocityContextcontext=newVelocityContext();context.put("weather",weather);StringWriterwriter=newStringWriter();Velocity.evaluate(context,writer,"",reader);returnwriter.toString();}}WeatherFormatterVeloticy來呈現(xiàn)一個模板。format(WeatherbeanString。format(方法做的第一件事是從classpath載入名字為output.vmVelocityVelocityContextWeatherVelocity.evaluate(,給模板賦值,結果作為String在我們能夠運行該樣例程序之前,我們需要往classpath本項目依賴于兩個classpathMainclasspathlog4j.preopertiesLog4J,WeatherFormatter了一個在classpath中的名為output.vm的模板。這兩個資源都需要在默認包中(或者classpath的 $cd$mkdir$cd Example4.9.SimpleWeatherLog4J#SetrootcategoryprioritytoINFOanditsonlyappendertoCONSOLE.log4j.rootCategory=INFO,CONSOLE#CONSOLEissettobeaConsoleAppenderusingaPatternLayout.log4j.appender.CONSOLE.layout.ConversionPattern=%-4r%-5p%c{1}%x-output.vm,它是這個命令行程序用來呈現(xiàn)輸出的Velocity模板。在 Example4.10SimpleWeatherOutputVelocityCurrentWeatherConditionsfor:${weather.city},${weather.region},Temperature:${weather.temp}Condition:${weather.condition}Humidity:${weather.humidity}WindChill:${weather.chill}運行SimpleWeatherCodehausMojo $mvn$mvnexec:java-[INFO] INFOYahooRetriever-RetrievingWeather134INFOYahooParser-CreatingXML333INFOYahooParser-ParsingXML420INFOWeatherFormatter-FormattingWeatherCurrentWeatherConditionsfor:Evanston,IL,Temperature:45Condition:CloudyHumidity:76WindChill:正如你能看到的,我們已經(jīng)成功的運行了SImpleWeather命令行工具,從Yahoo!獲取了一些數(shù)據(jù),解析了結果,并且通過Velocity格式化了結果數(shù)據(jù)。pom.xml添加了一些最少的配置。注意我們這里沒有引入“構建過程”Java我們所需要做的是包含一些依賴,用來定位合適的Maven坐標。MavenExecExec插件允許你運行Java類和其它。它不是Maven插件,但它可以從Codehaus的項目得到。想要查看Exec$mvnhelp:describe-Dplugin=exec-這會列出所有MavenExecHelp插件同時也會列出插件的有效參數(shù),如果你想要定制Exec插件很有用,在開發(fā)過程中用來運試之外,你不應該依賴它來運行你的應用程序。想要更健壯的解決方案,使用MavenAssembly插件,它在Section4.13,Exec插件讓我們能夠在不往classpath載入適當?shù)囊蕾嚨那闆r下,運行這個程序。在任何其它的構建系統(tǒng)能夠中,須所有程序依賴到類似于lib/ 包含一個JAR文件的集合。那樣,我們就必須寫一個簡單的,在javaorg.sonatypemavenbook.weather.MainExec能做這樣的工作是因為Maven已經(jīng)知道如何創(chuàng)建和管理你的classpath和你的依賴。了解你項目的classpath包含了哪些依賴是很方便也很有用的。這個項目不僅包含了一些類庫如Dom4JLog4JJaxenVelocityclasspathMavenDependencySimpleWeatherdependency:resolve目標。$mvn[INFO][dependency:resolve][INFO]Thefollowingfileshavebeen com.ibm.icu:icu4j:jar:2.6.1(scope= mons-collections:jar:3.1(scope= mons-lang:jar:2.1(scope=compile) dom4j:dom4j:jar:1.6.1(scope=compile) jaxen:jaxen:jar:1.1.1(scope=compile) jdom:jdom:jar:1.0(scope=compile) junit:junit:jar:3.8.1(scope=test) log4j:log4j:jar:1.2.14(scope=compile) oro:oro:jar:2.0.8(scope=compile) velocity:velocity:jar:1.5(scope=compile) xalan:xalan:jar:2.6.0(scope=compile) xerces:xercesImpl:jar:2.6.2(scope=compile) xerces:xmlParserAPIs:jar:2.6.2(scope=compile) xml-apis:xml-apis:jar:1.0.b2(scope=compile) xom:xom:jar:1.0(scope=compile)XercesXMLAPI,Jaxen依賴于Xalan,后者也就在classpathDependency$mvn[INFO][INFO]org.sonatype.mavenbook.ch04:simple-weather:jar:1.0[INFO]+-log4j:lo [INFO]+- [INFO]|\-xml-apis:xml-a [INFO]+-jaxen:j [INFO]|+- [INFO]|+-xerces:xerces [INFO]|\-x |+-|+-[INFO]| \-com.ibm.icu:i [INFO]+-velocity:ve [INFO]|+-commo [INFO]|+- [INFO]|\- [INFO]+- [INFO]\-junit:junit:jar:3.8.1:testMaven的調試標記運行:$mvninstall-[DEBUG]org.sonatype.mavenbook.ch04:simple-weather:jar:1.0(selectedfornull) pile(selectedfor pile(selectedfor pile(selectedforcompile) pile(selectedforcompile) pile(removed-causesacycleinthegraph) pile(removed-causesacycleinthegraph) pile(selectedforcompile) pile(removed-nearerfound:1.0.b2) pile(selectedforcompile) pile(selectedforcompile) pile(selectedfor pile(selectedforcompile) pile(selectedforcompile) pile(selectedforcompile) (selectedforcompile) pile(selectedfor pile(selectedforcompile) junit:junit:jar:3.8.1:test(selectedfortest)Maven正打印出你項目的所有的依賴,以及這些依賴的依賴(還有依賴的依賴的依賴)的完整的Mavensimple-weather依賴于jaxenjaxenxomxom正在創(chuàng)建一個依賴圖,排除重復,解決不同版本之間的。如果你的依賴有問題,通常在Maven內(nèi)建了對單元測試的支持,測試是MavenSimple$cd$cd$mkdir-p$cd目前,會創(chuàng)建兩個單元測試。第一個單元測試會測試YahooParser,第二個會測試WeatherFormatterweather包中,創(chuàng)建一個帶有一以下內(nèi)容的文件,名稱為YahooParserTest.java。Example4.11SimpleWeatherYahooParserTestpackageimportimportimportimportpublicclassYahooParserTestextendsTestCasepublicYahooParserTest(Stringname)}publicvoidtestParser()throwsException{InputStreamnyData=Weatherweather=newYahooParser().parse(nyData);assertEquals("NewYork",weather.getCity());assertEquals("NY",weather.getRegion());assertEquals("US",weather.getCountry());assertEquals("39",weather.getTemp());assertEquals("Fair",weather.getCondition());assertEquals("39",weather.getChill());assertEquals("67",weather.getHumidity());}}YahooParserTest繼承了JUnitTestCase測試的慣例模式:一個構造函數(shù)接受一個單獨的testParserXML文檔來測試YahooParserXMLny-weather.xmlclasspath項目 —Weather對象,該對象通過一系列由TestCase定義的assertEquals()調用而被測試。 下創(chuàng)建一個名為WeatherFormatterTest.java的文件。Example4.12SimpleWeatherWeatherFormatterTestpackageimport importimportimportimportpublicclassWeatherFormatterTestextendsTestCasepublicWeatherFormatterTest(Stringname)}publicvoidtestFormat()throwsException{InputStreamnyData=Weatherweather=newYahooParser().parse(nyData);StringformattedResult=newWeatherFormatter().format(weather);InputStreamexpected=assertEquals(IOUtils.toString(expected).trim(),formattedResult.trim());}}一樣,WeatherFormatter同樣也繼承JUnit的TestCase類。這個單獨的測試通過單元測試的classpath從${basedir}/src/test/resources的 ,“我們的期望輸出被在一個名為format-expected.dat的文件中,該文件存放在和ny-weather.xml同樣的 中。要比較測試輸出和期望輸出,期望輸出作為InputStream讀入,然后使用CommonsIO的IOUtils類來把文件轉化為String。然后使用assertEquals()比較這個String和測試輸出。WeatherFormatterTest中我們用了一個來自于ApacheCommonsIO的工具IOUtilsI/O操作。在這個單元測試中我們使用了IOUtils.toString()來classpath中資源format.expected.datStringCommonsIOInputStreamReader和StringWriter這樣的對象。我們使用CommonsIO的主要原因是,能有理由添加對CommonsIOExample4.13 ”一個單元測試需要針對測試的一組資源。通常你需要在測試中一些包含期望結果的文件,以及包含模擬輸入的文件。在本項目中,我們?yōu)閅ahooParserTestny-weather.xmlXML文檔,還有一個名為format-expected.datWeatherFormatter的期望輸出。 $cd$mkdir$cd Example4.14SimpleWeatherWeatherFormatterTestCurrentWeatherConditionsfor:NewYork,NY,Temperature:39Condition:FairHumidity:67WindChill:這個文件應該看起來很熟悉了,它和你用MavenExec插件運行Simple Example4.15SimpleWeatherYahooParserTestXML<?xmlversion="1.0"encoding="UTF-8"standalone="yes"<rss <title>Yahoo!Weather-NewYork, /dailynews/rss/weather/New_York<description>Yahoo!WeatherforNewYork,<lastBuildDate>Sat,10Nov20078:51pm<yweather:locationcity="N
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體育場地施工法律法規(guī)解讀考核試卷
- 樂器批發(fā)商的顧客關系管理提升路徑考核試卷
- 光伏開發(fā)合同范本
- 工程監(jiān)理工作方法及措施
- 技術服務財務分析與決策支持考核試卷
- 中介工資合同范本
- 修公路勞務合同范本
- 買房按揭買賣合同范本
- 2025-2030年新能源汽車文化傳播行業(yè)跨境出海戰(zhàn)略研究報告
- 2025-2030年數(shù)據(jù)中心能效服務企業(yè)制定與實施新質生產(chǎn)力戰(zhàn)略研究報告
- 2024政府采購評審專家考試真題庫及答案
- 2025年道路貨運駕駛員從業(yè)資格證模擬考試題
- 數(shù)學-安徽省皖南八校2025屆高三上學期12月第二次大聯(lián)考試題和答案
- 退市新規(guī)解讀-上海證券交易所、大同證券
- 融資報告范文模板
- 桃李面包盈利能力探析案例11000字
- GB/Z 30966.71-2024風能發(fā)電系統(tǒng)風力發(fā)電場監(jiān)控系統(tǒng)通信第71部分:配置描述語言
- 腦梗死的護理查房
- 2025高考數(shù)學專項復習:概率與統(tǒng)計的綜合應用(十八大題型)含答案
- 產(chǎn)后抑郁癥講課課件
- 2024-2030年中國紫蘇市場深度局勢分析及未來5發(fā)展趨勢報告
評論
0/150
提交評論