国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

Maven小技巧

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 07:32:45
文檔

Maven小技巧

Maven小技巧:前言 Maven,發(fā)音是[`meivin],專家的意思。它是一個(gè)很好的項(xiàng)目管理工具,很早就進(jìn)入了我的必備工具行列,但是這次為了把ABPM項(xiàng)目 完全遷移并應(yīng)用maven,所以對(duì)maven進(jìn)行了一些深入的學(xué)習(xí)。寫這個(gè)學(xué)習(xí)筆記的目的,一個(gè)是為了自己備忘,二則希望能夠?yàn)槠渌?
推薦度:
導(dǎo)讀Maven小技巧:前言 Maven,發(fā)音是[`meivin],專家的意思。它是一個(gè)很好的項(xiàng)目管理工具,很早就進(jìn)入了我的必備工具行列,但是這次為了把ABPM項(xiàng)目 完全遷移并應(yīng)用maven,所以對(duì)maven進(jìn)行了一些深入的學(xué)習(xí)。寫這個(gè)學(xué)習(xí)筆記的目的,一個(gè)是為了自己備忘,二則希望能夠?yàn)槠渌?

前言 Maven,發(fā)音是[`meivin],專家的意思。它是一個(gè)很好的項(xiàng)目管理工具,很早就進(jìn)入了我的必備工具行列,但是這次為了把ABPM項(xiàng)目 完全遷移并應(yīng)用maven,所以對(duì)maven進(jìn)行了一些深入的學(xué)習(xí)。寫這個(gè)學(xué)習(xí)筆記的目的,一個(gè)是為了自己備忘,二則希望能夠?yàn)槠渌?/p>

前言

Maven,發(fā)音是[`meivin],"專家"的意思。它是一個(gè)很好的項(xiàng)目管理工具,很早就進(jìn)入了我的必備工具行列,但是這次為了把ABPM項(xiàng)目 完全遷移并應(yīng)用maven,所以對(duì)maven進(jìn)行了一些深入的學(xué)習(xí)。寫這個(gè)學(xué)習(xí)筆記的目的,一個(gè)是為了自己備忘,二則希望能夠?yàn)槠渌藢W(xué)習(xí)使用maven 縮短一些時(shí)間。

maven概要

首先我把maven的概念快速的梳理一下,讓我們快速地建立起一個(gè)比較精確的maven應(yīng)用場(chǎng)景。

maven不是什么

讀書時(shí)候要先限定范圍,避免一些有害的遐想。要說maven不是什么,我們可以從如下幾個(gè)要點(diǎn)來展開

  1. maven不是ant,也不是make。
    我們以前接觸的構(gòu)建工具,需要寫一些詳細(xì)的步驟,比如: compile project1/src/*.java 等類似的語(yǔ)句。這些語(yǔ)句正是我們使用ant和make所要編寫的東西。maven采用了"約定優(yōu)于配置"的方法,一些開發(fā)常用的操作和步驟已經(jīng)固化在 maven中,所以使用者不再需要去編寫那些煩人的語(yǔ)句了。同時(shí),maven內(nèi)置了開發(fā)流程的支持,它不僅能夠編譯,同樣能夠打包、發(fā)布,也能夠一氣呵成 做完這些所有的步驟。
  2. maven不是ivy
    依賴管理是maven的功能之一,雖然很多人包括我以前都是只用它的依賴管理功能,但是要深入運(yùn)用的話,我們就可以看到更多的內(nèi)容。更重要的是,maven在依賴關(guān)系中加入了scope的概念,進(jìn)一步細(xì)化了依賴關(guān)系的劃分。
maven是什么

maven將自己定位為一個(gè)項(xiàng)目管理工具。它負(fù)責(zé)管理項(xiàng)目開發(fā)過程中的幾乎所有的東西:

  1. 版本
    maven有自己的版本定義和規(guī)則
  2. 構(gòu)建
    maven支持許多種的應(yīng)用程序類型,對(duì)于每一種支持的應(yīng)用程序類型都定義好了一組構(gòu)建規(guī)則和工具集。
  3. 輸出物管理
    maven可以管理項(xiàng)目構(gòu)建的產(chǎn)物,并將其加入到用戶庫(kù)中。這個(gè)功能可以用于項(xiàng)目組和其他部門之間的交付行為。
  4. 依賴關(guān)系
    maven對(duì)依賴關(guān)系的特性進(jìn)行細(xì)致的分析和劃分,避免開發(fā)過程中的依賴混亂和相互污染行為
  5. 文檔和構(gòu)建結(jié)果
    maven的site命令支持各種文檔信息的發(fā)布,包括構(gòu)建過程的各種輸出,javadoc,產(chǎn)品文檔等。
  6. 項(xiàng)目關(guān)系
    一個(gè)大型的項(xiàng)目通常有幾個(gè)小項(xiàng)目或者模塊組成,用maven可以很方便地管理
  7. 移植性管理
    maven可以針對(duì)不同的開發(fā)場(chǎng)景,輸出不同種類的輸出結(jié)果。
maven的生命周期

maven把項(xiàng)目的構(gòu)建劃分為不同的生命周期(lifecycle),在我看來,劃分的已經(jīng)是非常仔細(xì)了,大家可以參考這里 。粗略一點(diǎn)的話,它這個(gè)過程(phase)包括:編譯、測(cè)試、打包、集成測(cè)試、驗(yàn)證、部署。maven中所有的執(zhí)行動(dòng)作(goal)都需要指明自己在這個(gè)過程中的執(zhí)行位置,然后maven執(zhí)行的時(shí)候,就依照過程的發(fā)展依次調(diào)用這些goal進(jìn)行各種處理。

這個(gè)也是maven的一個(gè)基本調(diào)度機(jī)制。一般來說,位置稍后的過程都會(huì)依賴于之前的過程。當(dāng)然,maven同樣提供了配置文件,可以依照用戶要求,跳過某些階段。

maven的"約定優(yōu)于配置"

所謂的"約定優(yōu)于配置",在maven中并不是完全不可以修改的,他們只是一些配置的默認(rèn)值而已。但是使用者除非必要,并不需要去修改那些約定內(nèi)容。maven默認(rèn)的文件存放結(jié)構(gòu)如下:

  • /項(xiàng)目目錄
  • pom.xml 用于maven的配置文件
  • /src 源代碼目錄
  • /src/main 工程源代碼目錄
  • /src/main/java 工程java源代碼目錄
  • /src/main/resource 工程的資源目錄
  • /src/test 單元測(cè)試目錄
  • /src/test/java
  • /target 輸出目錄,所有的輸出物都存放在這個(gè)目錄下
  • /target/classes 編譯之后的class文件
  • 每一個(gè)階段的任務(wù)都知道怎么正確完成自己的工作,比如compile任務(wù)就知道從src/main/java下編譯所有的java文件,并把它的輸出class文件存放到target/classes中。

    對(duì)maven來說,采用"約定優(yōu)于配置"的策略可以減少修改配置的工作量,也可以降低學(xué)習(xí)成本,更重要的是,給項(xiàng)目引入了統(tǒng)一的規(guī)范。

    maven的版本規(guī)范

    maven使用如下幾個(gè)要素來唯一定位某一個(gè)輸出物: groupId:artifactId:packaging:version 。比如org.springframework:spring:2.5 。每個(gè)部分的解釋如下:

  • groupId
    團(tuán)體,公司,小組,組織,項(xiàng)目,或者其它團(tuán)體。團(tuán)體標(biāo)識(shí)的約定是,它以創(chuàng)建這個(gè)項(xiàng)目的組織名稱的逆向域名(reverse domain name)開頭。來自Sonatype的項(xiàng)目有一個(gè)以com.sonatype開頭的groupId,而Apache Software的項(xiàng)目有以org.apache開頭的groupId。
  • artifactId
    在groupId下的表示一個(gè)單獨(dú)項(xiàng)目的唯一標(biāo)識(shí)符。比如我們的tomcat, commons等。不要在artifactId中包含點(diǎn)號(hào)(.)。
  • version
    一個(gè)項(xiàng)目的特定版本。發(fā)布的項(xiàng)目有一個(gè)固定的版本標(biāo)識(shí)來指向該項(xiàng)目的某一個(gè)特定的版本。而正在開發(fā)中的項(xiàng)目可以用一個(gè)特殊的標(biāo)識(shí),這種標(biāo)識(shí)給版本加上一個(gè)"SNAPSHOT"的標(biāo)記。
    雖然項(xiàng)目的打包格式也是Maven坐標(biāo)的重要組成部分,但是它不是項(xiàng)目唯一標(biāo)識(shí)符的一個(gè)部分。一個(gè)項(xiàng)目的 groupId:artifactId:version使之成為一個(gè)獨(dú)一無二的項(xiàng)目;你不能同時(shí)有一個(gè)擁有同樣的groupId, artifactId和version標(biāo)識(shí)的項(xiàng)目。
  • packaging
    項(xiàng)目的類型,默認(rèn)是jar,描述了項(xiàng)目打包后的輸出。類型為jar的項(xiàng)目產(chǎn)生一個(gè)JAR文件,類型為war的項(xiàng)目產(chǎn)生一個(gè)web應(yīng)用。
  • classifier
    很少使用的坐標(biāo),一般都可以忽略classifiers。如果你要發(fā)布同樣的代碼,但是由于技術(shù)原因需要生成兩個(gè)單獨(dú)的構(gòu)件,你就要使用一個(gè)分類器 (classifier)。例如,如果你想要構(gòu)建兩個(gè)單獨(dú)的構(gòu)件成JAR,一個(gè)使用Java 1.4編譯器,另一個(gè)使用Java 6編譯器,你就可以使用分類器來生成兩個(gè)單獨(dú)的JAR構(gòu)件,它們有同樣的groupId:artifactId:version組合。如果你的項(xiàng)目使用本 地?cái)U(kuò)展類庫(kù),你可以使用分類器為每一個(gè)目標(biāo)平臺(tái)生成一個(gè)構(gòu)件。分類器常用于打包構(gòu)件的源碼,JavaDoc或者二進(jìn)制集合。
  • maven有自己的版本規(guī)范,一般是如下定義 ..- , 比如1.2.3-beta-01。要說明的是,maven自己判斷版本的算法是major,minor,incremental部分用數(shù)字比 較,qualifier部分用字符串比較,所以要小心 alpha-2和alpha-15的比較關(guān)系,最好用 alpha-02的格式。

    maven在版本管理時(shí)候可以使用幾個(gè)特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。比如"1.0-SNAPSHOT"。各個(gè)部分的含義和處理邏輯如下說明:

  • SNAPSHOT
    如果一個(gè)版本包含字符串"SNAPSHOT",Maven就會(huì)在安裝或發(fā)布這個(gè)組件的時(shí)候?qū)⒃摲?hào)展開為一個(gè)日期和時(shí)間值,轉(zhuǎn)換為UTC時(shí)間。例 如,"1.0-SNAPSHOT"會(huì)在2010年5月5日下午2點(diǎn)10分發(fā)布時(shí)候變成1.0-20100505-141000-1。
    這個(gè)詞只能用于開發(fā)過程中,因?yàn)橐话銇碚f,項(xiàng)目組都會(huì)頻繁發(fā)布一些版本,最后實(shí)際發(fā)布的時(shí)候,會(huì)在這些snapshot版本中尋找一個(gè)穩(wěn)定的,用于正式發(fā) 布,比如1.4版本發(fā)布之前,就會(huì)有一系列的1.4-SNAPSHOT,而實(shí)際發(fā)布的1.4,也是從中拿出來的一個(gè)穩(wěn)定版。
  • LATEST
    指某個(gè)特定構(gòu)件的最新發(fā)布,這個(gè)發(fā)布可能是一個(gè)發(fā)布版,也可能是一個(gè)snapshot版,具體看哪個(gè)時(shí)間最后。
  • RELEASE
    指最后一個(gè)發(fā)布版。
  • maven的組成部分

    maven把整個(gè)maven管理的項(xiàng)目分為幾個(gè)部分,一個(gè)部分是源代碼,包括源代碼本身、相關(guān)的各種資源,一個(gè)部分則是單元測(cè)試用例,另外一部分則是各種maven的插件。對(duì)于這幾個(gè)部分,maven可以獨(dú)立管理他們,包括各種外部依賴關(guān)系。

    maven的依賴管理

    依賴管理一般是最吸引人使用maven的功能特性了,這個(gè)特性讓開發(fā)者只需要關(guān)注代碼的直接依賴,比如我們用了spring,就加入spring依賴說明就可以了,至于spring自己還依賴哪些外部的東西,maven幫我們搞定。

    任意一個(gè)外部依賴說明包含如下幾個(gè)要素:groupId, artifactId, version, scope, type, optional。其中前3個(gè)是必須的,各自含義如下:

  • groupId 必須
  • artifactId 必須
  • version 必須。
    這里的version可以用區(qū)間表達(dá)式來表示,比如(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多個(gè)條件之間用逗號(hào)分隔,比如[1,3),[5,7]。
  • scope 作用域限制
  • type 一般在pom引用依賴時(shí)候出現(xiàn),其他時(shí)候不用
  • optional 是否可選依賴
  • maven認(rèn)為,程序?qū)ν獠康囊蕾嚂?huì)隨著程序的所處階段和應(yīng)用場(chǎng)景而變化,所以maven中的依賴關(guān)系有作用域(scope)的限制。在maven中,scope包含如下的取值:

  • compile(編譯范圍)
    compile是默認(rèn)的范圍;如果沒有提供一個(gè)范圍,那該依賴的范圍就是編譯范圍。編譯范圍依賴在所有的classpath中可用,同時(shí)它們也會(huì)被打包。
  • provided(已提供范圍)
    provided依賴只有在當(dāng)JDK或者一個(gè)容器已提供該依賴之后才使用。例如,如果你開發(fā)了一個(gè)web應(yīng)用,你可能在編譯classpath中需要可用 的Servlet API來編譯一個(gè)servlet,但是你不會(huì)想要在打包好的WAR中包含這個(gè)Servlet API;這個(gè)Servlet API JAR由你的應(yīng)用服務(wù)器或者servlet容器提供。已提供范圍的依賴在編譯classpath(不是運(yùn)行時(shí))可用。它們不是傳遞性的,也不會(huì)被打包。
  • runtime(運(yùn)行時(shí)范圍)
    runtime依賴在運(yùn)行和測(cè)試系統(tǒng)的時(shí)候需要,但在編譯的時(shí)候不需要。比如,你可能在編譯的時(shí)候只需要JDBC API JAR,而只有在運(yùn)行的時(shí)候才需要JDBC驅(qū)動(dòng)實(shí)現(xiàn)。
  • test(測(cè)試范圍)
    test范圍依賴 在一般的 編譯和運(yùn)行時(shí)都不需要,它們只有在測(cè)試編譯和測(cè)試運(yùn)行階段可用。測(cè)試范圍依賴在之前的???中介紹過。
  • system(系統(tǒng)范圍)
    system范圍依賴與provided類似,但是你必須顯式的提供一個(gè)對(duì)于本地系統(tǒng)中JAR文件的路徑。這么做是為了允許基于本地對(duì)象編譯,而這些對(duì)象是系統(tǒng)類庫(kù)的一部分。這樣的構(gòu)件應(yīng)該是一直可用的,Maven也不會(huì)在倉(cāng)庫(kù)中去尋找它。 如果你將一個(gè)依賴范圍設(shè)置成系統(tǒng)范圍,你必須同時(shí)提供一個(gè)systemPath元素 。注意該范圍是不推薦使用的(你應(yīng)該一直盡量去從公共或定制的Maven倉(cāng)庫(kù)中引用依賴)。
  • 另外,代碼有代碼自己的依賴,各個(gè)maven使用的插件也可以有自己的依賴關(guān)系。依賴也可以是可選的,比如我們代碼中沒有任何cache依賴,但是hibernate可能要配置cache,所以該cache的依賴就是可選的。

    多項(xiàng)目管理

    maven的多項(xiàng)目管理也是非常強(qiáng)大的。一般來說,maven要求同一個(gè)工程的所有子項(xiàng)目都放置到同一個(gè)目錄下,每一個(gè)子目錄代表一個(gè)項(xiàng)目,比如

  • 總項(xiàng)目/
  • pom.xml 總項(xiàng)目的pom配置文件
  • 子項(xiàng)目1/
  • pom.xml 子項(xiàng)目1的pom文件
  • 子項(xiàng)目2/
  • pom.xml 子項(xiàng)目2的pom文件
  • 按照這種格式存放,就是繼承方式,所有具體子項(xiàng)目的pom.xml都會(huì)繼承總項(xiàng)目pom的內(nèi)容,取值為子項(xiàng)目pom內(nèi)容優(yōu)先。

    要設(shè)置繼承方式,首先要在總項(xiàng)目的pom中加入如下配置

    Xml代碼

    1. simple-weather
    2. simple-webapp

    其次在每個(gè)子項(xiàng)目中加入

    
     org.sonatype.mavenbook.ch06
     simple-parent
     1.0
     
    

    即可。

    當(dāng)然,繼承不是唯一的配置文件共用方式,maven還支持引用方式。引用pom的方式更簡(jiǎn)單,在依賴中加入一個(gè)type為pom的依賴即可。

    Xml代碼

    1. This is a project requiring JDBC
    2. ...
    3. ...
    4. org.sonatype.mavenbook
    5. persistence-deps
    6. 1.0
    7. pom

    屬性

    用戶可以在maven中定義一些屬性,然后在其他地方用${xxx}進(jìn)行引用。比如:

    Xml代碼

    1. 4.0.0
    2. ...
    3. value1

    maven提供了三個(gè)隱式的變量,用來訪問系統(tǒng)環(huán)境變量、POM信息和maven的settings:

  • env
    暴露操作系統(tǒng)的環(huán)境變量,比如env.PATH
  • project
    暴露POM中的內(nèi)容,用點(diǎn)號(hào)(.)的路徑來引用POM元素的值,比如${project.artifactId}。另外,java的系統(tǒng)屬性比如user.dir等,也暴露在這里。
  • settings
    暴露maven的settings的信息,也可以用點(diǎn)號(hào)(.)來引用。maven把系統(tǒng)配置文件存放在maven的安裝目錄中,把用戶相關(guān)的配置文件存放 在~/.m2/settings.xml(unix)或者%USERPROFILE%/.m2/settings.xml(windows)中。
  • maven的profile

    profile是maven的一個(gè)重要特性,它可以讓maven能夠自動(dòng)適應(yīng)外部的環(huán)境變化,比如同一個(gè)項(xiàng)目,在linux下編譯linux的版 本,在win下編譯win的版本等。一個(gè)項(xiàng)目可以設(shè)置多個(gè)profile,也可以在同一時(shí)間設(shè)置多個(gè)profile被激活(active)的。自動(dòng)激活的 profile的條件可以是各種各樣的設(shè)定條件,組合放置在activation節(jié)點(diǎn)中,也可以通過命令行直接指定。profile包含的其他配置內(nèi)容可 以覆蓋掉pom定義的相應(yīng)值。如果認(rèn)為profile設(shè)置比較復(fù)雜,可以將所有的profiles內(nèi)容移動(dòng)到專門的 profiles.xml 文件中,不過記得和pom.xml放在一起。

    activation節(jié)點(diǎn)中的激活條件中常見的有如下幾個(gè):

    1. os
      判斷操作系統(tǒng)相關(guān)的參數(shù),它包含如下可以自由組合的子節(jié)點(diǎn)元素
    2. message - 規(guī)則失敗之后顯示的消息
    3. arch - 匹配cpu結(jié)構(gòu),常見為x86
    4. family - 匹配操作系統(tǒng)家族,常見的取值為:dos,mac,netware,os/2,unix,windows,win9x,os/400等
    5. name - 匹配操作系統(tǒng)的名字
    6. version - 匹配的操作系統(tǒng)版本號(hào)
    7. display - 檢測(cè)到操作系統(tǒng)之后顯示的信息
    8. jdk
      檢查jdk版本,可以用區(qū)間表示。
    9. property
      檢查屬性值,本節(jié)點(diǎn)可以包含name和value兩個(gè)子節(jié)點(diǎn)。
    10. file
      檢查文件相關(guān)內(nèi)容,包含兩個(gè)子節(jié)點(diǎn):exists和missing,用于分別檢查文件存在和不存在兩種情況。

    maven的操作和使用

    maven的操作有兩種方式,一種是通過mvn命令行命令,一種是使用maven的eclipse插件。因?yàn)槭褂胑clipse的maven插件操作起來比較容易,這里就只介紹使用mvn命令行的操作。

    maven的配置文件

    maven的主執(zhí)行程序?yàn)閙vn.bat,linux下為mvn.sh,這兩個(gè)程序都很簡(jiǎn)單,它們的共同用途就是收集一些參數(shù),然后用 java.exe來運(yùn)行maven的Main函數(shù)。maven同樣需要有配置文件,名字叫做settings.xml,它放在兩個(gè)地方,一個(gè)是maven 安裝目錄的conf目錄下,對(duì)所有使用該maven的用戶都起作用,我們稱為主配置文件,另外一個(gè)放在 %USERPROFILE%/.m2/settings.xml下,我們成為用戶配置文件,只對(duì)當(dāng)前用戶有效,且可以覆蓋主配置文件的參數(shù)內(nèi)容。還有就是 項(xiàng)目級(jí)別的配置信息了,它存放在每一個(gè)maven管理的項(xiàng)目目錄下,叫pom.xml,主要用于配置項(xiàng)目相關(guān)的一些內(nèi)容,當(dāng)然,如果有必要,用戶也可以在 pom中寫一些配置,覆蓋住配置文件和用戶配置文件的設(shè)置參數(shù)內(nèi)容。

    一般來說,settings文件配置的是比如repository庫(kù)路徑之類的全局信息,具體可以參考官方網(wǎng)站的文章 。

    創(chuàng)建新工程

    要?jiǎng)?chuàng)建一個(gè)新的maven工程,我們需要給我們的工程指定幾個(gè)必要的要素,就是maven產(chǎn)品坐標(biāo)的幾個(gè)要素:groupId, artifactId,如果愿意,你也可以指定version和package名稱。我們先看一個(gè)簡(jiǎn)單的創(chuàng)建命令:

    d:\work\temp>mvn archetype:create -DgroupId=com.abc -DartifactId=product1 -DarchetypeArtifactId=maven-archetype-webapp

    首先看這里的命令行參數(shù)的傳遞結(jié)構(gòu),怪異的 -D參數(shù)=值 的方式是 java.exe 要求的方式。這個(gè)命令創(chuàng)建一個(gè)web工程,目錄結(jié)構(gòu)是一個(gè)標(biāo)準(zhǔn)的maven結(jié)構(gòu),如下:

    D:.
    └─mywebapp
     │ pom.xml
     │
     └─src
     └─main
     ├─resources
     └─webapp
     │ index.jsp
     │
     └─WEB-INF
     web.xml

    大家要注意,這里目錄結(jié)構(gòu)的布局實(shí)際上是由參數(shù) archetypeArtifactId 來決定的,因?yàn)檫@里傳入的是 maven-archetype-webapp如果我們傳入其他的就會(huì)創(chuàng)建不同的結(jié)構(gòu),默認(rèn)值為 maven-archetype-quickstart ,有興趣的讀者可以參考更詳細(xì)的列表 ,我把部分常用的列表在這里:

    Artifact Group Version Repository Description
    maven-archetype-j2ee-simple org.apache.maven.archetypes A simple J2EE Java application
    maven-archetype-marmalade-mojo org.apache.maven.archetypes A Maven plugin development project using marmalade
    maven-archetype-plugin org.apache.maven.archetypes A Maven Java plugin development project
    maven-archetype-portlet org.apache.maven.archetypes A simple portlet application
    maven-archetype-profiles org.apache.maven.archetypes
    maven-archetype-quickstart org.apache.maven.archetypes
    maven-archetype-simple org.apache.maven.archetypes
    maven-archetype-site-simple org.apache.maven.archetypes A simple site generation project
    maven-archetype-site org.apache.maven.archetypes A more complex site project
    maven-archetype-webapp org.apache.maven.archetypes A simple Java web application
    maven-archetype-har net.sf.maven-har 0.9 Hibernate Archive
    maven-archetype-sar net.sf.maven-sar 0.9 JBoss Service Archive

    大家可以參考更詳細(xì)的 archetype:create 幫助 和 archtype參考信息 。

    maven的多項(xiàng)目管理

    多項(xiàng)目管理是maven的主要特色之一,對(duì)于一個(gè)大型工程,用maven來管理他們之間復(fù)雜的依賴關(guān)系,是再好不過了。maven的項(xiàng)目配置之間的關(guān)系有兩種:繼承關(guān)系和引用關(guān)系。
    maven默認(rèn)根據(jù)目錄結(jié)構(gòu)來設(shè)定pom的繼承關(guān)系,即下級(jí)目錄的pom默認(rèn)繼承上級(jí)目錄的pom。要設(shè)定兩者之間的關(guān)系很簡(jiǎn)單,上級(jí)pom如下設(shè)置:

    Xml代碼

    1. ABCCommon
    2. ABCCore
    3. ABCTools

    要記住的是,這里的module是目錄名,不是子工程的artifactId。子工程如下設(shè)置:

    Xml代碼

    1. com.abc.product1
    2. abc-product1
    3. 1.0.0-SNAPSHOT
    4. abc-my-module2
    5. jar

    這樣兩者就相互關(guān)聯(lián)起來了,繼承關(guān)系就設(shè)定完畢,所有父工程的配置內(nèi)容都會(huì)自動(dòng)在子工程中生效,除非子工程有相同的配置覆蓋。如果你不喜歡層層遞進(jìn)的目錄結(jié)構(gòu)來實(shí)現(xiàn)繼承,也可以在parent中加入 ../a-parent/pom.xml 來制定parent項(xiàng)目的相對(duì)目錄。繼承關(guān)系通常用在項(xiàng)目共同特性的抽取上,通過抽取公共特性,可以大幅度減少子項(xiàng)目的配置工作量。

    引用關(guān)系是另外一種復(fù)用的方式,maven中配置引用關(guān)系也很簡(jiǎn)單,加入一個(gè) typepom 的依賴即可。

    Xml代碼

    1. org.sonatype.mavenbook
    2. persistence-deps
    3. 1.0
    4. pom

    但是無論是父項(xiàng)目還是引用項(xiàng)目,這些工程都必須用 mvn install 或者 mvn deploy 安裝到本地庫(kù)才行,否則會(huì)報(bào)告依賴沒有找到,eclipse編譯時(shí)候也會(huì)出錯(cuò)。

    需要特別提出的是復(fù)用過程中,父項(xiàng)目的pom中可以定義 dependencyManagement 節(jié)點(diǎn),其中存放依賴關(guān)系,但是這個(gè)依賴關(guān)系只是定義,不會(huì)真的產(chǎn)生效果,如果子項(xiàng)目想要使用這個(gè)依賴關(guān)系,可以在本身的 dependency 中添加一個(gè)簡(jiǎn)化的引用

    Xml代碼

    1. org.springframework
    2. spring

    這種方法可以避免版本號(hào)滿天飛的情況。

    安裝庫(kù)文件到maven庫(kù)中

    在maven中一般都會(huì)用到安裝庫(kù)文件的功能,一則是我們常用的hibernate要使用jmx庫(kù),但是因?yàn)閟un的license限制,所以無法將其直接包含在repository中。所以我們使用mvn命令把jar安裝到我們本地的repository中

    mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file

    如果我們想把它安裝到公司的repository中,需要使用命令

    mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=http://aaa.ss.com/ss.xxx -DrepositoryId=release-repo

    對(duì)于我們的工程輸出,如果需要放置到公司的repository中的話,可以通過配置pom來實(shí)現(xiàn)

    Xml代碼

    1. mycompany-repository
    2. MyCompany Repository
    3. scp://repository.mycompany.com/repository/maven2

    這里使用的scp方式提交庫(kù)文件,還有其他方式可以使用,請(qǐng)參考faq部分。然后記得在你的settings.xml中加入這一內(nèi)容

    Xml代碼

    1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
    3. http://maven.apache.org/xsd/settings-1.0.0.xsd">
    4. ...
    5. mycompany-repository
    6. jvanzyl
    7. /path/to/identity
    8. my_key_passphrase
    9. ...

    maven的變量

    maven定義了很多變量屬性,參考這里 http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide

    1. 內(nèi)置屬性
    2. ${basedir } represents the directory containing pom.xml
    3. ${version } equivalent to ${project.version } or ${pom.version }
    4. Pom/Project properties
      所有pom中的元素都可以用 project. 前綴進(jìn)行引用,以下是部分常用的
    5. ${project.build.directory } results in the path to your "target" dir, this is the same as${pom.project.build.directory }
    6. ${project.build. outputD irectory } results in the path to your "target/classes" dir
    7. ${project.name } refers to the name of the project.
    8. ${project.version } refers to the version of the project.
    9. ${project.build.finalName } refers to the final name of the file created when the built project is packaged
    10. 本地用戶設(shè)定
      所有用的的 settings.xml 中的設(shè)定都可以通過 settings. 前綴進(jìn)行引用
    11. ${settings.localRepository } refers to the path of the user's local repository.
    12. ${maven.repo.local } also works for backward compatibility with maven1 ??
    13. 環(huán)境變量
      系統(tǒng)的環(huán)境變量通過 env. 前綴引用
    14. ${env.M2_HOME } returns the Maven2 installation path.
    15. ${java.home } specifies the path to the current JRE_HOME environment use with relative paths to get for example:
      ${java.home}../bin/java.exe
    16. java系統(tǒng)屬性
      所有JVM中定義的java系統(tǒng)屬性.
    17. 用戶在pom中定義的自定義屬性

      
      ...
      
      hello
      
      ...
       
      

    18. ${my.filter.value } will result in hello if you inserted the above XML fragment in your pom.xml
    19. 上級(jí)工程的變量
      上級(jí)工程的pom中的變量用前綴 ${project.parent } 引用. 上級(jí)工程的版本也可以這樣引用: ${parent.version }.
    maven的使用

    我們已經(jīng)知道m(xù)aven預(yù)定義了許多的階段(phase),每個(gè)插件都依附于這些階段,并且在進(jìn)入某個(gè)階段的時(shí)候,調(diào)用運(yùn)行這些相關(guān)插件的功能。我們先來看完整的maven生命周期:

    生命周期 階段描述
    validate 驗(yàn)證項(xiàng)目是否正確,以及所有為了完整構(gòu)建必要的信息是否可用
    generate-sources 生成所有需要包含在編譯過程中的源代碼
    process-sources 處理源代碼,比如過濾一些值
    generate-resources 生成所有需要包含在打包過程中的資源文件
    process-resources 復(fù)制并處理資源文件至目標(biāo)目錄,準(zhǔn)備打包
    compile 編譯項(xiàng)目的源代碼
    process-classes 后處理編譯生成的文件,例如對(duì)Java類進(jìn)行字節(jié)碼增強(qiáng)(bytecode enhancement)
    generate-test-sources 生成所有包含在測(cè)試編譯過程中的測(cè)試源碼
    process-test-sources 處理測(cè)試源碼,比如過濾一些值
    generate-test-resources 生成測(cè)試需要的資源文件
    process-test-resources 復(fù)制并處理測(cè)試資源文件至測(cè)試目標(biāo)目錄
    test-compile 編譯測(cè)試源碼至測(cè)試目標(biāo)目錄
    test 使用合適的單元測(cè)試框架運(yùn)行測(cè)試。這些測(cè)試應(yīng)該不需要代碼被打包或發(fā)布
    prepare-package 在真正的打包之前,執(zhí)行一些準(zhǔn)備打包必要的操作。這通常會(huì)產(chǎn)生一個(gè)包的展開的處理過的版本(將會(huì)在Maven 2.1+中實(shí)現(xiàn))
    package 將編譯好的代碼打包成可分發(fā)的格式,如JAR,WAR,或者EAR
    pre-integration-test 執(zhí)行一些在集成測(cè)試運(yùn)行之前需要的動(dòng)作。如建立集成測(cè)試需要的環(huán)境
    integration-test 如果有必要的話,處理包并發(fā)布至集成測(cè)試可以運(yùn)行的環(huán)境
    post-integration-test 執(zhí)行一些在集成測(cè)試運(yùn)行之后需要的動(dòng)作。如清理集成測(cè)試環(huán)境。
    verify 執(zhí)行所有檢查,驗(yàn)證包是有效的,符合質(zhì)量規(guī)范
    install 安裝包至本地倉(cāng)庫(kù),以備本地的其它項(xiàng)目作為依賴使用
    deploy 復(fù)制最終的包至遠(yuǎn)程倉(cāng)庫(kù),共享給其它開發(fā)人員和項(xiàng)目(通常和一次正式的發(fā)布相關(guān))

    maven核心的插件列表可以參考 http://maven.apache.org/plugins/index.html 。這里僅列舉幾個(gè)常用的插件及其配置參數(shù):

    1. clean插件
      只包含一個(gè)goal叫做 clean:clean ,負(fù)責(zé)清理構(gòu)建時(shí)候創(chuàng)建的文件。 默認(rèn)清理的位置是如下幾個(gè)變量指定的路徑project.build.directory, project.build.outputDirectory, project.build.testOutputDirectory, and project.reporting.outputDirectory
    2. compiler插件
      包含2個(gè)goal,分別是 compiler:compilecompiler:testCompile 。可以到這里查看兩者的具體參數(shù)設(shè)置:compile ,testCompile 。
    3. surefire插件
      運(yùn)行單元測(cè)試用例的插件,并且能夠生成報(bào)表。包含一個(gè)goal為 surefire:test 。主要參數(shù)testSourceDirectory用來指定測(cè)試用例目錄,參考完整用法幫助
    4. jar
      負(fù)責(zé)將工程輸出打包到j(luò)ar文件中。包含兩個(gè)goal,分別是 jar:jar , jar:test-jar 。兩個(gè)goal負(fù)責(zé)從classesDirectory或testClassesDirectory中獲取所有資源,然后輸出jar文件到outputDirectory中。
    5. war
      負(fù)責(zé)打包成war文件。常用goal有 war:war ,負(fù)責(zé)從warSourceDirectory(默認(rèn)${basedir}/src/main/webapp)打包所有資源到outputDirectory中。
    6. resources
      負(fù)責(zé)復(fù)制各種資源文件,常用goal有 resources:resources ,負(fù)責(zé)將資源文件復(fù)制到outputDirectory中,默認(rèn)為${project.build.outputDirectory}。
    7. install
      負(fù)責(zé)將項(xiàng)目輸出(install:install)或者某個(gè)指定的文件(install:install-file)加入到本機(jī)庫(kù)%USERPROFILE%/.m2/repository中。可以用 install:help 尋求幫助。
    8. deploy
      負(fù)責(zé)將項(xiàng)目輸出(deploy:deploy)或者某個(gè)指定的文件(deploy:deploy-file)加入到公司庫(kù)中。
    9. site
      將工程所有文檔生成網(wǎng)站,生成的網(wǎng)站界面默認(rèn)和apache的項(xiàng)目站點(diǎn)類似,但是其文檔用doxia格式寫的,目前不支持docbook,需要用其他插件配合才能支持。

    maven的使用問答

    除了以下的幾個(gè)faq條目之外,還有一些faq可以參考

    1. maven 自己的FAQ

    兄弟們?nèi)绻衅渌麊栴},歡迎跟帖提問!

    依賴關(guān)系

    問:如何增加刪除一個(gè)依賴關(guān)系?

    答:直接在pom文件中加入一個(gè)dependency節(jié)點(diǎn),如果要?jiǎng)h除依賴,把對(duì)應(yīng)的dependency節(jié)點(diǎn)刪除即可。

    問:如何屏蔽一個(gè)依賴關(guān)系?比如項(xiàng)目中使用的libA依賴某個(gè)庫(kù)的1.0版,libB以來某個(gè)庫(kù)的2.0版,現(xiàn)在想統(tǒng)一使用2.0版,如何去掉1.0版的依賴?

    答:設(shè)置exclusion即可。

    Xml代碼

    1. org.hibernate
    2. hibernate
    3. 3.2.5.ga
    4. javax.transaction
    5. jta

    問:我有一些jar文件要依賴,但是我又不想把這些jar去install到mvn的repository中去,怎么做配置?

    答:加入一個(gè)特殊的依賴關(guān)系,使用system類型,如下:

    
     	com.abc
     	my-tools
     	2.5.0
     	jar
    	 system
     ${basedir}/lib/mylib1.jar
    	
     
    

    但是要記住,發(fā)布的時(shí)候不會(huì)復(fù)制這個(gè)jar。需要手工配置,而且其他project依賴這個(gè)project的時(shí)候,會(huì)報(bào)告警告。如果沒有特殊要求,建議直接注冊(cè)發(fā)布到repository。

    問:在eclipse環(huán)境中同時(shí)使用maven builder和eclipse builder,并且設(shè)置項(xiàng)目依賴關(guān)系之后,為什么編譯會(huì)出現(xiàn)artifact找不到錯(cuò)誤,但是直接使用命令行mvn構(gòu)建則一切正常?

    答:在project屬性中去掉java build path中對(duì)其他 project 的依賴關(guān)系,直接在pom中設(shè)置依賴關(guān)系即可

     	
    	com.abc.project1
    	abc-project1-common
    	${project.version}
     	
     
    

    另外,保證沒有其他錯(cuò)誤。

    問:我想讓輸出的jar包自動(dòng)包含所有的依賴

    答:使用 assembly 插件即可。

    
     maven-assembly-plugin
     
     
     jar-with-dependencies
     
     
     
     
    

    問:我的測(cè)試用例依賴于其他工程的測(cè)試用例,如何設(shè)置?

    答:maven本身在發(fā)布的時(shí)候,可以發(fā)布單純的jar,也可以同時(shí)發(fā)布xxx-tests.jar和xxx-javadoc.jar(大家經(jīng)常在repository中可以看到類似的東西)。我們自己的項(xiàng)目A要同時(shí)輸出test.jar可以做如下的設(shè)置

     
     org.apache.maven.plugins
     maven-jar-plugin
     
     
     
     test-jar
     
     
     
     
     
    

    然后在其他需要引用的工程B中做如下的dependency設(shè)置

    Xml代碼

    1. com.abc.XXX
    2. 工程A
    3. ${project.version}
    4. test-jar
    5. test

    變量

    問:如何使用變量替換?項(xiàng)目中的某個(gè)配置文件比如jdbc.properties使用了一些pom中的變量,如何在發(fā)布中使用包含真實(shí)內(nèi)容的最終結(jié)果文件?

    答:使用資源過濾功能,比如:

    
     ..
     
     com.mysql.jdbc.Driver
     jdbc:mysql://localhost:3306/development_db
     dev_user
     s3cr3tw0rd
     
     ..
     
     
     
     src/main/resources
     true
     
     
     
     ..
     
     
     production
     
     oracle.jdbc.driver.OracleDriver
     jdbc:oracle:thin:@proddb01:1521:PROD
     prod_user
     s00p3rs3cr3t
     
     
     
    
     
    

    問: maven-svn-revision-number-plugin 插件說明

    答: maven-svn-revision-number-plugin 可以從 SVN 中獲取版本號(hào),并將其變成環(huán)境變量,交由其他插件或者profile使用,詳細(xì)幫助在這里 。一般和resource的filter機(jī)制同時(shí)使用

    
     
     com.google.code.maven-svn-revision-number-plugin
     maven-svn-revision-number-plugin
     1.3
     
     
     
     revision
     
     
     
     
     
     
     prefix
     
     
     
     
     
     
    

    這段代碼負(fù)責(zé)把resource文件中的內(nèi)容替換成適當(dāng)內(nèi)容

    repository = ${prefix.repository}
    path = ${prefix.path}
    revision = ${prefix.revision}
    mixedRevisions = ${prefix.mixedRevisions}
    committedRevision = ${prefix.committedRevision}
    status = ${prefix.status}
    specialStatus = ${prefix.specialStatus}

    編譯

    問:如何給插件指派參數(shù)?比如我要設(shè)置一些編譯參數(shù)

    答:以下內(nèi)容設(shè)定編譯器編譯java1.5的代碼

    
     ...
     
     ...
     
     
     maven-compiler-plugin
     
     1.5
     1.5
     
     
     
     ...
     
     ...
    
     
    
    

    要設(shè)置其他插件的參數(shù)也可以,請(qǐng)參考對(duì)應(yīng)插件的幫助信息

    問:我的目錄是非標(biāo)準(zhǔn)的目錄結(jié)構(gòu),如何設(shè)置讓maven支持?

    答:指定source目錄和test-source目錄即可。

    
     target
     src
     

    這個(gè)例子把源代碼設(shè)置成了src目錄,測(cè)試代碼在test目錄,所以輸出到bin目錄。這里要注意,directory如果也設(shè)置成bin目錄的 話,maven打包的時(shí)候會(huì)引起死循環(huán),因?yàn)閐irectory是所有工作存放的地方,默認(rèn)包含outputDirectory定義的目錄在內(nèi)。

    http://www.iteye.com/topic/973166

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Maven小技巧

    Maven小技巧:前言 Maven,發(fā)音是[`meivin],專家的意思。它是一個(gè)很好的項(xiàng)目管理工具,很早就進(jìn)入了我的必備工具行列,但是這次為了把ABPM項(xiàng)目 完全遷移并應(yīng)用maven,所以對(duì)maven進(jìn)行了一些深入的學(xué)習(xí)。寫這個(gè)學(xué)習(xí)筆記的目的,一個(gè)是為了自己備忘,二則希望能夠?yàn)槠渌?
    推薦度:
    標(biāo)簽: 小技巧 技巧 專家
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 亚洲精品国产精品精 | 欧美精品国产综合久久 | 黄片毛片一级 | 北条麻妃在线播放 | 国产精选在线视频 | 国产精品免费看 | 免费视频一区二区 | 国产欧美日韩va | 国产毛片不卡 | 精品日本一区二区三区在线观看 | 国产一级做a爰片在线看 | 精品国产不卡一区二区三区 | 国产一区二区久久久 | 北条麻妃在线观看 | 国产精品资源在线观看 | 久国产精品视频 | 久久亚洲伊人成综合人影院 | 亚洲一区二区三区夜色 | 日韩一区三区 | 久久久久久久久久久9精品视频 | 可以免费观看的毛片 | 久久一本日韩精品中文字幕屁孩 | 国产成人综合久久 | 国产不卡在线看 | 久久99精品久久久久久噜噜 | 欧美国产综合在线 | 国外欧美一区另类中文字幕 | 亚洲成人一区在线 | 国产成人精品一区二三区在线观看 | 久久无码精品一区二区三区 | 久久精品一区 | 亚洲 欧美 日韩 综合 | 国产手机在线αⅴ片无码观看 | 久久久久久久一精品 | 国产一区二区三区在线视频 | 欧美一区二区视频 | 中文国产成人精品久久96 | 自拍自偷 | 99久久综合 | 国产成人精品免费大全 | 亚洲 欧美 自拍 另类 欧美 |