Posted on 2008-12-12 12:48
李春生 閱讀(313)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
maven2
來(lái)自:http://www.jieesoft.com/modules.php?name=News&file=article&sid=155
Maven和ANT是Apache 推出的大名鼎鼎的Build和工程管理工具,國(guó)內(nèi)有人將他做了漢化工作,并推出了maven手冊(cè)漢化工作,其中手冊(cè)已經(jīng)完工,對(duì)廣大程序員可是一大幫助。進(jìn)入該網(wǎng)站
用戶(hù)手冊(cè)
- 關(guān)于手冊(cè)
- 簡(jiǎn)介
- 項(xiàng)目對(duì)象模型
- POM 處理機(jī)制
- POM 插值機(jī)制
- POM 繼承機(jī)制
- 使用插件
- maven.xml文件
- 簡(jiǎn)單的maven.xml例子
- project節(jié)點(diǎn)
- 目標(biāo)
- Jelly編程
- Maven 配置
- 屬性的處理機(jī)制
- 插件的屬性
- 行為屬性
- 使用代理
- 使用多個(gè)遠(yuǎn)程Repositories
- 項(xiàng)目設(shè)置
- 開(kāi)始一個(gè)新項(xiàng)目
- 構(gòu)建
- 構(gòu)建生命周期
- 在CVS中存放jar文件
- 重載已聲明的依賴(lài)包
- 使用SNAPSHOT依賴(lài)
- 多項(xiàng)目構(gòu)建和Reactor
- 離線(xiàn)構(gòu)建
- 命令行選項(xiàng)介紹
- 測(cè)試
- 測(cè)試資源
- 運(yùn)行一個(gè)單獨(dú)的測(cè)試
- 打包
- JAR 資源
- 部署
- 固化SNAPSHOT依賴(lài)
- 拷貝依賴(lài)JAR包
- 命名約定
- 規(guī)則和指南
- 項(xiàng)目
- 依賴(lài)
- 發(fā)布多個(gè)包的項(xiàng)目
- 遠(yuǎn)程Repository布局
- 本地Repository布局
- 生成項(xiàng)目站點(diǎn)
- 顏色
- 風(fēng)格
- 報(bào)告
關(guān)于手冊(cè)
這篇Maven使用手冊(cè)意在通過(guò)提供完整的描述和例子,幫助開(kāi)發(fā)人員了解Maven。 如果你有任何建議或者意見(jiàn)請(qǐng)?jiān)?Maven使用者郵件列表上發(fā)表.
感謝選擇Maven!
簡(jiǎn)介
Maven最早始于Jarkarta Turbine項(xiàng)目,目的是為了簡(jiǎn)化構(gòu)建過(guò)程。這個(gè)項(xiàng)目下面有 幾個(gè)子項(xiàng)目,每個(gè)子項(xiàng)目都有自己的Ant文件,但是區(qū)別很小,而且生成的JAR 文件都要check in到CVS中。我們希望有一種標(biāo)準(zhǔn)的方式來(lái)構(gòu)建這些項(xiàng)目,一種可以 清晰描述項(xiàng)目的方式,一種易于發(fā)布項(xiàng)目信息的方式,一種在多個(gè)項(xiàng)目之間共享JARs 的方式。
這個(gè)結(jié)果就是產(chǎn)生了一個(gè)可以用于構(gòu)建、管理任何基于java的項(xiàng)目。我們希望我們創(chuàng)造 的這個(gè)工具可以讓Java開(kāi)發(fā)者的日常工作更加輕松,并有助于理解基于java的項(xiàng)目.
項(xiàng)目對(duì)象模型
Maven是基于項(xiàng)目對(duì)象模型(POM)的概念而創(chuàng)建的。在這個(gè)模型中,所有由Maven產(chǎn)生的 artifact都是清晰定義的項(xiàng)目模型的結(jié)果。構(gòu)建,文檔,源碼度量,源碼交叉引用和其他 任何由Maven plug-in提供的東西都是由POM來(lái)控制的。
POM 處理機(jī)制
這篇文檔簡(jiǎn)單的描述了Maven執(zhí)行過(guò)程中是如何處理POM的。這里有一些簡(jiǎn)單的POM例子 來(lái)展示繼承機(jī)制和插值機(jī)制。
POM 插值機(jī)制
POM(通常以project.xml的名字出現(xiàn))現(xiàn)在已經(jīng)被當(dāng)作Jelly腳本來(lái)處理了。大部分時(shí) 候,用戶(hù)無(wú)須關(guān)心project.xml文件是不是真正的Jelly腳本,但是,如果需要的話(huà), 也可以使用內(nèi)置值。我也不愿看到邏輯控制語(yǔ)句出現(xiàn)在project.xml中,但是由于 project.xml實(shí)際上已經(jīng)是一個(gè)隱含的jelly的腳本,所以它會(huì)有足夠的靈活性:-)。 下面是一個(gè)簡(jiǎn)單的例子。
3
maven
maven
Maven
1.0-b5-dev
Apache Software Foundation
http://jakarta.apache.org/
/images/jakarta-logo-blue.gif
2001
org.apache.${pom.artifactId}
/images/${pom.artifactId}.jpg
Maven is a project that was created in ${pom.inceptionYear}.
${pom.name} is a Java Project Management Tool
POM 繼承機(jī)制
現(xiàn)在有一種簡(jiǎn)單方式可以用于在POM中進(jìn)行繼承,下面是一個(gè)簡(jiǎn)單的例子:
project.xml
super-extendo
super-extendo
Super Extendo
**/*Test*.java
**/TestAll.java
**/*Abstract*.java
目前對(duì)POM父對(duì)象的解析還相對(duì)較弱,現(xiàn)在對(duì)一層以上的繼承還沒(méi)有做過(guò)任何測(cè)試。盡管如此, 單層繼承加上插值機(jī)制已經(jīng)能夠給帶來(lái)很多好處。這些機(jī)制的意圖在于簡(jiǎn)化構(gòu)建的共用問(wèn)題。
你可以這樣定義主模板:
3
commons
commons-master
Commons Master Maven POM
Apache Software Foundation
http://www.apache.org
jakarta
http://jakarta.apache.org/commons/${pom.artifactId}.html
http://nagoya.apache.org/
jakarta.apache.org
/www/jakarta.apache.org/commons/${pom.artifactId}/
/www/jakarta.apache.org/builds/jakarta-commons/${pom.artifactId}/
scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-commons/${pom.artifactId}
http://cvs.apache.org/viewcvs/jakarta-commons/${pom.artifactId}/
...
子POM對(duì)象可以這樣定義:
commons-betwixt
commons-betwixt
Betwixt
...
這樣你就可以在父POM對(duì)象中,將子POM對(duì)象的${pom.artifactId}替換進(jìn)去。有許多項(xiàng)目的 構(gòu)建都以相似的方式進(jìn)行構(gòu)建,這樣一來(lái),對(duì)于項(xiàng)目的公共部分,你就可以使用一個(gè)主模板, 然后在子POM對(duì)象project.xml中定義有區(qū)別的部分,而這部分內(nèi)容通常很少。
這種機(jī)制確實(shí)還可以簡(jiǎn)化那些需要產(chǎn)生多個(gè)JAR包的項(xiàng)目。由于project.xml和標(biāo)準(zhǔn)Ant構(gòu)建 不會(huì)相互干擾,我計(jì)劃在公共部分測(cè)試?yán)^承機(jī)制。
如果你對(duì)使用這種機(jī)制,DVSL報(bào)告會(huì)變成什么樣感到疑惑,我要說(shuō),你很上路。我已經(jīng)修改 了DVSL報(bào)告來(lái)適應(yīng)POM本身,這就是說(shuō)DVSL轉(zhuǎn)換是基于java對(duì)象的。在使用繼承和插值機(jī)制的 時(shí)候,為了正確的產(chǎn)生DVSL報(bào)告,這是很有必要的。象上面列出的子模板是無(wú)法工作的,我們 需要全面的解析POM。我能說(shuō)的是,它可以工作了!我所使用的處理方式可能不是最有效率的 方式,但仍有提升的空間。因?yàn)镻OM只會(huì)被處理一次(不管怎么說(shuō),這就它的原理,我可能漏了 某些東西),然后到處使用,至少這就是我以前試圖做的事情,所以我們很有可能會(huì)取得平衡。
如果你不使用繼承和插值,那么一切照常工作。maven站點(diǎn)本身一切ok,有幾個(gè)剛部署的站點(diǎn) 已經(jīng)使用了我昨晚提交的東西了。
使用插件
Maven是一個(gè)很緊湊的內(nèi)核,圍繞著它的是許許多多的插件。Maven所有的功能都是由插件來(lái)提供 的。
maven.xml文件
項(xiàng)目中的maven.xml文件是Maven在執(zhí)行過(guò)程中要使用的“定制”文件。
在這個(gè)文件中,你可以加入Maven構(gòu)建中需要的額外處理。或者在Maven的“目標(biāo)”前后附加自己 的代碼,如jar 或 test。
Maven使用Jelly 腳本語(yǔ)言, 任何合法的jelly標(biāo)簽都可以在maven.xml中使用。
Maven所采用的goal功能是由werkz標(biāo)簽庫(kù)提供。更多的信息請(qǐng)看 wiki頁(yè)面.
簡(jiǎn)單的maven.xml例子
注意由于Maven并未缺省的定義'compile'目標(biāo),下面這個(gè)例子沒(méi)法運(yùn)行。
這是一個(gè)簡(jiǎn)單的maven.xml例子
${goals}
Now attaining goal number ${goalNumber}, which is ${goal}
你可能會(huì)注意到這里一些有意思的東西,下面我們將逐一解釋。
project節(jié)點(diǎn)
project節(jié)點(diǎn), , 是任何 maven.xml 文件的根節(jié)點(diǎn)。
項(xiàng)目節(jié)點(diǎn)有一個(gè)缺省的屬性:default="nightly-build",如果用戶(hù)只是簡(jiǎn)單鍵入 沒(méi)有參數(shù)的maven命令,Maven就會(huì)用nightly-build 目標(biāo)作為缺省目標(biāo)。
接下來(lái)是幾個(gè)名字空間的聲明,如:
- xmlns:j="jelly:core"
所有以j:作為前綴的節(jié)點(diǎn),Jelly都會(huì)把它視為在core標(biāo)識(shí)下 預(yù)定義的標(biāo)簽庫(kù)。
- xmlns:u="jelly:util"
所有以u(píng):作為前綴的節(jié)點(diǎn),Jelly都會(huì)把它視為在標(biāo)識(shí)下 預(yù)定義的標(biāo)簽庫(kù)。
所有在maven.xml文件使用的Jelly標(biāo)簽庫(kù),都必須在project節(jié)點(diǎn)中定義,并且 分配一個(gè)名稱(chēng)空間前綴。
Maven已經(jīng)預(yù)先包含了jeez標(biāo)簽庫(kù)作為空前綴。這個(gè)標(biāo)簽庫(kù)在一個(gè)名稱(chēng)空間內(nèi)包含了 ant 和 werkz 標(biāo)簽庫(kù)。這樣,任何werkz或ant標(biāo)簽都無(wú)須名稱(chēng)空間 即可使用,同時(shí)也簡(jiǎn)化了ant的遷移過(guò)程。
目標(biāo)
goal是一個(gè) werkz 標(biāo)簽,類(lèi)似于Ant的target;它是包含了一系列可執(zhí)行標(biāo)簽的容器。
由于jeez 標(biāo)簽庫(kù)已經(jīng)由maven預(yù)先注冊(cè)了,一個(gè)目標(biāo)(goal)可以包含任何合法的 Ant 標(biāo)簽。
為了執(zhí)行在maven.xml中定義的目標(biāo),你只需要在命令行中為Maven指定目標(biāo)名即可。要執(zhí)行例子中定 義的nightly-build你只需執(zhí)行命令:
maven nightly-build
Maven插件定義的目標(biāo)需要在目標(biāo)前加上插件名,這樣一來(lái),就不會(huì)和你自己的goal沖突,如 jar:jar就是 jar 插件定義的目標(biāo),用于創(chuàng)建項(xiàng)目的jar包。
Jelly編程
在每個(gè)目標(biāo)里,由Jelly標(biāo)簽提供功能,讓我們來(lái)看看例子里的這些代碼。
set
這行就是一個(gè)jelly的core標(biāo)簽set,它使用了project節(jié)點(diǎn)中定義的前綴 j:
set標(biāo)簽設(shè)置了一個(gè)由var屬性定義的Jelly變量,值由 value 指定。和Ant的proerties不一樣,Jelly變量在被賦值后仍可以改變。
mkdir
等同于Ant任務(wù) mkdir, 用于創(chuàng)建目錄,目錄名由變量 ${maven.build.dir}指定。
tokenize
${goals}
這行執(zhí)行的是Jelly tokenize 標(biāo)簽。這是Jelly util 標(biāo)簽庫(kù)中標(biāo)簽, 這個(gè)標(biāo)簽庫(kù)已經(jīng)在項(xiàng)目節(jié)點(diǎn)中預(yù)先定義:u:
tokenize標(biāo)簽在將節(jié)點(diǎn)中的內(nèi)容分離成一個(gè)list,用于后續(xù)的處理。
- var 屬性就是將被于新list的變量。
- delim 屬性是用于分割字符串中的分隔符。
- 在這個(gè)例子中,tokenize 標(biāo)簽中節(jié)點(diǎn)值是一個(gè)變量:goals, 在前幾行中,這是一個(gè)由逗號(hào)分隔、compile 與 test 的字符串。
forEach
Now attaining goal number ${goalNumber}, which is ${goal}
forEach標(biāo)簽提供簡(jiǎn)單循環(huán)功能,節(jié)點(diǎn)值就是循環(huán)體。
- items 屬性是一個(gè)表達(dá)式,是在循環(huán)過(guò)程中需要遍歷的值集合。
- 集合中的值被逐個(gè)取出,存放在var 屬性指定的變量中。你可以在 forEach 循環(huán)體訪(fǎng)問(wèn)這個(gè)變量。
- indexVar 屬性指定了一個(gè)計(jì)數(shù)器(起始基數(shù)為0)變量,用于在處理 過(guò)程中計(jì)數(shù)。
forEach 標(biāo)簽的節(jié)點(diǎn)值輸出了一些在處理過(guò)程中的關(guān)于目標(biāo)的文本,并使用 attainGoal werkz 標(biāo)簽來(lái)獲得(執(zhí)行?)這些目標(biāo)。
Maven 配置
屬性的處理機(jī)制
Maven按下面的順序依次讀入properties文件:
- ${project.home}/project.properties
- ${project.home}/build.properties
- ${user.home}/build.properties
讀入的屬性遵循“最后的定義有效”原則。也就是說(shuō),Maven依次讀入properties文件,以新的定義 覆蓋舊的定義。${user.home}/build.properties是Maven最后處理的文件。我們把 這些文件稱(chēng)為Maven處理的標(biāo)準(zhǔn)屬性文件集。
另外,上述properties文件處理完畢后,Maven才會(huì)開(kāi)始處理系統(tǒng)屬性。所以,如果在命令行中使用 象-Dproperty=value這樣的形式來(lái)指定的屬性,它會(huì)覆蓋先前定義的同名屬性。
插件的屬性
上述屬性文件處理完后,Maven才會(huì)開(kāi)始調(diào)用插件,但是 PluginManager 會(huì)禁止插件 覆蓋已經(jīng)設(shè)置的屬性值。這和Maven一般的屬性處理方式是相反的,這是因?yàn)椴寮荒茉贛aven內(nèi)部的 其他部分初始化完畢后才能處理,但是我們又希望以這樣順序去處理屬性:
- 處理Plug-in 缺省屬性
- 處理${project.home}/project.properties
- 處理${project.home}/build.properties
- 處理${user.home}/build.properties
這樣一來(lái),即使插件處于屬性處理鏈的后端,也能覆蓋插件的任何缺省屬性。例如,Checkstyle插件 就定義了如下缺省屬性:
maven.checkstyle.format = sun
你可能已經(jīng)猜出來(lái)了,Checksytle插件把Sun的編碼規(guī)范作為缺省的格式。但是我們?nèi)匀豢梢栽跇?biāo)準(zhǔn)屬性 文件集的任何一個(gè)文件中覆蓋這個(gè)屬性。所以如果在${project.home}/project.properties 文件定義了如下屬性值:
maven.checkstyle.format = turbine
Checkstyle就會(huì)使用Turbine的編碼規(guī)范。
行為屬性
下面的這些屬性可以改變Maven的“行為方式”。
屬性
描述
缺省值
maven.build.dest
目錄名,存放編譯生成的類(lèi)
${maven.build.dir}/classes
maven.build.dir
存放構(gòu)建結(jié)果的目錄,如類(lèi)文件,文檔,單元測(cè)試報(bào)告等等。
注意: 在${user.home}/build.properties文件中改變maven.build.dir 的缺省值或許會(huì)得到一個(gè) 較為個(gè)性化的目錄布局。但是,這會(huì)干擾Maven由從源碼開(kāi)始的編譯工作,因?yàn)樗僭O(shè)jar包 會(huì)被創(chuàng)建到${basedir}/target/目錄中。
${basedir}/target
maven.build.src
源碼目錄
${maven.build.dir}/src
maven.conf.dir
配置文件目錄
${basedir}/conf
maven.docs.dest
html格式報(bào)告的輸出目錄
${maven.build.dir}/docs
maven.docs.omitXmlDeclaration
產(chǎn)生的文檔所應(yīng)包含的xml聲明頭,如:
false
maven.docs.outputencoding
生成文檔的缺省編碼
ISO-8859-1
maven.docs.src
用戶(hù)提供的文檔目錄
${basedir}/xdocs
maven.gen.docs
xdocs文檔轉(zhuǎn)換成html后的輸出目錄
${maven.build.dir}/generated-xdocs
maven.home.local
maven用于寫(xiě)入用戶(hù)信息的本機(jī)目錄,如解開(kāi)插件包、緩沖數(shù)據(jù)。
${user.home}/.maven
maven.mode.online
是否連接internet
true
maven.plugin.dir
插件的存放目錄
${maven.home}/plugins
maven.plugin.unpacked.dir
用于展開(kāi)安裝插件的目錄
${maven.home.local}/plugins
maven.repo.central
在進(jìn)行dist:deploy處理的時(shí)候,發(fā)行包所要部署的目標(biāo)機(jī)器
login.ibiblio.org
maven.repo.central.directory
在進(jìn)行dist:deploy處理的時(shí)候,發(fā)行包所要部署的目標(biāo)目錄。
/public/html/maven
maven.repo.local
本機(jī)repository,用于存儲(chǔ)下載的jar包。
${maven.home.local}/repository
maven.repo.remote
遠(yuǎn)程repository,如果本機(jī)repository沒(méi)有的jar包,maven會(huì)從這里下載。
http://www.ibiblio.org/maven
maven.repo.remote.enabled
是否使用遠(yuǎn)程repository。
true
maven.scp.executable
用于安全拷貝的可執(zhí)行程序
scp
maven.src.dir
基礎(chǔ)源代碼目錄
${basedir}/src
maven.ssh.executable
遠(yuǎn)程命令可執(zhí)行程序
scp
使用代理
如果你只能通過(guò)代理訪(fǎng)問(wèn),不要緊,Maven為你提供了下列屬性:
代理屬性
描述
maven.proxy.host
代理的IP地址
maven.proxy.port
代理端口
maven.proxy.username
如果代理需要認(rèn)證的話(huà),在這里填寫(xiě)用戶(hù)名。 User name if your proxy requires authentication.
maven.proxy.password
如果代理需要認(rèn)證的話(huà),在這里填寫(xiě)密碼。
如果你實(shí)在需要代理,最好在${user.home}/build.properties文件中指定。
## ----------------------------------------------------------
## ${user.home}/build.properties
## ----------------------------------------------------------
.
.
maven.proxy.host = my.proxyserver.com
maven.proxy.port = 8080
maven.proxy.username = username
maven.proxy.password = password
.
.
使用多個(gè)遠(yuǎn)程Repositories
你可以在任何Maven可以處理的屬性文件中指定使用多個(gè)遠(yuǎn)程Repositories,如:
maven.repo.remote = http://www.ibiblio.org/maven/,http://www.mycompany.com/maven/
項(xiàng)目設(shè)置
開(kāi)始一個(gè)新項(xiàng)目
如果你是第一次使用Maven,或者開(kāi)始一個(gè)新的項(xiàng)目,你可以使用GenApp來(lái)自動(dòng)創(chuàng)建Maven項(xiàng)目樹(shù)。
maven -Dpackage=com.mycompany.app genapp
執(zhí)行該命令后,屏幕顯示如下:
__ __
| / |__ Jakarta _ ___
| |/| / _ V / -_) ' ~ intelligent projects ~
|_| |___,_|_/___|_||_| v. 1.0-beta-9
[mkdir] Created dir: /genapp/src/java/com/mycompany/app
[copy] Copying 1 file to /genapp/src/java/com/mycompany/app
[mkdir] Created dir: /genapp/src/test/com/mycompany/app
[copy] Copying 3 files to /genapp/src/test/com/mycompany/app
[copy] Copying 2 files to /genapp
[copy] Copying 1 file to /genapp/src/conf
BUILD SUCCESSFUL
Total time: 3 seconds
執(zhí)行完畢,即生成下面的完整項(xiàng)目目錄樹(shù):
.
|-- project.properties
|-- project.xml
`-- src
|-- conf
| `-- app.properties
|-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- com
`-- mycompany
`-- app
|-- AbstractTestCase.java
|-- AppTest.java
`-- NaughtyTest.java
構(gòu)建
Maven采用了集中管理庫(kù)的理念。所有用于構(gòu)建的jar包都是從集中管理的中心庫(kù)上取出。目前, 我們的中心庫(kù)放在這兒 Ibiblio. 在一個(gè)典型的Maven項(xiàng)目中,構(gòu)建所需的 jar包會(huì)從中心庫(kù)下載。Maven只會(huì)取回依賴(lài)鏈條上缺失的包。如果你使用Maven來(lái)構(gòu)建幾個(gè)項(xiàng)目, 這些項(xiàng)目可能會(huì)共享一些依賴(lài)包:Maven可以在任意個(gè)項(xiàng)目中共享同一個(gè)包,而無(wú)須在同一系統(tǒng) 中保持一個(gè)jar包的多個(gè)拷貝。
構(gòu)建生命周期
在CVS中存放jar文件
我們不推薦你在CVS中存放jar包。Maven提倡在本機(jī)repository中存放用于構(gòu)建共享的jar包或 和其他項(xiàng)目包。許多項(xiàng)目都依賴(lài)于諸如XML解析器、標(biāo)準(zhǔn)例程,這在Ant構(gòu)建中,經(jīng)常會(huì)被復(fù)制 多份。在Maven中,這些標(biāo)準(zhǔn)例程就存放在本地repository中,供任何項(xiàng)目構(gòu)建使用。
重載已聲明的依賴(lài)包
你可能會(huì)發(fā)現(xiàn),在某些情況下允許重載POM中已經(jīng)聲明的依賴(lài)包會(huì)很方便,甚至很有必要。 你可能會(huì)希望使用文件系統(tǒng)中的某個(gè)JAR包,或者你希望簡(jiǎn)單重新指定某個(gè)包的版本。對(duì)于 這樣的情況,Maven提供了一種簡(jiǎn)單的方式,允許你選擇構(gòu)建所需的jar包。我們嚴(yán)重建議;) 你設(shè)置本機(jī)repository,但是在簡(jiǎn)單至上,或在由ant構(gòu)建遷移的情況下,JAR包重載特性 會(huì)顯得非常方便。
為了使用JAR包重載特性,你必須將maven.jar.override 屬性設(shè)置為 on。 只要設(shè)置了這個(gè)屬性,就可以在任何maven處理的屬性文件中重載JAR包。
關(guān)于JAR重載的指令有兩種。第一種允許你指定某個(gè)特定的包的路徑,作為JAR包;的二種 允許你指定某個(gè)特定的JAR包(這個(gè)jar包必須已經(jīng)存在于本機(jī)repository)。下面是這兩 種方式:
maven.jar.artifactId = [path]
maven.jar.artifactId = [version]
下面是一個(gè)使用JAR重載指令的屬性文件例子:
# ------------------------------------------------------------------------
# M A V E N J A R O V E R R I D E
# ------------------------------------------------------------------------
maven.jar.override = on
# ------------------------------------------------------------------------
# Jars set explicity by path.
# ------------------------------------------------------------------------
maven.jar.a = ${basedir}/lib/a.jar
maven.jar.b = ${basedir}/lib/b.jar
# ------------------------------------------------------------------------
# Jars set explicity by version.
# ------------------------------------------------------------------------
maven.jar.classworlds = 1.0-beta-1
使用SNAPSHOT依賴(lài)
在Maven中,SNAPSHOP是某個(gè)特定項(xiàng)目的最新構(gòu)建的jar包。如果你的項(xiàng)目依賴(lài)于另一個(gè)頻繁變更 的項(xiàng)目,你可以在你的POM中聲明SNAPSHOP依賴(lài),以保持與那個(gè)項(xiàng)目的同步。例如,在你的POM中 這樣寫(xiě),你可以與Jelly保持 同步更新。
...
commons-jelly
commons-jelly
SNAPSHOT
...
上述語(yǔ)句的含義是:總是使用Maven repository中最新的Jelly構(gòu)建包。SNAPSHOT依賴(lài) 總會(huì)導(dǎo)致依賴(lài)失敗。在這種情況下,Maven就會(huì)去Maven repository取得一個(gè)SNAPSHOT 依賴(lài)包的拷貝。如果你正在離線(xiàn)工作,Maven就會(huì)發(fā)出警告:“SNAPSHO依賴(lài)包可能已經(jīng) 過(guò)期”。
多項(xiàng)目構(gòu)建和Reactor
在Maven中,Reactor是一個(gè)用于控制多項(xiàng)目構(gòu)建的工具。Reactor用Werkz包,并根據(jù)每個(gè)項(xiàng)目 各自定義的依賴(lài)關(guān)系來(lái)安排構(gòu)建順序。Reactor的意圖在于:鼓勵(lì)創(chuàng)建/重構(gòu)具有更小、更松散、 更有一致性單元的項(xiàng)目。r源于面向組件編程,在向組件編程中,整個(gè)系統(tǒng)由許多松散的個(gè)體 構(gòu)成,這些個(gè)體需要聚合起來(lái)作為一個(gè)整體進(jìn)行部署。
Reactor可以為某個(gè)項(xiàng)目集執(zhí)行一個(gè)任意編排的目標(biāo)列表。所以,如果使用Reactor的話(huà),它 可以用來(lái)做項(xiàng)目站點(diǎn)生成,任意jar包生成這樣的事情。
目前 db.apache.org 站點(diǎn)就是收集了其子項(xiàng)目的 豐富信息、并與一系列的Velocity 模板合成的。這一過(guò)程是由 Jelly Velocity 標(biāo)簽庫(kù)來(lái)完成的。 這里是其中的機(jī)制,有興趣可以看看。
Plexus(一個(gè)基于Avalon的容器)組件的manifest是遍歷所有Plexus組件、并聚合而成的。這里 使用的還是Velocity模板和Jelly Volocity標(biāo)簽庫(kù)。 這里是其中的機(jī)制,有興趣可以看看。
這里是一個(gè)使用Reactor標(biāo)簽,遍歷一系列組件,最后產(chǎn)生項(xiàng)目站點(diǎn)的例子:
... Do whatever you want with the harvested information ...
如果你需要聚合N個(gè)項(xiàng)目的文檔,形成一個(gè)統(tǒng)一的視圖,你可以參考 db.apache.org站點(diǎn),它從所有的子項(xiàng)目中收集 信息,最終形成一個(gè)有導(dǎo)航條,郵件列表,開(kāi)發(fā)者列表和源碼repository統(tǒng)一的站點(diǎn)。這解決 了在收集子項(xiàng)目信息過(guò)程中的冗余、易于產(chǎn)生錯(cuò)誤的問(wèn)題。db.apache.org的子項(xiàng)目只需關(guān)注 自身的信息,卻可以自動(dòng)的集成到高層的項(xiàng)目站點(diǎn)中。
離線(xiàn)構(gòu)建
如果你需要離線(xiàn)構(gòu)建,你得在命令行中使用離線(xiàn)選項(xiàng):
maven -o jar:jar
這等同于:
maven -Dmaven.mode.online=false jar:jar
或者你可以在屬性文件中設(shè)置 maven.mode.online 屬性為false。
在聯(lián)機(jī)模式下,maven總是下載 SNAPSHOT 依賴(lài)包, 請(qǐng)參考 使用SNAPSHOT依賴(lài)。如果本機(jī)repository 上的當(dāng)前版本比服務(wù)器上的還要新,你也許不想maven覆蓋你的當(dāng)前版本。如果不想下載,你可以 設(shè)置屬性:
maven.repo.remote.enabled=false
在maven beta 9版本中,這個(gè)屬性并沒(méi)有起作用(新版本已經(jīng)解決了這個(gè)問(wèn)題)。可以這樣來(lái)清空 maven.repo.remote 屬性:
maven.repo.remote.enabled=
在命令行或?qū)傩晕募性O(shè)置都一樣。
在下面的情形中,你需要同時(shí)設(shè)置maven.repo.remote.enabled=false maven.mode.online=true:希望javadoc插件的"-link"選項(xiàng)起作用,而又不希望 下載任何(包括snapshot)包。
命令行選項(xiàng)介紹
如果你用命令行來(lái)構(gòu)建,這里提供了一個(gè)關(guān)于命令行選項(xiàng)的快速參考。
Options:
-D,--define arg 定義一個(gè)系統(tǒng)屬性
-E,--emacs 輸出簡(jiǎn)潔的日志信息
-X,--debug 輸出debug信息
-b,--nobanner 禁止 logo banner
-d,--dir arg 設(shè)置指定的工作目錄
-e,--exception 輸出異常堆棧信息
-f,--find arg 通過(guò)搜尋項(xiàng)目文件來(lái)確定執(zhí)行的項(xiàng)目文件及其工作目錄
-g,--goals 顯示可用的目標(biāo)
-h,--help 顯示幫助信息
-i,--info 顯示系統(tǒng)信息
-o,--offline 離線(xiàn)構(gòu)建
-p,--pom arg 指定項(xiàng)目文件
-v,--version 顯示版本號(hào)
測(cè)試
測(cè)試資源
通常情況下,你需要在測(cè)試類(lèi)路徑上為測(cè)試指定某些資源。你可以在POM中使用
下面的例子說(shuō)明了如何遞歸的包含在${basedir}/src/test目錄中所有以.xml和.properties為擴(kuò)展名 的文件:
...
...
...
${basedir}/src/test
**/*.xml
**/*.properties
下面的例子說(shuō)明了如何遞歸的包含在${basedir}/src/test目錄中所有以.xml和.properties為擴(kuò)展名 的文件,但naughty.properties文件除外。請(qǐng)注意增加的project/build/unitTest/resources/excludes 節(jié)點(diǎn):
...
...
...
${basedir}/src/test
**/*.xml
**/*.properties
naughty.properties
運(yùn)行一個(gè)單獨(dú)的測(cè)試
下面的命令運(yùn)行了一個(gè)單獨(dú)的測(cè)試:
maven -Dtestcase=org.foo.bar.MyTest test:single-test
打包
JAR 資源
...
${basedir}/src/conf
*.xml
*.properties
${basedir}/src/messages
org/apache/maven/messages
messages*.properties
部署
固化SNAPSHOT依賴(lài)
在開(kāi)發(fā)時(shí)使用SNAPSHOT依賴(lài)包非常方便,但是在部署的時(shí)候,你需要把所有的SNAPSHOT依賴(lài)包 固定下來(lái),以便發(fā)布一個(gè)包含固定jar的版本。如果你發(fā)布了一個(gè)含SNAPSHOT依賴(lài)包的項(xiàng)目,而 這些SNAPSHOT在項(xiàng)目發(fā)布后發(fā)生了變更,你可能很快就會(huì)發(fā)現(xiàn)這個(gè)版本沒(méi)法兒工作。
當(dāng)SNAPSHOT以時(shí)間戳為版本號(hào)部署到Maven上時(shí),Maven可以識(shí)別foo-SNAPSHOT.jar實(shí)際上相當(dāng) 于foo-20030101.010101.jar。當(dāng)部署的時(shí)刻來(lái)臨,你可以用下面的命令,讓Maven把SNAPSHOT 版本號(hào)變?yōu)闀r(shí)間戳版本號(hào)。
maven convert-snapshots
Maven會(huì)提供交互的方式讓你選擇哪個(gè)SNAPSHOPT依賴(lài)包應(yīng)該固化下來(lái)。這一過(guò)程結(jié)束后,Maven 就會(huì)把剛才你的選擇寫(xiě)會(huì)你的POM。
如果你希望Maven簡(jiǎn)單的、盡可能最好的固化SNAPSHOT依賴(lài)包,你可以用下面的命令:
maven convert-snapshots-auto
拷貝依賴(lài)JAR包
在maven.xml這樣寫(xiě)下面的語(yǔ)句是最簡(jiǎn)單的拷貝依賴(lài)包的方法。
...
...
用deploy:copy-deps標(biāo)簽?zāi)憔涂梢院?jiǎn)單的把項(xiàng)目所有的依賴(lài)包拷貝到任何 目錄,如果希望排除某個(gè)依賴(lài)包,需要給出一個(gè)依賴(lài)包的id列表,列表中依賴(lài)包就不會(huì)被拷貝。
...
...
命名約定
這部分將簡(jiǎn)要的描述項(xiàng)目對(duì)象模型(POM)中命名約定。本篇文檔希望可以統(tǒng)一各式各樣jar包命名 方法,這些jar包一般為java開(kāi)發(fā)者社區(qū)廣泛使用。
規(guī)則和指南
項(xiàng)目
一個(gè)項(xiàng)目必須由一個(gè)唯一的的標(biāo)識(shí),標(biāo)識(shí)由a-z小寫(xiě)字母和連線(xiàn)號(hào)構(gòu)成,其首字母必須以小寫(xiě)字母 開(kāi)頭。
bar
foo
...
所有項(xiàng)目間的引用都由組id和包id構(gòu)成。到現(xiàn)在為止,在POM與此相關(guān)的是下面將要(上面提到的?)談到的項(xiàng)目的 依賴(lài)聲明。
項(xiàng)目的名稱(chēng)應(yīng)該易于閱讀,可用于文檔。
bar
foo
The Grand Master Foo
...
項(xiàng)目應(yīng)該有一個(gè)組標(biāo)識(shí),組標(biāo)識(shí)是名稱(chēng)的基礎(chǔ)部分。
bar
foo
The Grand Master Foo
...
所有項(xiàng)目發(fā)布的包都應(yīng)基于項(xiàng)目唯一的標(biāo)識(shí),并且放在基于項(xiàng)目的組id的目錄中。對(duì)于上面的 項(xiàng)目來(lái)說(shuō),假定發(fā)布的包是jar類(lèi)型的包,我們就會(huì)有如下目錄結(jié)構(gòu):
repository
|
+-- bar
|-- distribution
`-- jar
|-- foo-1.0.jar
`-- foo-2.0.jar
依賴(lài)
一個(gè)理想的典型依賴(lài)聲明的例子可能會(huì)象這樣:
yourProject
yourArtifact
Your Groovey Machine
...
bar
foo
1.0
這樣一來(lái),依賴(lài)于id為foo1.0 版本的bar項(xiàng)目 屬于org.foo.bar組。這個(gè)依賴(lài)會(huì)被解析為本地repository中jar文件。上面 的情形假定發(fā)布的包是基于包id命名的。因此對(duì)于上述依賴(lài),Maven就會(huì)采用 foo-1.0.jar作為jar名。
就像用戶(hù)反映的那樣,這種理想的方式并不能適應(yīng)所有的項(xiàng)目。有幾種情形我們必須考慮調(diào)整 理想的依賴(lài)機(jī)制:
- 發(fā)布的jar包的并未使用項(xiàng)目作為基礎(chǔ)名,如xercesImpl就是所有發(fā)布的jar包的基礎(chǔ)名 它與gump id和maven中的id都不一樣。
- 發(fā)布的jar包沒(méi)有使用任何版本聲明,如許多commons組件并沒(méi)有把版本號(hào)作為包名的一部分。
- 有些項(xiàng)目即沒(méi)有使用項(xiàng)目id作為基礎(chǔ)名也沒(méi)有版本聲明。例如,最壞的情形是Java Activation Framework 的jar包,它沒(méi)有遵循其他Sun的命名規(guī)則,也沒(méi)有在jar包中聲明 版本號(hào),甚至在manifest中都沒(méi)有任何版本信息。
在多數(shù)情形下,任何例外的情況都可以用 (可選節(jié)點(diǎn))、或者是重命名來(lái)解決。 現(xiàn)在,許多Jarkata的產(chǎn)品在repository已經(jīng)被重命名,因?yàn)樵诓痪玫奈磥?lái),絕大多數(shù)的Jarkarta的 項(xiàng)目將用maven進(jìn)行構(gòu)建。但這不是公司政策,我們不需要解決所有情況的問(wèn)題。
發(fā)布多個(gè)包的項(xiàng)目
Maven的依賴(lài)機(jī)制完全支持任何形式的多項(xiàng)目包。 Maven's dependency mechanism completely supports multiple project artifacts of any given type.
下面的代碼包含了ant的主jar包和optional包加上hypothetical包。
ant
ant
1.4.1
ant
ant-optional
1.4.1
ant
poorly-named
1.4.1
所以A), B) 和 C)實(shí)際上是指向?qū)儆谕唤M的單個(gè)包的指針,這就是說(shuō),一個(gè)單獨(dú)的依賴(lài)就是對(duì)某個(gè)組中的某個(gè) 包的引用。目前artifact如果沒(méi)有特別說(shuō)明的話(huà),一般指的是jar包。但是依賴(lài)也可能是一個(gè)war文件或一個(gè) 發(fā)行包。我們?cè)噲D在提供多數(shù)情況下(構(gòu)建大多需要jar包)使用的缺省方式的同時(shí),也顧及靈活性。
遠(yuǎn)程Repository布局
這部分文檔將對(duì)Maven的遠(yuǎn)程repositories做一個(gè)概要的說(shuō)明。目前,主repository位于 Ibiblio,但是你也可以自己創(chuàng)建一 個(gè)遠(yuǎn)程repositories,其結(jié)果描述可以在這部分文檔中找到。
任何獨(dú)立的項(xiàng)目在repository都有自己的目錄。每個(gè)項(xiàng)目有一個(gè)唯一的項(xiàng)目id和同名目錄, 項(xiàng)目的發(fā)行包就放在這個(gè)目錄中。
項(xiàng)目的目錄中可以存放各種各樣的artifacts,目前最為廣泛使用的兩種類(lèi)型是jar包和發(fā)行包 下面是一個(gè)遠(yuǎn)程repository快照:
repository
|
|-- ant
| |-- distribution
| `-- jars
| |-- ant-1.4.1.jar
| `-- ant-optional-1.4.1.jar
+-- jsse
|-- distribution
`-- jars
|-- jsse.jar
|-- jcert.jar
`-- jnet.jar
本地Repository布局
應(yīng)該有一個(gè)接口集合的緊湊實(shí)現(xiàn)使本地repository目錄結(jié)構(gòu)更加隨意一些。現(xiàn)在我只使用 了一個(gè)類(lèi)來(lái)實(shí)現(xiàn),顯得有些臃腫。我還是認(rèn)為本地和遠(yuǎn)程repositories應(yīng)保持相同的結(jié)構(gòu) 但是為了使用更樂(lè)于使用,我開(kāi)始設(shè)計(jì)一些接口,用于滿(mǎn)足用戶(hù)自己安排自己本地Repository 布局,相似的遠(yuǎn)程Repositor也在設(shè)計(jì)中。盡管目前本地repository仍與遠(yuǎn)程repository 完全一致,我希望聽(tīng)到更多的用戶(hù)反饋,以促進(jìn)這些接口的開(kāi)發(fā),或者完全拋棄它。
生成項(xiàng)目站點(diǎn)
Maven可以為項(xiàng)目產(chǎn)生一個(gè)完成的web站點(diǎn)。這個(gè)web站點(diǎn)將包含各種各樣、由許多Maven插件 產(chǎn)生的報(bào)告,如javadocs,代碼度量,單元測(cè)試,changlog,及其它... 本節(jié)文檔接下來(lái)的 部分將闡述Maven支持的站點(diǎn)定制選項(xiàng)。
顏色
考慮到一致性,缺省情況下,所有Maven產(chǎn)生的站點(diǎn)都使用相似的外觀(guān)。這使用戶(hù)一眼就能 認(rèn)出由Maven產(chǎn)生的站點(diǎn),產(chǎn)生熟悉的感覺(jué),更加方便信息的獲取。當(dāng)然,Maven開(kāi)發(fā)組也 考慮到用戶(hù)可能會(huì)希望定制他們的站點(diǎn)。修改Maven產(chǎn)生的站點(diǎn),最簡(jiǎn)單的方法是指定你要 使用的顏色搭配。這只需要在project.properties簡(jiǎn)單的設(shè)置適當(dāng)?shù)膶傩?即可。下面是所有可用的屬性描述在 xdoc plugin。
風(fēng)格
如果你感覺(jué)顏色太過(guò)于簡(jiǎn)單,無(wú)法滿(mǎn)足你的要求,你可以用自己的stylesheet。為了重載 在${basedir}/xdocs/stylesheets/中的maven.css stylesheet,你可以通過(guò)設(shè)置maven.javadoc.stylesheet 屬性來(lái)指定你的 javadoc風(fēng)格。
報(bào)告
最后,如果你希望定制哪些報(bào)告需要自動(dòng)產(chǎn)生,你需要在你的項(xiàng)目描述中包含 reports 標(biāo)簽庫(kù)。 到目前為止,如果沒(méi)有reports標(biāo)簽指定,所有插件報(bào)告都會(huì)產(chǎn)生。這個(gè)標(biāo)簽 允許你選擇產(chǎn)生哪些報(bào)告而排斥另外一些報(bào)告,而且允許你安排順序。
目前的標(biāo)準(zhǔn) 報(bào)告集在xdoc中是硬編碼實(shí)現(xiàn)的,它們是:
maven-changelog-plugin
maven-changes-plugin
maven-checkstyle-plugin
maven-developer-activity-plugin
maven-file-activity-plugin
maven-javadoc-plugin
maven-jdepend-plugin
maven-junit-report-plugin
maven-jxr-plugin
maven-license-plugin
maven-linkcheck-plugin
maven-pmd-plugin
maven-tasklist-plugin
如果你希望產(chǎn)生缺省的報(bào)告,但是還想增加或刪除一兩個(gè),最好的方法是:給 xdoc:register-reports目標(biāo)寫(xiě)一個(gè)前置目標(biāo)(postGoal)。
排除所有Maven產(chǎn)生的內(nèi)容
某些情況下,用戶(hù)需要構(gòu)建只有文檔的站點(diǎn),或是構(gòu)建聚合許多子項(xiàng)目的站點(diǎn),但不希望 在站點(diǎn)上有個(gè)整體“項(xiàng)目文檔”導(dǎo)航條。設(shè)置 maven.xdoc.includeProjectDocumentation屬性值為no 即可解決這一問(wèn)題。缺省的,Maven會(huì)包含“項(xiàng)目文檔”導(dǎo)航條,下面掛的是許多Maven 生成的報(bào)告。 "