posts - 110, comments - 101, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          maven常見問題問答 收藏

          Posted on 2011-11-04 17:31 云云 閱讀(2467) 評論(0)  編輯  收藏

          1.前言

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

          2. maven概要

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

          2.1 maven不是什么

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

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

          2.2 maven是什么

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

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

          2.3 maven的生命周期

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

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

          2.4 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 單元測試目錄
                • /src/test/java
            • /target 輸出目錄,所有的輸出物都存放在這個目錄下
              • /target/classes 編譯之后的class文件

          每一個階段的任務(wù)都知道怎么正確完成自己的工作,比如compile任務(wù)就知道從src/main/java下編譯所有的java文件,并把它的輸出class文件存放到target/classes中。

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

          2.5 maven的版本規(guī)范

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

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

          maven有自己的版本規(guī)范,一般是如下定義 <major version>.<minor version>.<incremental version>-<qualifier> ,比如1.2.3-beta-01。要說明的是,maven自己判斷版本的算法是major,minor,incremental部分用數(shù)字比較,qualifier部分用字符串比較,所以要小心 alpha-2和alpha-15的比較關(guān)系,最好用 alpha-02的格式。

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

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

          2.6 maven的組成部分

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

          2.7 maven的依賴管理

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

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

          • groupId 必須
          • artifactId 必須
          • version 必須。
            這里的version可以用區(qū)間表達(dá)式來表示,比如(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多個條件之間用逗號分隔,比如[1,3),[5,7]。
          • scope 作用域限制
          • type 一般在pom引用依賴時候出現(xiàn),其他時候不用
          • optional 是否可選依賴

          maven認(rèn)為,程序?qū)ν獠康囊蕾嚂S著程序的所處階段和應(yīng)用場景而變化,所以maven中的依賴關(guān)系有作用域(scope)的限制。在maven中,scope包含如下的取值:

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

          另外,代碼有代碼自己的依賴,各個maven使用的插件也可以有自己的依賴關(guān)系。依賴也可以是可選的,比如我們代碼中沒有任何cache依賴,但是hibernate可能要配置cache,所以該cache的依賴就是可選的。

          2.8 多項(xiàng)目管理

          maven的多項(xiàng)目管理也是非常強(qiáng)大的。一般來說,maven要求同一個工程的所有子項(xiàng)目都放置到同一個目錄下,每一個子目錄代表一個項(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都會繼承總項(xiàng)目pom的內(nèi)容,取值為子項(xiàng)目pom內(nèi)容優(yōu)先。

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

          <modules>
          <module>simple-weather</module>
          <module>simple-webapp</module>
          </modules>

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

          <parent>
          <groupId>org.sonatype.mavenbook.ch06</groupId>
          <artifactId>simple-parent</artifactId>
          <version>1.0</version>
          </parent>

          即可。

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


          <project>
          <description>This is a project requiring JDBC</description>
          ...
          <dependencies>
          ...
          <dependency>
          <groupId>org.sonatype.mavenbook</groupId>
          <artifactId>persistence-deps</artifactId>
          <version>1.0</version>
          <type>pom</type>
          </dependency>
          </dependencies>
          </project>

          2.9 屬性

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


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

          2.10 maven的profile

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

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

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

          3. maven的操作和使用

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

          3.1 maven的配置文件

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

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

          3.2 創(chuàng)建新工程

          要創(chuàng)建一個新的maven工程,我們需要給我們的工程指定幾個必要的要素,就是maven產(chǎn)品坐標(biāo)的幾個要素:groupId, artifactId,如果愿意,你也可以指定version和package名稱。我們先看一個簡單的創(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 要求的方式。這個命令創(chuàng)建一個web工程,目錄結(jié)構(gòu)是一個標(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 如果我們傳入其他的就會創(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參考信息

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

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

          <modules>
          <module>ABCCommon</module>
          <module>ABCCore</module>
          <module>ABCTools</module>
          </modules>

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


          <parent>
          <groupId>com.abc.product1</groupId>
          <artifactId>abc-product1</artifactId>
          <version>1.0.0-SNAPSHOT</version>
          </parent>
          <artifactId>abc-my-module2</artifactId>
          <packaging>jar</packaging>

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

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

          <dependency>
          <groupId>org.sonatype.mavenbook</groupId>
          <artifactId>persistence-deps</artifactId>
          <version>1.0</version>
          <type>pom</type>
          </dependency>

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

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

          <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring</artifactId>
          </dependency>

          這種方法可以避免版本號滿天飛的情況。

          3.4 安裝庫文件到maven庫中

          在maven中一般都會用到安裝庫文件的功能,一則是我們常用的hibernate要使用jmx庫,但是因?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://xxx.ss.com/sss.xxx -DrepositoryId=release-repo

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

          <distributionManagement>
          <repository>
          <id>mycompany-repository</id>
          <name>MyCompany Repository</name>
          <url>scp://repository.mycompany.com/repository/maven2</url>
          </repository>
          </distributionManagement>

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


          <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation
          ="http://maven.apache.org/SETTINGS/1.0.0
          http://maven.apache.org/xsd/settings-1.0.0.xsd"
          >
          ...
          <servers>
          <server>
          <id>mycompany-repository</id>
          <username>jvanzyl</username>
          <!-- Default value is ~/.ssh/id_dsa -->
          <privateKey>/path/to/identity</privateKey>
          <passphrase>my_key_passphrase</passphrase>
          </server>
          </servers>
          ...
          </settings>

           

          3.5 maven的變量

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

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

          3.6 maven的使用

          我們已經(jīng)知道m(xù)aven預(yù)定義了許多的階段(phase),每個插件都依附于這些階段,并且在進(jìn)入某個階段的時候,調(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 后處理編譯生成的文件,例如對Java類進(jìn)行字節(jié)碼增強(qiáng)(bytecode enhancement)
          generate-test-sources 生成所有包含在測試編譯過程中的測試源碼
          process-test-sources 處理測試源碼,比如過濾一些值
          generate-test-resources 生成測試需要的資源文件
          process-test-resources 復(fù)制并處理測試資源文件至測試目標(biāo)目錄
          test-compile 編譯測試源碼至測試目標(biāo)目錄
          test 使用合適的單元測試框架運(yùn)行測試。這些測試應(yīng)該不需要代碼被打包或發(fā)布
          prepare-package 在真正的打包之前,執(zhí)行一些準(zhǔn)備打包必要的操作。這通常會產(chǎn)生一個包的展開的處理過的版本(將會在Maven 2.1+中實(shí)現(xiàn))
          package 將編譯好的代碼打包成可分發(fā)的格式,如JAR,WAR,或者EAR
          pre-integration-test 執(zhí)行一些在集成測試運(yùn)行之前需要的動作。如建立集成測試需要的環(huán)境
          integration-test 如果有必要的話,處理包并發(fā)布至集成測試可以運(yùn)行的環(huán)境
          post-integration-test 執(zhí)行一些在集成測試運(yùn)行之后需要的動作。如清理集成測試環(huán)境。
          verify 執(zhí)行所有檢查,驗(yàn)證包是有效的,符合質(zhì)量規(guī)范
          install 安裝包至本地倉庫,以備本地的其它項(xiàng)目作為依賴使用
          deploy 復(fù)制最終的包至遠(yuǎn)程倉庫,共享給其它開發(fā)人員和項(xiàng)目(通常和一次正式的發(fā)布相關(guān))

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

          1. clean插件
            只包含一個goal叫做 clean:clean ,負(fù)責(zé)清理構(gòu)建時候創(chuàng)建的文件。 默認(rèn)清理的位置是如下幾個變量指定的路徑 project.build.directory, project.build.outputDirectory, project.build.testOutputDirectory, and project.reporting.outputDirectory
          2. compiler插件
            包含2個goal,分別是 compiler:compilecompiler:testCompile 。可以到這里查看兩者的具體參數(shù)設(shè)置:compile , testCompile
          3. surefire插件
            運(yùn)行單元測試用例的插件,并且能夠生成報表。包含一個goal為 surefire:test 。主要參數(shù)testSourceDirectory用來指定測試用例目錄,參考完整用法幫助
          4. jar
            負(fù)責(zé)將工程輸出打包到j(luò)ar文件中。包含兩個goal,分別是 jar:jar , jar:test-jar 。兩個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)或者某個指定的文件(install:install-file)加入到本機(jī)庫%USERPROFILE%/.m2/repository中。可以用 install:help 尋求幫助。
          8. deploy
            負(fù)責(zé)將項(xiàng)目輸出(deploy:deploy)或者某個指定的文件(deploy:deploy-file)加入到公司庫中。
          9. site
            將工程所有文檔生成網(wǎng)站,生成的網(wǎng)站界面默認(rèn)和apache的項(xiàng)目站點(diǎn)類似,但是其文檔用doxia格式寫的,目前不支持docbook,需要用其他插件配合才能支持。需要指出的是,在maven 2.x系列中和maven3.x的site命令處理是不同的,在舊版本中,用 mvn site 命令可以生成reporting節(jié)點(diǎn)中的所有報表,但是在maven3中,reporting過時了,要把這些內(nèi)容作為 maven-site-plugin的configuration的內(nèi)容才行。詳細(xì)內(nèi)容可以參考http://www.wakaleo.com/blog/292-site-generation-in-maven-3

          4. maven的使用問答

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

          1. maven 自己的FAQ

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

          4.1 依賴關(guān)系

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

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

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

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

          <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate</artifactId>
          <version>3.2.5.ga</version>
          <exclusions>
          <exclusion>
          <groupId>javax.transaction</groupId>
          <artifactId>jta</artifactId>
          </exclusion>
          </exclusions>
          </dependency>
          3) 問:我有一些jar文件要依賴,但是我又不想把這些jar去install到mvn的repository中去,怎么做配置?

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

          <dependency>
          <groupId>com.abc</groupId>
          <artifactId>my-tools</artifactId>
          <version>2.5.0</version>
          <type>jar</type>
          <scope>system</scope>
          <systemPath>${basedir}/lib/mylib1.jar</systemPath>
          </dependency>
          但是要記住,發(fā)布的時候不會復(fù)制這個jar。需要手工配置,而且其他project依賴這個project的時候,會報告警告。如果沒有特殊要求,建議直接注冊發(fā)布到repository。
          4) 問:在eclipse環(huán)境中同時使用maven builder和eclipse builder,并且設(shè)置項(xiàng)目依賴關(guān)系之后,為什么編譯會出現(xiàn)artifact找不到錯誤,但是直接使用命令行mvn構(gòu)建則一切正常?

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

          <!-- 依賴的其他項(xiàng)目 -->
          <dependency>
          <groupId>com.abc.project1</groupId>
          <artifactId>abc-project1-common</artifactId>
          <version>${project.version}</version>
          </dependency>
          另外,保證沒有其他錯誤。
          5) 問:我想讓輸出的jar包自動包含所有的依賴

          答:使用 assembly 插件即可。

          <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <configuration>
          <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          </configuration>
          </plugin>
           
          6) 問:我的測試用例依賴于其他工程的測試用例,如何設(shè)置?

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

          <!-- 用于把test代碼也做成一個jar -->
          <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <executions>
          <execution>
          <goals>
          <goal>test-jar</goal>
          </goals>
          </execution>
          </executions>
          </plugin>
          然后在其他需要引用的工程B中做如下的dependency設(shè)置
          <dependency>
          <groupId>com.abc.XXX</groupId>
          <artifactId>工程A</artifactId>
          <version>${project.version}</version>
          <type>test-jar</type>
          <scope>test</scope>
          </dependency>
          7)如何讓maven將工程依賴的jar復(fù)制到WEB-INF/lib目錄下?

           

          8)我剛剛更新了一下我的nexus庫,但是我無法在eclipse中用m2eclipse找到我新增的庫文件

          修改pom.xml文件,將舊版jar的依賴內(nèi)容中的版本直接修改為新版本即可。

           

          9)我要的jar最新版不在maven的中央庫中,我怎么辦?

          將依賴的文件安裝到本地庫,用如下命令可以完成:

          mvn install:install-file
            -Dfile=<path-to-file>
            -DgroupId=<group-id>
            -DartifactId=<artifact-id>
            -Dversion=<version>
            -Dpackaging=<packaging>
            -DgeneratePom=true
          
          Where: <path-to-file>  the path to the file to load
                 <group-id>      the group that the file should be registered under
                 <artifact-id>   the artifact name for the file
                 <version>       the version of the file
                 <packaging>     the packaging of the file e.g. jar     
          10)

          4.2 變量

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

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

          <project>
          ...
          <properties>
          <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
          <jdbc.url>jdbc:mysql://localhost:3306/development_db</jdbc.url>
          <jdbc.username>dev_user</jdbc.username>
          <jdbc.password>s3cr3tw0rd</jdbc.password>
          </properties>
          ...
          <build>
          <resources>
          <resource>
          <directory>src/main/resources</directory>
          <filtering>true</filtering>
          </resource>
          </resources>
          </build>
          ...
          <profiles>
          <profile>
          <id>production</id>
          <properties>
          <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName>
          <jdbc.url>jdbc:oracle:thin:@proddb01:1521:PROD</jdbc.url>
          <jdbc.username>prod_user</jdbc.username>
          <jdbc.password>s00p3rs3cr3t</jdbc.password>
          </properties>
          </profile>
          </profiles>
          </project>
          2) 問: maven-svn-revision-number-plugin 插件說明

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

          <plugins>
          <plugin>
          <groupId>com.google.code.maven-svn-revision-number-plugin</groupId>
          <artifactId>maven-svn-revision-number-plugin</artifactId>
          <version>1.3</version>
          <executions>
          <execution>
          <goals>
          <goal>revision</goal>
          </goals>
          </execution>
          </executions>
          <configuration>
          <entries>
          <entry>
          <prefix>prefix</prefix>
          </entry>
          </entries>
          </configuration>
          </plugin>
          </plugins>

          這段代碼負(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}
          3)我的程序有些單元測試有錯誤,如何忽略測試步驟?

          有好幾種方法都可以實(shí)現(xiàn)跳過單元測試步驟,一種是給mvn增加命令行參數(shù) -Dmaven.test.skip=true 或者 -DskipTests=true ;另外一種是給surefire插件增加參數(shù),如下:

          <project>
            [...]
            <build>
              <plugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-surefire-plugin</artifactId>
                  <version>2.8</version>
                  <configuration>
                    <skipTests>true</skipTests>
                  </configuration>
                </plugin>
              </plugins>
            </build>
            [...]
          </project>
          .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
          4) 如果只想運(yùn)行單個測試用例,能否實(shí)現(xiàn)?

          可以,運(yùn)行時候增加命令行參數(shù) -Dtest=MyTest 即可,其中MyTest是所需要運(yùn)行的單元測試用例名稱,但是不需要包含package部分。

          4.3 編譯

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

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

          <project>
          ...
          <build>
          ...
          <plugins>
          <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
          <source>1.5</source>
          <target>1.5</target>
          </configuration>
          </plugin>
          </plugins>
          ...
          </build>
          ...
          </project>
          要設(shè)置其他插件的參數(shù)也可以,請參考對應(yīng)插件的幫助信息
          2) 問:我的目錄是非標(biāo)準(zhǔn)的目錄結(jié)構(gòu),如何設(shè)置讓maven支持?

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

          <build>
          <directory>target</directory>
          <sourceDirectory>src</sourceDirectory>
          <scriptSourceDirectory>js/scripts</scriptSourceDirectory>
          <testSourceDirectory>test</testSourceDirectory>
          <outputDirectory>bin</outputDirectory>
          <testOutputDirectory>bin</testOutputDirectory>
          </build>
          這個例子把源代碼設(shè)置成了src目錄,測試代碼在test目錄,所以輸出到bin目錄。這里要注意,directory如果也設(shè)置成bin目錄的話,maven打包的時候會引起死循環(huán),因?yàn)閐irectory是所有工作存放的地方,默認(rèn)包含outputDirectory定義的目錄在內(nèi)。
          3) 我源代碼是UTF8格式的,我如何在maven中指定?

          設(shè)置一個變量即可

          <project>
          ...
          <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          </properties>
          ...
          </project>
          {color:blue}以上是官方給出的解決方案,但是經(jīng)過嘗試這樣只能影響到resource處理時候的編碼{color},真正有用的是如下配置:
          {code:xml}
          <build>
            ...
              <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                  <encoding>UTF-8</encoding>
                </configuration>
              </plugin>
            ...
          </build>
          {code}
          . 問:我的項(xiàng)目除了main/java目錄之外,還加了其他的c++目錄,想要一并編譯,如何做?
          答:使用native插件,具體配置方法參考[http://mojo.codehaus.org/maven-native/native-maven-plugin/]
          {code:xml}
          <plugin>
              <groupId>org.codehaus.mojo</groupId>
              <artifactId>native-maven-plugin</artifactId>
              <extensions>true</extensions>
              <configuration>
          </plugin>    
          {code}
          . 問:我想要把工程的所有依賴的jar都一起打包,怎么辦?
          答:首先修改maven的配置文件,給maven-assembly-plugin增加一個jar-with-dependencies的描述。
          {code:xml}
          <project>
            [...]
            <build>
              <plugins>
                <plugin>
                  <artifactId>maven-assembly-plugin</artifactId>
                  <configuration>
                    <descriptorRefs>
                      <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                  </configuration>
                </plugin>
              </plugins>
            </build>
            [...]
          </project>
          {code}
          然后使用命令打包即可:
          mvn assembly:assembly
          . 問:我想把main/scripts中的內(nèi)容一起打包發(fā)布,如何做?
          答:在pom中配置額外的資源目錄。如果需要的話,還可以指定資源目錄的輸出位置
          {code:xml}
          <build>
            ...
            <resources>
              <resource>
                <filtering>true</filtering>
                <directory>src/main/command</directory>
                <includes>
                  <include>run.bat</include>
                  <include>run.sh</include>
                </includes>
                <targetPath>/abc</targetPath>
              </resource>
              <resource>
                <directory>src/main/scripts</directory>
              </resource>
            </resources>
            ...
          </build>
          {code}
          . 問:我有多個源代碼目錄,但是maven只支持一個main src和一個test src,怎么辦?
          答:使用另外一個插件,并仿照如下配置pom
          {code:xml}
          <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>build-helper-maven-plugin</artifactId>
                  <version>1.1</version>
                  <executions>
                    <execution>
                      <id>add-source</id>
                      <phase>generate-sources</phase>
                      <goals>
                        <goal>add-source</goal>
                      </goals>
                      <configuration>
                        <sources>
                          <source>src/config/java</source>
                          <source>src/main/java</source>
                          <source>src/member/java</source>
                        </sources>
                      </configuration>
                    </execution>
                  </executions>
                </plugin>
          {code}
          . 問:我的源代碼目錄中有一部分文件我不想讓maven編譯,怎么做?
          答:使用一個maven插件,然后使用includes和excludes。同理,也可以處理資源的過濾。
          {code:xml}
          <build>
            <sourceDirectory>http://www.cnblogs.com/src/java</sourceDirectory>
            <plugins>
              <plugin>
                <groupId>com.sun.enterprise</groupId>
                <artifactId>hk2-maven-plugin</artifactId>
                <configuration>
                  <includes>
                    <include>com/sun/logging/LogDomains.*</include>
                    <include>com/sun/enterprise/util/OS.java</include>
                    <include>com/sun/enterprise/util/io/FileUtils.java</include>
                    <include>com/sun/enterprise/util/zip/**</include>
                    <include>com/sun/enterprise/util/i18n/**</include>
                    <include>com/sun/enterprise/deployment/backend/IASDeploymentException.java</include>
                  </includes>
                  <excludes>
                    <exclude>com/sun/enterprise/config/ConfigBeansFactory.java</exclude>
                    <exclude>com/sun/enterprise/config/clientbeans/**</exclude>
                  </excludes>
                </configuration>
              </plugin>
            </plugins>
            <resources>
              <resource>
                <directory>http://www.cnblogs.com/src/java</directory>
                <includes>
                  <include>**/*.properties</include>
                </includes>
              </resource>
            </resources>
          </build>
          {code}
          . 問:我的項(xiàng)目是一個純的html組成的項(xiàng)目,沒有任何的java代碼,怎么跳過編譯過程?
          答:配置如下
          {code:xml}
          <build>
            <sourceDirectory>src/java</sourceDirectory>
            <plugins>
              <plugin>
              <groupId>com.sun.enterprise</groupId>
              <artifactId>hk2-maven-plugin</artifactId>
              </plugin>
            </plugins>
          </build>
          {code}
          . 問:我的工程里用hibernate,想在編譯時候自動生成ddl,如何做?
          答:添加插件
          hibernate3-maven-plugin
          ,按照如下配置:
          {code:xml}
                  <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>hibernate3-maven-plugin</artifactId>
                    <version>2.1</version>
                    <configuration>
                      <components>
                        <component>
                          <name>hbm2ddl</name>
                          <implementation>annotationconfiguration</implementation>
                        </component>
                      </components>
                    </configuration>
                    <dependencies>
                      <dependency>
                        <groupId>hsqldb</groupId>
                        <artifactId>hsqldb</artifactId>
                        <version>${hsqldb.version}</version>
                      </dependency>
                    </dependencies>
                  </plugin>
          {code}
          . 問:我能用maven支持eclipse RCP項(xiàng)目嗎?

          答:當(dāng)然可以,你可以使用插件 Tycho,詳細(xì)內(nèi)容可以參考這里[http://mattiasholmqvist.se/2010/02/building-with-tycho-part-1-osgi-bundles/].

           <plugin>
            <groupid>org.sonatype.tycho</groupid>
            <artifactid>target-platform-configuration</artifactid>
            <version>0.7.0</version>
            <configuration>
              <resolver>p2</resolver>
            </configuration>
          </plugin>
          另外,老牌的pde-maven-plugin就不要用了,已經(jīng)好幾年沒見更新了。

          4.4 ant互動

          1) 如何在maven編譯時候運(yùn)行ant腳本?

          使用專門的antrun插件,并且在target標(biāo)簽內(nèi)部加入ant的代碼

                <plugin>
                  <artifactId>maven-antrun-plugin</artifactId>
                  <version>1.6</version>
                  <executions>
                    <execution>
                      <phase> <!-- 生命周期階段 --> </phase>
                      <configuration>
                        <target>
                          <!-- 加入target內(nèi)部的代碼 -->
                        </target>
                      </configuration>
                      <goals>
                        <goal>run</goal>
                      </goals>
                    </execution>
                  </executions>
                </plugin>
          .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

          2)如何在ant腳本中引用maven的classpath?

          maven給每一個依賴都生成了一個屬性,格式為"groupId:artifactId[:classifier]:type",比如,如果一下例子就顯示依賴的org.apache.common-util的jar文件路徑

          <echo message="Dependency JAR Path: ${org.apache:common-util:jar}"/> 

          另外,maven還預(yù)定義了四個classpath的引用,他們是

          • maven.compile.classpath
          • maven.runtime.classpath
          • maven.test.classpath
          • maven.plugin.classpath

          3)如何使用antrun插件運(yùn)行外部的build文件?

          很簡單,直接在antrun里邊使用ant指令即可,如下:

          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-antrun-plugin</artifactId>
              <version>1.6</version>
              <executions>
                  <execution>
                      <id>compile</id>
                      <phase>compile</phase>
                      <configuration>
                          <target>
                              <!-- 同時傳遞內(nèi)置的classpath給外部ant文件 -->
                              <property name="compile_classpath" refid="maven.compile.classpath"/>
                              <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                              <property name="test_classpath" refid="maven.test.classpath"/>
                              <property name="plugin_classpath" refid="maven.plugin.classpath"/>
              
                              <ant antfile="${basedir}/build.xml">
                                  <target name="test"/>
                              </ant>
                          </target>
                      </configuration>
                      <goals>
                          <goal>run</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
          .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
          . 問:如何在ant中使用maven的功能?
          答:使用ant的[maven task|http://maven.apache.org/ant-tasks/index.html],不過只有ant 1.6以上和jdk 1.5環(huán)境才支持。

          h4. 測試相關(guān)

          . 問:如何忽略某個階段的結(jié)果?比如單元測試不一定要全正確
          答:給插件增加testFailureIgnore參數(shù),并設(shè)置為false。如果要屏蔽該階段,則用
          <skip>true</skip>
          {code:xml}
          <project>
            [...]
            <build>
              <plugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-surefire-plugin</artifactId>
                  <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                  </configuration>
                </plugin>
              </plugins>
            </build>
            [...]
          </project>
          {code}
          . 問:我如何在maven中加入PMD,CheckStyle,JDepend等檢查功能?
          答:加入PMD檢查,以下代碼如果在
          reporting
          節(jié)點(diǎn)中加入則在
          mvn site
          中執(zhí)行,如果在
          build
          節(jié)點(diǎn)中加入,則在build的時候自動運(yùn)行檢查。詳細(xì)配置參考[pmd插件使用說明|http://maven.apache.org/plugins/maven-pmd-plugin/]
          {code:xml}
              <plugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-pmd-plugin</artifactId>
                  <version>2.5</version>
                </plugin>
              </plugins>
          {code}
          加入 checkstyle 檢查,詳細(xì)配置參考[checkstyle插件使用說明|http://maven.apache.org/plugins/maven-checkstyle-plugin/],同樣注意放置在reporting和build節(jié)點(diǎn)中的區(qū)別(所有報表類插件都要同樣注意):
          {code:xml}
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-checkstyle-plugin</artifactId>
                  <version>2.5</version>
                </plugin>
          {code}
          加入 simian 的支持,simian是一個支持代碼相似度檢查的工具,目前有maven插件,也有checkstyle的插件。它不僅可以檢查java,甚至可以支持文本文件的檢查。詳細(xì)幫助信息參考[這里|http://www.redhillconsulting.com.au/products/simian/]。simian 的 maven插件在[這里|http://mojo.codehaus.org/simian-report-maven-plugin/introduction.html]
          {code:xml}
                <build>
                   <plugins>
                      <plugin>
                         <groupId>org.codehaus.mojo</groupId>
                         <artifactId>simian-maven-plugin</artifactId>
                         <version>1.6.1</version>
                      </plugin>
                   </plugins>
                   ...
                </build>
          {code}
          加入 jdepend 檢查,詳細(xì)配置參考[jdepend使用說明|http://mojo.codehaus.org/jdepend-maven-plugin/],
          {code:xml}
                <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>jdepend-maven-plugin</artifactId>
                  <version>2.0-beta-2</version>
                </plugin>
          {code}
          加入 findbugz 檢查,詳細(xì)配置參考[findbugz使用說明|http://mojo.codehaus.org/findbugs-maven-plugin/usage.html],
          {code:xml}
                <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>findbugs-maven-plugin</artifactId>
                  <version>2.0.1</version>
                </plugin>
          {code}
          加入javadoc生成,詳細(xì)配置參考[javadoc usage|http://maven.apache.org/plugins/maven-javadoc-plugin/usage.html]
          {code:xml}
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-javadoc-plugin</artifactId>
                  <version>2.7</version>
                  <configuration>
                    ...
                  </configuration>
                </plugin>
          {code}
          加入 jxr 支持,JXR是一個生成java代碼交叉引用和源代碼的html格式的工具,詳細(xì)配置信息參考[jxr usage|http://maven.apache.org/plugins/maven-jxr-plugin/]。注意,jxr沒有必要在build階段運(yùn)行。
          {code:xml}
            <reporting>
              <plugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-jxr-plugin</artifactId>
                  <version>2.1</version>
                </plugin>
              </plugins>
            </reporting>
          {code}
          加入 Cobertura 支持,它是一個代碼覆蓋率工具,可以用來評估具有相應(yīng)測試的源代碼的比率。詳細(xì)幫助在[這里|http://mojo.codehaus.org/cobertura-maven-plugin/index.html]。另外一個功能相似的軟件是[EMMA|http://emma.sourceforge.net/samples.html],詳細(xì)的幫助在[這里|http://mojo.codehaus.org/emma-maven-plugin/usage.html]。兩個產(chǎn)品的比較文章在[這里|http://www.topcoder.com/tc?module=Static&d1=features&d2=030107],個人傾向于都要用,因?yàn)榻o出的指標(biāo)不一樣,都有參考作用。
          {code:xml|title=Cobertura }
                <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>cobertura-maven-plugin</artifactId>
                  <version>2.4</version>
                  <configuration>
                    <check>
                      <branchRate>85</branchRate>
                      <lineRate>85</lineRate>
                      <haltOnFailure>true</haltOnFailure>
                      <totalBranchRate>85</totalBranchRate>
                      <totalLineRate>85</totalLineRate>
                      <packageLineRate>85</packageLineRate>
                      <packageBranchRate>85</packageBranchRate>
                      <regexes>
                        <regex>
                          <pattern>com.example.reallyimportant.*</pattern>
                          <branchRate>90</branchRate>
                          <lineRate>80</lineRate>
                        </regex>
                        <regex>
                          <pattern>com.example.boringcode.*</pattern>
                          <branchRate>40</branchRate>
                          <lineRate>30</lineRate>
                        </regex>
                      </regexes>
                    </check>
                  </configuration>
                  <executions>
                    <execution>
                      <goals>
                        <goal>clean</goal>
                        <goal>check</goal>
                      </goals>
                    </execution>
                  </executions>
                </plugin>
          {code}
          {code:xml|title=EMMA}
            <reporting>
              ...
              <plugins>
                ...
                <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>emma-maven-plugin</artifactId>
                  <version>1.0-alpha-3-SNAPSHOT</version>
                </plugin>
                ...
              </plugins>
              ...
            </reporting>
          {code}
          添加 javaNCSS 插件,它是一個java代碼的度量工具,詳細(xì)參考在[這里|http://mojo.codehaus.org/javancss-maven-plugin/]。
          {code:xml}
            <reporting>
              <plugins>
                <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>javancss-maven-plugin</artifactId>
                  <version>2.0-beta-2</version>
                </plugin>
              </plugins>
            </reporting>
          {code}
          h4. profile相關(guān)
          . 問:profile能夠設(shè)置為某個變量不存在的條件下激活?
          答:使用!前綴,請看示例:
          {code:xml}
          <activation>
                  <property>
                    <name>!environment.type</name>
                  </property>
                </activation>
          {code}
          h4. 部署相關(guān)
          . 問:其他部署到服務(wù)器的方式和配置怎么配?
          答:本文摘自 [http://blog.csdn.net/zyxnetxz/archive/2009/05/18/4199348.aspx]{panel} *Distribution Management* 用于配置分發(fā)管理,配置相應(yīng)的產(chǎn)品發(fā)布信息,主要用于發(fā)布,在執(zhí)行mvn deploy后表示要發(fā)布的位置 *# 配置到文件系統(tǒng)
          {code:xml}
          <distributionManagement>
            <repository>
              <id>proficio-repository<id>
              <name>Proficio Repository<name>
              <url>file://${basedir}/target/deploy<url>
            <repository>
          <distributionManagement>
          {code}
          *# 使用ssh2配置
          {code:xml}
          <distributionManagement>
            <repository>
              <id>proficio-repository<id>
              <name>Proficio Repository<name>
              <url>scp://sshserver.yourcompany.com/deploy<url>
            <repository>
          <distributionManagement>
          {code}
          *# 使用sftp配置
          {code:xml}
          <distributionManagement>
            <repository>
              <id>proficio-repositoryi<d>
              <name>Proficio Repository<name>
              <url>sftp://ftpserver.yourcompany.com/deploy<url>
            <repository>
          <distributionManagement>
          {code}
          *# 使用外在的ssh配置編譯擴(kuò)展用于指定使用wagon外在ssh提供,用于提供你的文件到相應(yīng)的遠(yuǎn)程服務(wù)器。
          {code:xml}
          <distributionManagement>
            <repository>
              <id>proficio-repository<id>
              <name>Proficio Repository<name>
              <url>scpexe://sshserver.yourcompany.com/deploy<url>
            <repository>
          <distributionManagement>
          <build>
            <extensions>
              <extension>
                <groupId>org.apache.maven.wagon<groupId>
                <artifactId>wagon-ssh-external<artifactId>
                <version>1.0-alpha-6<version>
              <extension>
            <extensions>
          <build>
          {code}
          *# 使用ftp配置
          {code:xml}
          <distributionManagement>
            <repository>
              <id>proficio-repository<id>
              <name>Proficio Repository<name>
              <url>ftp://ftpserver.yourcompany.com/deploy<url>
            <repository>
          <distributionManagement>
          <build>
            <extensions>
              <extension>
                <groupId>org.apache.maven.wagongroupId>
                <artifactId>wagon-ftpartifactId>
                <version>1.0-alpha-6version>
              <extension>
            <extensions>
          <build>
          {code}
          {panel} h4. 插件配置
          . 問:我用maven輸出site,如何設(shè)置輸出為utf8編碼?
          答: 配置site插件的編碼設(shè)置
          {code:xml}
          ...
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-site-plugin</artifactId>
              <version>2.0-beta-6</version>
              <configuration>
                <outputEncoding>UTF-8</outputEncoding>
              </configuration>
            </plugin>
            ...
          {code}
          . 問:
          答:

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 新丰县| 太康县| 府谷县| 遂昌县| 石河子市| 黄骅市| 西林县| 洱源县| 南投县| 静乐县| 商丘市| 乐清市| 肥东县| 西乌珠穆沁旗| 天水市| 林西县| 颍上县| 临朐县| 鸡泽县| 庆阳市| 南澳县| 宁陵县| 东光县| 青铜峡市| 县级市| 象山县| 洛浦县| 天长市| 岑巩县| 香河县| 上犹县| 崇文区| 平潭县| 双桥区| 久治县| 逊克县| 于都县| 桓台县| 衡山县| 武宣县| 浦县|