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

Maven技術(shù)解析

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

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

Maven簡單介紹

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

它包含了:

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

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

如果看完簡介,你還迷糊的,那么我想說:這很正常!請心無旁騖地往下看,學(xué)習(xí)完這個入門教程,該懂的你就都懂了。

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

掃清障礙

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

help 插件的使用方法

tags:maven help

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

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

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

  • 命令:mvn help:describe -Dplugin=插件名稱 -Dmojo=目標(biāo)名稱 -Ddetail
    或者這么寫mvn 插件名稱:help -Ddetail=true -Dgoal=目標(biāo)名稱
    作用:查看help插件的某個【目標(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使用插件來完成特定的任務(wù)。

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

先記下,后邊再說。

目標(biāo)(goal)

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

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

示例:

help是一個maven插件。它包括9個目標(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ù)值來達(dá)成個性化的結(jié)果。

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

生命周期

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

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

包括:

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

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

坐標(biāo)

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

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

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

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

標(biāo)識解釋

1 groupId:

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

2 artifactId

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

3 version:

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

4 packaging:

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

倉庫(Repositories)

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

是什么讓Maven倉庫成為一個Maven倉庫的呢?

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

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

如果你運(yùn)行mvn install命令,Maven會把本地項(xiàng)目的構(gòu)件安裝到本地倉庫。你能從這個命令的輸出看到,Maven把本地項(xiàng)目的JAR文件安裝到了本地Maven倉庫。Maven在本地項(xiàng)目中通過本地倉庫來共享依賴。如果你開發(fā)了兩個項(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會從本地倉庫取得項(xiàng)目A的構(gòu)件。

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

依賴管理 (Dependency Management)

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

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

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

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

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

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

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

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

mvn site

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

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

自己動手體會一下

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

第一步:定位目錄

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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