<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Maven使用手冊(cè)

    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è)

    1. 關(guān)于手冊(cè)
    2. 簡(jiǎn)介
    3. 項(xiàng)目對(duì)象模型
    4. POM 處理機(jī)制
      1. POM 插值機(jī)制
      2. POM 繼承機(jī)制

    5. 使用插件
    6. maven.xml文件

      1. 簡(jiǎn)單的maven.xml例子
      2. project節(jié)點(diǎn)
      3. 目標(biāo)
      4. Jelly編程

    7. Maven 配置

      1. 屬性的處理機(jī)制
      2. 插件的屬性
      3. 行為屬性
      4. 使用代理
      5. 使用多個(gè)遠(yuǎn)程Repositories

    8. 項(xiàng)目設(shè)置

      1. 開(kāi)始一個(gè)新項(xiàng)目

    9. 構(gòu)建

      1. 構(gòu)建生命周期
      2. 在CVS中存放jar文件
      3. 重載已聲明的依賴(lài)包
      4. 使用SNAPSHOT依賴(lài)
      5. 多項(xiàng)目構(gòu)建和Reactor
      6. 離線(xiàn)構(gòu)建
      7. 命令行選項(xiàng)介紹

    10. 測(cè)試



      1. 測(cè)試資源
      2. 運(yùn)行一個(gè)單獨(dú)的測(cè)試

    11. 打包



      1. JAR 資源

    12. 部署



      1. 固化SNAPSHOT依賴(lài)
      2. 拷貝依賴(lài)JAR包

    13. 命名約定

      1. 規(guī)則和指南
      2. 項(xiàng)目
      3. 依賴(lài)
      4. 發(fā)布多個(gè)包的項(xiàng)目

    14. 遠(yuǎn)程Repository布局
    15. 本地Repository布局
    16. 生成項(xiàng)目站點(diǎn)

      1. 顏色
      2. 風(fēng)格
      3. 報(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è)名字空間的聲明,如:

    1. xmlns:j="jelly:core"
      所有以j:作為前綴的節(jié)點(diǎn),Jelly都會(huì)把它視為在core標(biāo)識(shí)下 預(yù)定義的標(biāo)簽庫(kù)。
    2. 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)告。 "


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    posts - 5, comments - 10, trackbacks - 0, articles - 23

    Copyright © 李春生

    主站蜘蛛池模板: 免费无码肉片在线观看| 精品国产免费人成电影在线观看| av午夜福利一片免费看久久| 大地资源网高清在线观看免费| 99久久免费观看| 久久精品免费一区二区喷潮| 国产在线观看免费视频播放器 | 99re免费视频| 歪歪漫画在线观看官网免费阅读| 日韩a级毛片免费观看| 国产国拍亚洲精品福利| 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲国产成人一区二区精品区| 蜜芽亚洲av无码精品色午夜| 亚洲国产区男人本色在线观看| 免费国产在线精品一区| 小日子的在线观看免费| 91在线品视觉盛宴免费| 亚洲成年人啊啊aa在线观看| 久久青青草原亚洲AV无码麻豆| 国产亚洲国产bv网站在线| 青娱乐在线视频免费观看| 国产精品免费无遮挡无码永久视频| 中文字幕无码免费久久99| mm1313亚洲国产精品美女| 亚洲电影免费在线观看| 亚洲精品无码久久久久APP| 亚洲精品黄色视频在线观看免费资源| 8x成人永久免费视频| 国产18禁黄网站免费观看| 亚洲av无码专区在线播放| 亚洲欧洲国产综合AV无码久久 | 国产免费人成视频尤勿视频| 中文免费观看视频网站| 亚洲真人日本在线| 亚洲国产综合精品| 久久九九久精品国产免费直播| 福利免费观看午夜体检区| 亚洲综合日韩久久成人AV| 亚洲精品一卡2卡3卡四卡乱码| 免费国产叼嘿视频大全网站|