中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Maven技術(shù)解析

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

Maven簡(jiǎn)單介紹

Maven是一個(gè)項(xiàng)目管理工具。強(qiáng)大,但是很容易使用。

它包含了:

  • 一個(gè)項(xiàng)目對(duì)象模型 (Project Object Model);
  • 一組標(biāo)準(zhǔn)集合;
  • 一個(gè)項(xiàng)目生命周期(Project Lifecycle);
  • 一個(gè)依賴管理系統(tǒng)(Dependency Management System);
  • 用來(lái)運(yùn)行定義在生命周期階段(phase)中插件(plugin)目標(biāo)(goal)的邏輯。

當(dāng)你使用Maven的時(shí)候,你用一個(gè)明確定義的項(xiàng)目對(duì)象模型來(lái)描述你的項(xiàng)目,然后 Maven 可以應(yīng)用橫切的邏輯, 這些邏輯來(lái)自一組共享的(或者自定義的)插件。

如果看完簡(jiǎn)介,你還迷糊的,那么我想說(shuō):這很正常!請(qǐng)心無(wú)旁騖地往下看,學(xué)習(xí)完這個(gè)入門(mén)教程,該懂的你就都懂了。

溫馨提示:本文的最后一個(gè)主題是個(gè)動(dòng)手示例,如果大段的文字定義讓你非常沒(méi)有效率,那么,你可以在任何時(shí)候先來(lái)動(dòng)手完成這個(gè)示例。找找感覺(jué),然后再來(lái)看這些枯燥的定義。

掃清障礙

學(xué)習(xí)新技能的時(shí)候,有太多的內(nèi)容需要去探索,快速有效的獲取信息非常重要。掌握下邊兩個(gè)方法,可以助你快速掌握maven。

help 插件的使用方法

tags:maven help

目的:使用help插件,配合不同的參數(shù),查看maven插件的相關(guān)信息。

  • 命令:mvn help:describe -Dplugin=插件名稱或mvn 插件名稱:help
    作用:查看插件的描述信息。

  • 命令:mvn help:describe -Dplugin=插件名稱 -Dmojo=目標(biāo)名稱
    作用:查看插件的某個(gè)【目標(biāo)】的簡(jiǎn)介信息。

  • 命令:mvn help:describe -Dplugin=插件名稱 -Dmojo=目標(biāo)名稱 -Ddetail
    或者這么寫(xiě)mvn 插件名稱:help -Ddetail=true -Dgoal=目標(biāo)名稱
    作用:查看help插件的某個(gè)【目標(biāo)】的詳細(xì)信息。

maven自有參數(shù)

使用mvn --help命令查看maven自有參數(shù)信息,比如-D、-X、-e

Maven核心概念

約定大于配置

在必要的情況下才進(jìn)行自定義,否則使用maven默認(rèn)設(shè)置。

插件(plugin),目標(biāo)(goal),參數(shù),生命周期,生命周期階段

插件

是一組【目標(biāo)】的集合。maven使用插件來(lái)完成特定的任務(wù)。

比如:創(chuàng)建項(xiàng)目使用archetype插件,編譯項(xiàng)目使用compiler插件,使用install插件編譯、測(cè)試、打包項(xiàng)目并安裝到本地庫(kù)中等。
注意install插件,他同時(shí)也是一個(gè)maven生命周期階段,因?yàn)樵趫?zhí)行install時(shí),它使用了多個(gè)插件,完成了多個(gè)目標(biāo)。

先記下,后邊再說(shuō)。

目標(biāo)(goal)

  • 被用來(lái)完成明確的任務(wù)。
  • 它可以作為單獨(dú)的目標(biāo)運(yùn)行,也可以作為一個(gè)大的構(gòu)建的一部分和其它目標(biāo)一起運(yùn)行。
  • 一個(gè)目標(biāo)是Maven中的一個(gè)“工作單元(unit of work)“。

你會(huì)在maven的輸出中經(jīng)?吹揭粋(gè)詞:Mojo。mojo就是goal。A Maven plain Old Java Object.

示例:

help是一個(gè)maven插件。它包括9個(gè)目標(biāo)。

help:active-profiles help:all-profiles help:describe help:effective-pom help:effective-settings help:evaluate help:expressions help:help help:system
  • 使用命令mvn 插件名稱:help查看插件的目標(biāo)。

參數(shù)

目標(biāo)定義了一些參數(shù),可以在執(zhí)行目標(biāo)時(shí),向目標(biāo)傳遞參數(shù)值來(lái)達(dá)成個(gè)性化的結(jié)果。

  • 使用命令mvn help:describe -Dplugin=插件名稱 -Dmojo=目標(biāo)名稱 -Ddetail查看目標(biāo)的參數(shù)。

生命周期

生命周期就是一個(gè)項(xiàng)目從無(wú)到有的整個(gè)過(guò)程,這個(gè)過(guò)程里包含了多個(gè)階段(比如創(chuàng)建、編譯、測(cè)試、打包/構(gòu)建、部署),每個(gè)階段就叫做生命周期階段。Maven的生命周期是抽象的。
這意味著生命周期本身不做任何實(shí)際的工作。在Maven的設(shè)計(jì)中,實(shí)際的任務(wù)(如編譯源代碼)都交由插件來(lái)完成。maven命令行的輸入往往就對(duì)應(yīng)了生命周期階段,如mvn package就表示執(zhí)行默認(rèn)生命周期階段package(構(gòu)建)。

  • 生命周期和插件兩者協(xié)同工作,密不可分。
  • 生命周期是一系列有序的生命周期階段的集合,對(duì)所有的構(gòu)建過(guò)程進(jìn)行了抽象和統(tǒng)一。
  • Maven可以支持許多不同的生命周期,最常用的是Maven生命周期。

包括:

清理
初始化
編譯
測(cè)試
打包(package)
集成測(cè)試
驗(yàn)證
部署
站點(diǎn)生成

以上的每個(gè)生命周期階段都可以綁定一個(gè)或者多個(gè)插件行為,而且Maven為大多數(shù)構(gòu)建步驟編寫(xiě)并綁定了默認(rèn)插件。
比如package這個(gè)生命周期階段的編譯任務(wù)可能就會(huì)調(diào)用maven-jar-plugin來(lái)完成,測(cè)試任務(wù)就會(huì)調(diào)用maven-surefire-plugin來(lái)完成。

坐標(biāo)

Maven坐標(biāo)定義了一組標(biāo)識(shí),它們可以用來(lái)唯一標(biāo)識(shí)一個(gè)項(xiàng)目,一個(gè)依賴,或者M(jìn)aven POM里的一個(gè)插件。

Maven項(xiàng)目坐標(biāo)的構(gòu)成元素:groupId, artifactId, version和packaging。這些組合的標(biāo)識(shí)符拼成了一個(gè)項(xiàng)目的坐標(biāo)。

但是packaging不是一個(gè)項(xiàng)目唯一標(biāo)識(shí)符的必須部分。

Maven坐標(biāo)通常用冒號(hào)來(lái)作為分隔符來(lái)書(shū)寫(xiě),格式:groupId:artifactId:packaging:version。
比如:mavenbook:my-app:jar:1.0-SNAPSHOT.
這也適用于項(xiàng)目依賴,比如項(xiàng)目包含了一個(gè)對(duì)junit:junit:jar:3.8.1的依賴。

標(biāo)識(shí)解釋

1 groupId:

團(tuán)體,公司,小組,組織,項(xiàng)目,或者其它團(tuán)體的逆向域名。比如Apache Software的項(xiàng)目經(jīng)常以org.apache作為groupId。

2 artifactId

在groupId下表示一個(gè)單獨(dú)項(xiàng)目的唯一標(biāo)識(shí)符。

3 version:

一個(gè)項(xiàng)目的特定版本。發(fā)布的項(xiàng)目有一個(gè)固定的版本標(biāo)識(shí)來(lái)指向該項(xiàng)目的某一個(gè)特定的版本。正在開(kāi)發(fā)中的項(xiàng)目用一個(gè)特殊的標(biāo)識(shí)“SNAPSHOT”標(biāo)記。正式發(fā)布版是“release”或“stable”標(biāo)記。

4 packaging:

項(xiàng)目的類型,默認(rèn)是jar,描述了項(xiàng)目打包后的輸出。類型為jar的項(xiàng)目產(chǎn)生一個(gè)JAR文件,類型為war的項(xiàng)目產(chǎn)生一個(gè)web應(yīng)用。

倉(cāng)庫(kù)(Repositories)

當(dāng)你第一次運(yùn)行Maven的時(shí)候,你會(huì)注意到Maven從一個(gè)遠(yuǎn)程的Maven倉(cāng)庫(kù)下載了許多文件。如果這個(gè)簡(jiǎn)單的項(xiàng)目是你第一次運(yùn)行Maven,那么當(dāng)觸發(fā)resources:resource目標(biāo)的時(shí)候,它首先會(huì)做的事情是去下載最新版本的Resources插件。在Maven中,構(gòu)件和插件是在它們被需要的時(shí)候從遠(yuǎn)程的倉(cāng)庫(kù)取來(lái)的。初始的Maven下載包的大小相當(dāng)?shù)男。?.8兆),其中一個(gè)原因是這個(gè)初始Maven不包括多余的插件。它只包含了幾近赤裸的最少值,而在需要的時(shí)候再?gòu)倪h(yuǎn)程倉(cāng)庫(kù)去取。Maven自帶了一個(gè)用來(lái)下載Maven核心插件和依賴的遠(yuǎn)程倉(cāng)庫(kù)地址/ http://repo1.maven.org/maven2 。你常常會(huì)寫(xiě)這樣一個(gè)項(xiàng)目,這個(gè)項(xiàng)目依賴于一些既不免費(fèi)也不公開(kāi)的包。在這種情況下,你需要要么在你組織的網(wǎng)絡(luò)里安裝一個(gè)定制的倉(cāng)庫(kù),要么手動(dòng)的安裝這些依賴。默認(rèn)的遠(yuǎn)程倉(cāng)庫(kù)可以被替換,或者增加一個(gè)你組織維護(hù)的自定義Maven倉(cāng)庫(kù)的引用。有許多現(xiàn)成的項(xiàng)目允許組織管理和維護(hù)公共Maven倉(cāng)庫(kù)的鏡像。

是什么讓Maven倉(cāng)庫(kù)成為一個(gè)Maven倉(cāng)庫(kù)的呢?

Maven倉(cāng)庫(kù)是通過(guò)結(jié)構(gòu)來(lái)定義的,一個(gè)Maven倉(cāng)庫(kù)是項(xiàng)目構(gòu)件的一個(gè)集合,這些構(gòu)件存儲(chǔ)在一個(gè)目錄結(jié)構(gòu)下面,它們的格式能很容易的被Maven所理解。在一個(gè)Maven倉(cāng)庫(kù)中,所有的東西存儲(chǔ)在一個(gè)與Maven項(xiàng)目坐標(biāo)十分匹配的目錄結(jié)構(gòu)中。你可以打開(kāi)瀏覽器,然后瀏覽中央Maven倉(cāng)庫(kù)http://repo1.maven.org/maven2/ 來(lái)看這樣的結(jié)構(gòu)。你會(huì)看到坐標(biāo)為org.apache.commons:commons-email:1.1的構(gòu)件能在目錄/org/apache/commons/commons-email/1.1/下找到,文件名為commons-email-1.1.jar。Maven倉(cāng)庫(kù)使用約定的標(biāo)準(zhǔn)目錄格式來(lái)存儲(chǔ)構(gòu)件。

Maven從遠(yuǎn)程倉(cāng)庫(kù)下載構(gòu)件和插件到你本機(jī)上,存儲(chǔ)在你的本地Maven倉(cāng)庫(kù)里。一旦Maven已經(jīng)從遠(yuǎn)程倉(cāng)庫(kù)下載了一個(gè)構(gòu)件,它將永遠(yuǎn)不需要再下載一次,因?yàn)閙aven會(huì)首先在本地倉(cāng)庫(kù)查找插件,然后才是其它地方。在Windows XP上,你的本地倉(cāng)庫(kù)很可能在C:\Documents and Settings\USERNAME.m2\repository,在Windows Vista上,會(huì)是C:
\Users\USERNAME.m2\repository。在Unix系統(tǒng)上,你的本地倉(cāng)庫(kù)在~/.m2/repository。

如果你運(yùn)行mvn install命令,Maven會(huì)把本地項(xiàng)目的構(gòu)件安裝到本地倉(cāng)庫(kù)。你能從這個(gè)命令的輸出看到,Maven把本地項(xiàng)目的JAR文件安裝到了本地Maven倉(cāng)庫(kù)。Maven在本地項(xiàng)目中通過(guò)本地倉(cāng)庫(kù)來(lái)共享依賴。如果你開(kāi)發(fā)了兩個(gè)項(xiàng)目—— 項(xiàng)目A和項(xiàng)目B——項(xiàng)目B依賴于項(xiàng)目A產(chǎn)生的構(gòu)件。當(dāng)構(gòu)建項(xiàng)目B的時(shí)候,Maven會(huì)從本地倉(cāng)庫(kù)取得項(xiàng)目A的構(gòu)件。

Maven倉(cāng)庫(kù)既是一個(gè)從遠(yuǎn)程倉(cāng)庫(kù)下載的構(gòu)件的緩存,也允許你的項(xiàng)目相互依賴。

依賴管理 (Dependency Management)

創(chuàng)建一個(gè)項(xiàng)目所需要的資源引用稱為依賴。

一個(gè)復(fù)雜的項(xiàng)目將會(huì)包含很多依賴,也有可能包含依賴于其它構(gòu)件的依賴。這是Maven最強(qiáng)大的特征之一,它支持了傳遞性依賴(transitive dependencies)。假如你的項(xiàng)目依賴于一個(gè)庫(kù),而這個(gè)庫(kù)又依賴于五個(gè)或者十個(gè)其它的庫(kù)(就像Spring或者Hibernate那樣)。你不必找出所有這些依賴然后把它們寫(xiě)在你的pom.xml里,你只需要加上你直接依賴的那些庫(kù),Maven會(huì)隱式的把這些庫(kù)間接依賴的庫(kù)也加入到你的項(xiàng)目中。Maven也會(huì)處理這些依賴中的沖突,同時(shí)能讓你自定義默認(rèn)行為,或者排除一些特定的傳遞性依賴。

在Maven中的一個(gè)依賴不僅僅是一個(gè)JAR。它還包括了一個(gè)POM文件,這個(gè)POM可能也聲明了對(duì)其它構(gòu)件的依賴。這些依賴的依賴叫做傳遞性依賴,Maven倉(cāng)庫(kù)不僅僅存貯二進(jìn)制文件,也存儲(chǔ)了這些構(gòu)建的元數(shù)據(jù)(metadata),才使傳遞性依賴成為可能。

讓我們看一下這個(gè)目錄:~/.m2/repository/junit/junit/3.8.1/。這里會(huì)有文件junit-3.8.1.jar 和junit-3.8.1.pom,還有Maven用來(lái)驗(yàn)證已下載構(gòu)件準(zhǔn)確性的校驗(yàn)和文件。需要注意的是Maven不只是下載JUnit的JAR文件,它同時(shí)為這個(gè)JUnit依賴下載了一個(gè)POM文件。Maven同時(shí)下載構(gòu)件和POM文件的這種行為,對(duì)Maven支持傳遞性依賴來(lái)說(shuō)非常重要。
當(dāng)Maven通過(guò)一組Maven坐標(biāo)來(lái)處理依賴構(gòu)件的時(shí)候,它也會(huì)獲取依賴構(gòu)建的POM,通過(guò)依賴的POM來(lái)尋找傳遞性依賴。那些傳遞性依賴就會(huì)被添加到當(dāng)前項(xiàng)目的依賴列表中。

Maven同時(shí)也提供了一種機(jī)制,能讓你排除一些你不想要的傳遞性依賴。

Maven也提供了不同的依賴范圍(dependency scope)。當(dāng)一個(gè)依賴的范圍是test的時(shí)候,說(shuō)明它在Compiler插件運(yùn)行compile 目標(biāo)的時(shí)候是不可用的。它只有在運(yùn)行compiler:testCompile和surefire:test目標(biāo)的時(shí)候才會(huì)被加入到classpath中。當(dāng)用Maven來(lái)創(chuàng)建WAR或者EAR,你可以配置Maven讓它在生成的構(gòu)件中捆綁依賴,你也可以配置Maven,使用provided范圍,讓它排除WAR文件中特定的依賴。provided范圍告訴Maven一個(gè)依賴在編譯的時(shí)候需要,但是它不應(yīng)該被捆綁在構(gòu)建的輸出中。當(dāng)你開(kāi)發(fā)web應(yīng)用的時(shí)候provided范圍變得十分有用,你需要通過(guò)Servlet API來(lái)編譯你的代碼,但是你不希望Servlet API的JAR文件包含在你web應(yīng)用的WEB-INF/lib 目錄中。

站點(diǎn)生成和報(bào)告 (Site Generation and Reporting)

另外一個(gè)Maven的重要特征是,它能生成文檔和報(bào)告。在項(xiàng)目的目錄下,運(yùn)行以下命令:

mvn site

這將會(huì)運(yùn)行site生命周期階段。它不像默認(rèn)生命周期那樣,管理代碼生成,操作資源,編譯,打包等等。Site生命周期只關(guān)心處理在src/site目錄下的site內(nèi)容,還有生成報(bào)告。在這個(gè)命令運(yùn)行過(guò)之后,你將會(huì)在target/site 目錄下看到一個(gè)項(xiàng)目web站點(diǎn)。載入target/site/index.html你會(huì)看到項(xiàng)目站點(diǎn)的基本外貌。它包含了一些報(bào)告,它們?cè)谧笫诌叺膶?dǎo)航目錄的“項(xiàng)目報(bào)告”下面。它也包含了項(xiàng)目相關(guān)的信息,依賴和相關(guān)開(kāi)發(fā)人員信息。

在這個(gè)站點(diǎn)上,你會(huì)注意到一些默認(rèn)的報(bào)告已經(jīng)可以訪問(wèn)了,有一個(gè)報(bào)告詳細(xì)描述了測(cè)試的結(jié)果。這個(gè)單元測(cè)試報(bào)告描述了項(xiàng)目中所有單元測(cè)試的成功和失敗信息。另外一個(gè)報(bào)告生成了項(xiàng)目API的JavaDoc。Maven提供了很完整的可配置的報(bào)告,像Clover報(bào)告檢查單元測(cè)試覆蓋率,JXR報(bào)告生成HTML源代碼相互間引用,這在代碼審查的時(shí)候非常有用,PMD報(bào)告針對(duì)各種編碼問(wèn)題來(lái)分析源代碼,JDepend報(bào)告分析源代碼中各個(gè)包之間的依賴。通過(guò)在pom.xml中配置那些報(bào)告被包含在構(gòu)建中,站點(diǎn)報(bào)告就可以被定制了。

自己動(dòng)手體會(huì)一下

通過(guò)一個(gè)經(jīng)典的控制臺(tái) Hello world! 程序來(lái)體會(huì)maven的使用過(guò)程,包括創(chuàng)建、編譯、測(cè)試、打包 ,并運(yùn)行程序。

第一步:定位目錄

在命令窗口中定位到將要?jiǎng)?chuàng)建項(xiàng)目的目錄下。比如我的是:D:\Project\mavenTest\quickstart>。

第二步:創(chuàng)建項(xiàng)目

使用archetype插件創(chuàng)建項(xiàng)目,輸入以下命令:mvn archetype:generate,回車(chē),等。。。 然后,不出意外的話,你會(huì)看到屏幕輸出了上千種archetype支持的項(xiàng)目類型。在末尾你會(huì)看到要求你輸入的地方,就是這個(gè):Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 756:不翻譯了,你一定要能看懂。

因?yàn)槲覀円獎(jiǎng)?chuàng)建的是一個(gè)簡(jiǎn)單的示例程序,所以什么都不輸入,直接回車(chē)。
屏幕輸出maven-archetype-quickstart項(xiàng)目類型的幾個(gè)不同版本.
輸入對(duì)應(yīng)的序號(hào)(我輸入的是6),然后回車(chē)。

按照屏幕輸出,依次輸入:groupId,artifactId,version,package. 

屏幕會(huì)輸出你填寫(xiě)的項(xiàng)目信息,要求你確認(rèn),輸入 Y ,回車(chē),確認(rèn)。

maven會(huì)根據(jù)你的設(shè)置開(kāi)始下載依賴文件并創(chuàng)建項(xiàng)目。 當(dāng)你看到Build Success時(shí),項(xiàng)目就被創(chuàng)建好了,打開(kāi)你的項(xiàng)目位置查看你的項(xiàng)目。maven在項(xiàng)目根目錄下生成了一個(gè)POM.xml文件,這個(gè)是項(xiàng)目對(duì)象模型描述文件,maven就是根據(jù)這個(gè)文件的描述來(lái)構(gòu)建你的項(xiàng)目的,打開(kāi)看一下。

第三步:編譯項(xiàng)目

使用compiler插件創(chuàng)建項(xiàng)目,輸入以下命令:mvn compiler:compile,回車(chē),等。。。
maven開(kāi)始下載依賴文件并編譯項(xiàng)目。 當(dāng)你看到Build Success時(shí),項(xiàng)目就被編譯好了,你還可以看到詳細(xì)的編譯結(jié)果信息。

第四步:打包項(xiàng)目 / 構(gòu)建項(xiàng)目

使用maven默認(rèn)的生命周期階段命令package來(lái)打包項(xiàng)目,輸入以下命令:mvn package,回車(chē),等。。。
maven開(kāi)始下載依賴文件并編譯項(xiàng)目。 當(dāng)你看到Build Success時(shí),項(xiàng)目就被打包好了,你還可以看到詳細(xì)的編譯結(jié)果信息。項(xiàng)目的根目錄會(huì)出現(xiàn)一個(gè)target目錄,存放了項(xiàng)目打包后的文件。

當(dāng)然,你也可以不使用maven生命周期的默認(rèn)package命令,而是自己動(dòng)手使用多個(gè)插件來(lái)完成這個(gè)任務(wù)。

第五步:運(yùn)行項(xiàng)目

如果前邊的都成功完成的話,現(xiàn)在就可以運(yùn)行一下項(xiàng)目看看結(jié)果了。

命令行輸入:java -cp target/quickstart-1.1.jar maven.archetype.quickstart.App回車(chē)。
應(yīng)該輸出了Hello world!。

到這里為止,你已經(jīng)了解了maven最核心的概念,明白了maven的結(jié)構(gòu),而且親自使用maven成功構(gòu)建了一個(gè)項(xiàng)目。

所以,本文到此就結(jié)束了。

接下來(lái),到實(shí)際的工作中去使用maven,不斷磨練自己的技藝吧!


文/馭風(fēng)(簡(jiǎn)書(shū)作者)
原文鏈接:http://www.jianshu.com/p/6fc7b4aaf5f9
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書(shū)作者”。

標(biāo)簽: 代碼 網(wǎng)絡(luò) 域名

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:雜談現(xiàn)代高級(jí)編程語(yǔ)言

下一篇:Python開(kāi)發(fā)的10個(gè)小貼士