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

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

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

    Jhonney的專欄

       ----人見人愛
    隨筆 - 49, 文章 - 1, 評論 - 23, 引用 - 0
    數(shù)據(jù)加載中……

    Maven用戶手冊

    關于MAVEN較好的學習資源:
    1.http://www.tkk7.com/jiangshachina/archive/2006/12/12/79093.html
    2.http://www.tkk7.com/jiangshachina/archive/2006/09/01/67080.aspx
    3.http://www-128.ibm.com/developerworks/cn/java/j-maven/
    4.http://www.tkk7.com/jiangshachina/archive/2006/09/01/67080.aspx
    5.https://www6.software.ibm.com/developerworks/education/j-mavenv2/section7.html
    6.Better Build with Maven. http://www.mergere.com/m2book_download.jsp -- 強烈推薦
    7.http://maven.apache.org/ --推薦

    本篇word doc下載地址:Maven學習手冊.rar
     

    引言

    Maven最早始于Jarkarta Turbine項目,目的是為了簡化構(gòu)建過程。這個項目下面有 幾個子項目,每個子項目都有自己的Ant文件,但是區(qū)別很小,而且生成的JAR 文件都要check inCVS中。我們希望有一種標準的方式來構(gòu)建這些項目,一種可以 清晰描述項目的方式,一種易于發(fā)布項目信息的方式,一種在多個項目之間共享JARs 的方式。 

    這個結(jié)果就是產(chǎn)生了一個可以用于構(gòu)建、管理任何基于java的項目。我們希望我們創(chuàng)造 的這個工具可以讓Java開發(fā)者的日常工作更加輕松,并有助于理解基于java的項目。

    1. 項目對象模型

    Maven是基于項目對象模型(POM)的概念而創(chuàng)建的。在這個模型中,所有由Maven產(chǎn)生的 artifact都是清晰定義的項目模型的結(jié)果。構(gòu)建,文檔,源碼度量,源碼交叉引用和其他 任何由Maven plug-in提供的東西都是由POM來控制的。 

    1.1 POM處理機制

    這篇文檔簡單的描述了Maven執(zhí)行過程中是如何處理POM的。這里有一些簡單的POM例子 來展示繼承機制和插值機制。 

    1.2 POM 插值機制

    POM(通常以project.xml的名字出現(xiàn))現(xiàn)在已經(jīng)被當作Jelly腳本來處理了。大部分時 候,用戶無須關心project.xml文件是不是真正的Jelly腳本,但是,如果需要的話, 也可以使用內(nèi)置值。我也不愿看到邏輯控制語句出現(xiàn)在project.xml中,但是由于 project.xml實際上已經(jīng)是一個隱含的jelly的腳本,所以它會有足夠的靈活性。 下面是一個簡單的例子。

     

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <project>
      <pomVersion>3</pomVersion>
      <groupId>maven</groupId>
      <artifactId>maven</artifactId>
      <name>Maven</name>
      <currentVersion>1.0-b5-dev</currentVersion>
      <organization>
        <name>Apache Software Foundation</name>
        <url>http://jakarta.apache.org/</url>
        <logo>/images/jakarta-logo-blue.gif</logo>
      </organization>
      <inceptionYear>2001</inceptionYear>
      <package>org.apache.${pom.artifactId}</package>
      <logo>/images/${pom.artifactId}.jpg</logo>

      <description>Maven is a project that was created in ${pom.inceptionYear}.</description>
      <shortDescription>${pom.name} is a Java Project Management Tool</shortDescription>
    </project>

    1.3 POM 繼承機制

    現(xiàn)在有一種簡單方式可以用于在POM中進行繼承,下面是一個簡單的例子: 


    <?xml version="1.0" encoding="ISO-8859-1"?>
      <project>
        <extend>project.xml</extend>
        <groupId>super-extendo</groupId>
        <artifactId>super-extendo<artifactId>
        <name>Super Extendo</name>

        <build>
          <unitTest>
            <includes>
              <include>**/*Test*.java</include>
            </includes>
            <excludes>
              <exclude>**/TestAll.java</exclude>
              <exclude>**/*Abstract*.java</exclude>
            </excludes>
          </unitTest>
        </build>
      </project>

    目前對POM父對象的解析還相對較弱,現(xiàn)在對一層以上的繼承還沒有做過任何測試。盡管如此, 單層繼承加上插值機制已經(jīng)能夠給帶來很多好處。這些機制的意圖在于簡化構(gòu)建的共用問題。 
       
    你可以這樣定義主模板: 


    <project>
      <pomVersion>3</pomVersion>
      <groupId>commons</groupId>
      <artifactId>commons-master</artifactId>
      <name>Commons Master Maven POM</name>

      <organization>
        <name>Apache Software Foundation</name>
        <url>http://www.apache.org</url>
      </organization>

      <gumpRepositoryId>jakarta</gumpRepositoryId>

      <url>http://jakarta.apache.org/commons/${pom.artifactId}.html </url>
      <issueTrackingUrl>http://nagoya.apache.org/</issueTrackingUrl>
      <siteAddress>jakarta.apache.org</siteAddress>
      <siteDirectory>/www/jakarta.apache.org/commons/${pom.artifactId}/</siteDirectory>
      <distributionDirectory>
        /www/jakarta.apache.org/builds/jakarta-commons/${pom.artifactId}/
      </distributionDirectory>

      <repository>
        <connection>
          scm:cvsserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-commons/${pom.artifactId}
        </connection>
        <url>http://cvs.apache.org/viewcvs/jakarta-commons/${pom.artifactId}/</url>
      </repository>
      ...
    </project>

    POM對象可以這樣定義: 


    <project>
      <groupId>commons-betwixt</groupId>
      <artifactId>commons-betwixt</artifactId>
      <name>Betwixt</name>
      ...
    </project>

    這樣你就可以在父POM對象中,將子POM對象的${pom.artifactId}替換進去。有許多項目的 構(gòu)建都以相似的方式進行構(gòu)建,這樣一來,對于項目的公共部分,你就可以使用一個主模板, 然后在子POM對象project.xml中定義有區(qū)別的部分,而這部分內(nèi)容通常很少。 
       
    這種機制確實還可以簡化那些需要產(chǎn)生多個JAR包的項目。由于project.xml和標準Ant構(gòu)建 不會相互干擾,我計劃在公共部分測試繼承機制。 
       
    如果你對使用這種機制,DVSL報告會變成什么樣感到疑惑,我要說,你很上路。我已經(jīng)修改 DVSL報告來適應POM本身,這就是說DVSL轉(zhuǎn)換是基于java對象的。在使用繼承和插值機制的 時候,為了正確的產(chǎn)生DVSL報告,這是很有必要的。像上面列出的子模板是無法工作的,我們 需要全面的解析POM。我能說的是,它可以工作了!我所使用的處理方式可能不是最有效率的 方式,但仍有提升的空間。因為POM只會被處理一次(不管怎么說,這就它的原理,我可能漏了 某些東西),然后到處使用,至少這就是我以前試圖做的事情,所以我們很有可能會取得平衡。
      
    如果你不使用繼承和插值,那么一切照常工作。maven站點本身一切ok,有幾個剛部署的站點 已經(jīng)使用了我昨晚提交的東西了。 

     

     

    2. 使用插件

    Maven是一個很緊湊的內(nèi)核,圍繞著它的是許許多多的插件。Maven所有的功能都是由插件來提供 的。 

    2.1 maven.xml文件

    項目中的maven.xml文件是Maven在執(zhí)行過程中要使用的定制文件。 在這個文件中,你可以加入Maven構(gòu)建中需要的額外處理?;蛘咴?/span>Maven目標前后附加自己 的代碼,如jar  test 

    Maven使用Jelly 腳本語言任何合法的jelly標簽都可以在maven.xml中使用。 

    Maven所采用的goal功能是由werkz標簽庫提供。更多的信息請看 wiki頁面。

    2.2 簡單的maven.xml例子

    注意由于Maven并未缺省的定義“compile”目標,下面這個例子沒法運行。 

    這是一個簡單的maven.xml例子 


    <project
      default="nightly-build"
      xmlns:j="jelly:core"
      xmlns:u="jelly:util">

      <goal name="nightly-build">
        <!-- Any ant task, or jelly tags can go here thanks to jeez -->
        <j:set var="goals" value="compile,test" />
        <mkdir dir="${maven.build.dir}" />
        <u:tokenize var="goals" delim=",">${goals}</u:tokenize>
        <j:forEach items="${goals}" var="goal" indexVar="goalNumber">
          Now attaining goal number ${goalNumber}, which is ${goal}
          <attainGoal name="${goal}" />
        </j:forEach>
      </goal>

    </project>

    你可能會注意到這里一些有意思的東西,下面我們將逐一解釋。 

    2.2.1 project節(jié)點

    project節(jié)點, <project>,是任何 maven.xml 文件的根節(jié)點。 
      
    項目節(jié)點有一個缺省的屬性:default="nightly-build",如果用戶只是簡單鍵入 沒有參數(shù)的maven命令,Maven就會用nightly-build 目標作為缺省目標。 
      
    接下來是幾個名字空間的聲明,如: 

    xmlns:j="jelly:core" 

    所有以j:作為前綴的節(jié)點,Jelly都會把它視為在core標識下 預定義的標簽庫。 

    xmlns:u="jelly:util" 

    所有以u:作為前綴的節(jié)點,Jelly都會把它視為在標識下 預定義的標簽庫。 
      
    所有在maven.xml文件使用的Jelly標簽庫,都必須在project節(jié)點中定義,并且 分配一個名稱空間前綴。 
       Maven
    已經(jīng)預先包含了jeez標簽庫作為空前綴。這個標簽庫在一個名稱空間內(nèi)包含了 ant  werkz 標簽庫。這樣,任何werkzant標簽都無須名稱空間 即可使用,同時也簡化了ant的遷移過程。 

    2.2.2 目標

    goal是一個 werkz 標簽,類似于Anttarget;它是包含了一系列可執(zhí)行標簽的容器。 
    由于jeez 標簽庫已經(jīng)由maven預先注冊了,一個目標(goal)可以包含任何合法的 Ant 標簽。 
    為了執(zhí)行在maven.xml中定義的目標,你只需要在命令行中為Maven指定目標名即可。要執(zhí)行例子中定 義的nightly-build你只需執(zhí)行命令:

    maven nightly-build

    Maven插件定義的目標需要在目標前加上插件名,這樣一來,就不會和你自己的goal沖突,如 jar:jar就是 jar 插件定義的目標,用于創(chuàng)建項目的jar包。

    2.2.3 Jelly編程

    在每個目標里,由Jelly標簽提供功能,讓我們來看看例子里的這些代碼。 
      
    set
       <j:set var="goals" value="compile,test" />
    這行就是一個jellycore標簽set,它使用了project節(jié)點中定義的前綴 j: 
       set
    標簽設置了一個由var屬性定義的Jelly變量,值由 value 指定。和Antproerties不一樣,Jelly變量在被賦值后仍可以改變。 
      
    mkdir
       <mkdir dir="${maven.build.dir}" />
    等同于Ant任務 mkdir, 用于創(chuàng)建目錄,目錄名由變量 ${maven.build.dir}指定。 
      
    tokenize
       <u:tokenize var="goals" delim=",">${goals}</u:tokenize>
    這行執(zhí)行的是Jelly tokenize 標簽。這是Jelly util 標簽庫中標簽, 這個標簽庫已經(jīng)在項目節(jié)點中預先定義:u: 
       tokenize
    標簽在將節(jié)點中的內(nèi)容分離成一個list,用于后續(xù)的處理。 
       var 
    屬性就是將被于新list的變量。 
       delim 
    屬性是用于分割字符串中的分隔符。 
      
    在這個例子中,tokenize 標簽中節(jié)點值是一個變量:goals, 在前幾行中,這是一個由逗號分隔、compile  test 的字符串。 
      
    forEach
       <j:forEach items="${goals}" var="goal" indexVar="goalNumber">
            Now attaining goal number ${goalNumber}, which is ${goal}
           <attainGoal name="${goal}" />
        </j:forEach>

    forEach標簽提供簡單循環(huán)功能,節(jié)點值就是循環(huán)體。 

    items 屬性是一個表達式,是在循環(huán)過程中需要遍歷的值集合。 
    集合中的值被逐個取出,存放在var 屬性指定的變量中。你可以在 forEach 循環(huán)體訪問這個變量。 

    indexVar 屬性指定了一個計數(shù)器(起始基數(shù)為0)變量,用于在處理 過程中計數(shù)。      

    forEach 標簽的節(jié)點值輸出了一些在處理過程中的關于目標的文本,并使用 attainGoal werkz 標簽來獲得(執(zhí)行?)這些目標。

    2.3 Maven 配置

    2.3.1 屬性的處理機制

    Maven按下面的順序依次讀入properties文件: 


    ${project.home}/project.properties 
    ${project.home}/build.properties 
    ${user.home}/build.properties 

     

    讀入的屬性遵循最后的定義有效原則。也就是說,Maven依次讀入properties文件,以新的定義 覆蓋舊的定義。${user.home}/build.propertiesMaven最后處理的文件。我們把 這些文件稱為Maven處理的標準屬性文件集。 

    另外,上述properties文件處理完畢后,Maven才會開始處理系統(tǒng)屬性。所以,如果在命令行中使用 -Dproperty=value這樣的形式來指定的屬性,它會覆蓋先前定義的同名屬性。

    2.3.2 插件的屬性

    上述屬性文件處理完后,Maven才會開始調(diào)用插件,但是 PluginManager 會禁止插件 覆蓋已經(jīng)設置的屬性值。這和Maven一般的屬性處理方式是相反的,這是因為插件只能在Maven內(nèi)部的 其他部分初始化完畢后才能處理,但是我們又希望以這樣順序去處理屬性: 


    處理Plug-in 缺省屬性 


    處理${project.home}/project.properties 
    處理${project.home}/build.properties 
    處理${user.home}/build.properties 

     

    這樣一來,即使插件處于屬性處理鏈的后端,也能覆蓋插件的任何缺省屬性。例如,Checkstyle插件 就定義了如下缺省屬性:

    maven.checkstyle.format = sun

    你可能已經(jīng)猜出來了,Checksytle插件把Sun的編碼規(guī)范作為缺省的格式。但是我們?nèi)匀豢梢栽跇藴蕦傩?/span> 文件集的任何一個文件中覆蓋這個屬性。所以如果在${project.home}/project.properties 文件定義了如下屬性值: 

    maven.checkstyle.format = turbine

    Checkstyle就會使用Turbine的編碼規(guī)范。 

    2.3.3 行為屬性

    下面的這些屬性可以改變Maven的“行為方式”。 

    屬性

    描述

    缺省值

    maven.build.dest

    目錄名,存放編譯生成的類

    ${maven.build.dir}/classes

    maven.build.dir

    放構(gòu)建結(jié)果的目錄,如類文件,文檔,單元測試報告等等。

    注意: ${user.home}/build.properties文件中改變maven.build.dir 的缺省值或許會得到一個 較為個性化的目錄布局。但是,這會干擾Maven由從源碼開始的編譯工作,因為它假設jar 會被創(chuàng)建到${basedir}/target/目錄中。

    ${basedir}/target

    maven.build.src

    源碼目錄

    ${maven.build.dir}/src

    maven.conf.dir

    配置文件目錄

    ${basedir}/conf

    maven.docs.dest

    html格式報告的輸出目錄

    ${maven.build.dir}/docs

    maven.docs.omitXmlDeclaration

    產(chǎn)生的文檔所應包含的xml聲明頭,如:

    <?xml version="1.0"?> false

     

    maven.docs.outputencoding

    生成文檔的缺省編碼

    ISO-8859-1

    maven.docs.src

    用戶提供的文檔目錄

    ${basedir}/xdocs

    maven.gen.docs

    xdocs文檔轉(zhuǎn)換成html后的輸出目錄

    ${maven.build.dir}/generated-xdocs

    maven.home.local

    maven用于寫入用戶信息的本機目錄,如解開插件包、緩沖數(shù)據(jù)。

    ${user.home}/.maven

    maven.mode.online

    是否連接internet

    true

    maven.plugin.dir

    插件的存放目錄

    ${maven.home}/plugins

    maven.plugin.unpacked.dir

    用于展開安裝插件的目錄

    ${maven.home.local}/plugins

    maven.repo.central

    在進行dist:deploy處理的時候,發(fā)行包所要部署的目標機器

    login.ibiblio.org

    maven.repo.central.directory

    在進行dist:deploy處理的時候,發(fā)行包所要部署的目標目錄。

    /public/html/maven

    maven.repo.local

    本機repository,用于存儲下載的jar包。

    ${maven.home.local}/repository

    maven.repo.remote

    遠程repository,如果本機repository沒有的jar包,maven會從這里下載。

    http://www.ibiblio.org/maven

    maven.repo.remote.enabled

    是否使用遠程repository

    true

    maven.scp.executable

    用于安全拷貝的可執(zhí)行程序

    scp

    maven.src.dir

    基礎源代碼目錄

    ${basedir}/src

    maven.ssh.executable

    遠程命令可執(zhí)行程序

    scp



    2.3.4 使用代理

    如果你只能通過代理訪問,不要緊,Maven為你提供了下列屬性: 

    代理屬性

    描述

    maven.proxy.host

    代理的IP地址

    maven.proxy.port

    代理端口

    maven.proxy.username

    如果代理需要認證的話,在這里填寫用戶名。 User name if your proxy requires authentication.

    maven.proxy.password

    如果代理需要認證的話,在這里填寫密碼。

     

    如果你實在需要代理,最好在${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
    .
    .

    2.3.5 使用多個遠程Repositories

    你可以在任何Maven可以處理的屬性文件中指定使用多個遠程Repositories,如: 
    maven.repo.remote = http://www.ibiblio.org/maven/,http://www.mycompany.com/maven/

    3. 項目設置

    3.1 開始一個新項目

    如果你是第一次使用Maven,或者開始一個新的項目,你可以使用GenApp來自動創(chuàng)建Maven項目樹。 

    maven -Dpackage=com.mycompany.app genapp

    執(zhí)行該命令后,屏幕顯示如下: 


    __  __
    |  \/  |__ Jakarta _ ___
    | |\/| / _ \ V / -_) ' \  ~ intelligent projects ~
    |_|  |_\__,_|\_/\___|_||_|   v. 1.0-beta-9


        [mkdir] Created dir: <target-directory>/genapp/src/java/com/mycompany/app
        [copy] Copying 1 file to <target-directory>/genapp/src/java/com/mycompany/app
        [mkdir] Created dir: <target-directory>/genapp/src/test/com/mycompany/app
        [copy] Copying 3 files to <target-directory>/genapp/src/test/com/mycompany/app
        [copy] Copying 2 files to <target-directory>/genapp
        [copy] Copying 1 file to <target-directory>/genapp/src/conf
        BUILD SUCCESSFUL
        Total time:  3 seconds

    執(zhí)行完畢,即生成下面的完整項目目錄樹: 


    .
    |-- project.properties
    |-- project.xml
    `-- src
        |-- conf
        |   `-- app.properties
        |-- java
        |   `-- com
        |       `-- mycompany
        |           `-- app
        |               `-- App.java
        `-- test
            `-- com
                `-- mycompany
                    `-- app
                        |-- AbstractTestCase.java
                        |-- AppTest.java
                        `-- NaughtyTest.java

     

     

    3.2 構(gòu)建

    Maven采用了集中管理庫的理念。所有用于構(gòu)建的jar包都是從集中管理的中心庫上取出。目前, 我們的中心庫放在這兒 Ibiblio. 在一個典型的Maven項目中,構(gòu)建所需的 jar包會從中心庫下載。Maven只會取回依賴鏈條上缺失的包。如果你使用Maven來構(gòu)建幾個項目, 這些項目可能會共享一些依賴包:Maven可以在任意個項目中共享同一個包,而無須在同一系統(tǒng) 中保持一個jar包的多個拷貝。 

    3.2.1 構(gòu)建生命周期

    3.2.2 CVS中存放jar文件

    我們不推薦你在CVS中存放jar包。Maven提倡在本機repository中存放用于構(gòu)建共享的jar包或 和其他項目包。許多項目都依賴于諸如XML解析器、標準例程,這在Ant構(gòu)建中,經(jīng)常會被復制 多份。在Maven中,這些標準例程就存放在本地repository中,供任何項目構(gòu)建使用。 

    3.2.3 重載已聲明的依賴包

    你可能會發(fā)現(xiàn),在某些情況下允許重載POM中已經(jīng)聲明的依賴包會很方便,甚至很有必要。 你可能會希望使用文件系統(tǒng)中的某個JAR包,或者你希望簡單重新指定某個包的版本。對于 這樣的情況,Maven提供了一種簡單的方式,允許你選擇構(gòu)建所需的jar包。我們嚴重建議你設置本機repository,但是在簡單至上,或在由ant構(gòu)建遷移的情況下,JAR包重載特性 會顯得非常方便。

    為了使用JAR包重載特性,你必須將maven.jar.override 屬性設置為 on。 只要設置了這個屬性,就可以在任何maven處理的屬性文件中重載JAR包。 

    關于JAR重載的指令有兩種。第一種允許你指定某個特定的包的路徑,作為JAR包;的二種 允許你指定某個特定的JAR包(這個jar包必須已經(jīng)存在于本機repository)。下面是這兩 種方式:


    maven.jar.artifactId = [path]

    maven.jar.artifactId = [version]

    下面是一個使用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

    3.2.4 使用SNAPSHOT依賴

    Maven中,SNAPSHOP是某個特定項目的最新構(gòu)建的jar包。如果你的項目依賴于另一個頻繁變更 的項目,你可以在你的POM中聲明SNAPSHOP依賴,以保持與那個項目的同步。例如,在你的POM 這樣寫,你可以與Jelly保持 同步更新。 


    <project>
      ...
      <dependencies>

       <dependency>
         <groupId>commons-jelly</groupId>
         <artifactId>commons-jelly</groupId>
         <version>SNAPSHOT</version>
       </dependency>

      </dependencies>
     ...
    </project>

    上述語句的含義是:總是使用Maven repository中最新的Jelly構(gòu)建包。SNAPSHOT依賴 總會導致依賴失敗。在這種情況下,Maven就會去Maven repository取得一個SNAPSHOT 依賴包的拷貝。如果你正在離線工作,Maven就會發(fā)出警告:“SNAPSHO依賴包可能已經(jīng) 過期”。

    3.2.5 多項目構(gòu)建和Reactor

    Maven中,Reactor是一個用于控制多項目構(gòu)建的工具。ReactorWerkz,并根據(jù)每個項目 各自定義的依賴關系來安排構(gòu)建順序。Reactor的意圖在于:鼓勵創(chuàng)建/重構(gòu)具有更小、更松散、 更有一致性單元的項目。r源于面向組件編程,在向組件編程中,整個系統(tǒng)由許多松散的個體 構(gòu)成,這些個體需要聚合起來作為一個整體進行部署。 

    Reactor可以為某個項目集執(zhí)行一個任意編排的目標列表。所以,如果使用Reactor的話,它 可以用來做項目站點生成,任意jar包生成這樣的事情。 

    目前 db.apache.org 站點就是收集了其子項目的 豐富信息、并與一系列的Velocity 模板合成的。這一過程是由 Jelly Velocity 標簽庫來完成的。 這里是其中的機制,有興趣可以看看。 

    Plexus(一個基于Avalon的容器)組件的manifest是遍歷所有Plexus組件、并聚合而成的。這里 使用的還是Velocity模板和Jelly Volocity標簽庫。 這里是其中的機制,有興趣可以看看。 

    這里是一個使用Reactor標簽,遍歷一系列組件,最后產(chǎn)生項目站點的例子:


      <goal
        name="project-site"
        description="Generate the site for the entire project">

        <!-- Generate the site for each of the components. -->

        <maven:reactor
          basedir="${basedir}/components"
          postProcessing="true"
          includes="*/project.xml"
          excludes="bad-component/*"
          goals="site"
          banner="Generating Site"
          ignoreFailures="true"/>

        <!--
         |
         | At this point because 'postProcessing' was turned on we have all
         | the processed POMs available to us in the ${reactorProjects} variable.
         |
         -->

        <j:forEach var="reactorProject" items="${reactorProjects}">

          ... Do whatever you want with the harvested information ...

        </j:forEach>
      </goal>

    如果你需要聚合N個項目的文檔,形成一個統(tǒng)一的視圖,你可以參考 db.apache.org站點,它從所有的子項目中收集 信息,最終形成一個有導航條,郵件列表,開發(fā)者列表和源碼repository統(tǒng)一的站點。這解決 了在收集子項目信息過程中的冗余、易于產(chǎn)生錯誤的問題。db.apache.org的子項目只需關注 自身的信息,卻可以自動的集成到高層的項目站點中。 

    3.2.6 離線構(gòu)建

    如果你需要離線構(gòu)建,你得在命令行中使用離線選項:

    maven -o jar:jar

    這等同于:

    maven -Dmaven.mode.online=false jar:jar

    或者你可以在屬性文件中設置 maven.mode.online 屬性為false。 

    在聯(lián)機模式下,maven總是下載 SNAPSHOT 依賴包請參考 使用SNAPSHOT依賴。如果本機repository 上的當前版本比服務器上的還要新,你也許不想maven覆蓋你的當前版本。如果不想下載,你可以 設置屬性: 

    maven.repo.remote.enabled=false

    maven beta 9版本中,這個屬性并沒有起作用(新版本已經(jīng)解決了這個問題)??梢赃@樣來清空 maven.repo.remote 屬性:

    maven.repo.remote.enabled=

    在命令行或?qū)傩晕募性O置都一樣。 

    在下面的情形中,你需要同時設置maven.repo.remote.enabled=false maven.mode.online=true:希望javadoc插件的"-link"選項起作用,而又不希望 下載任何(包括snapshot)包。 

    3.2.7 命令行選項介紹

    如果你用命令行來構(gòu)建,這里提供了一個關于命令行選項的快速參考。 

    Options:

    命令選項

    選項描述

    -D,--define arg

    定義一個系統(tǒng)屬性

    -E,--emacs

    輸出簡潔的日志信息

    -X,--debug

    輸出debug信息

    -b,--nobanner

    禁止 logo banner

    -d,--dir arg

    設置指定的工作目錄

    -e,--exception

    輸出異常堆棧信息

    -f,--find arg

    通過搜尋項目文件來確定執(zhí)行的項目文件及其工作目錄

    -g,--goals

    顯示可用的目標

    -h,--help

    顯示幫助信息

    -i,--info

    顯示系統(tǒng)信息

    -o,--offline

    離線構(gòu)建

    -p,--pom arg

    指定項目文件

    -v,--version

    顯示版本號

     

    3.3 測試

    3.3.1 測試資源

           通常情況下,你需要在測試類路徑上為測試指定某些資源。你可以在POM中使用 。

    下面的例子說明了如何遞歸的包含在${basedir}/src/test目錄中所有以.xml.properties為擴展名 的文件: 


    <project>
      ...
      <build>
        ...
        <unitTest>
          ...
          <resources>
            <resource>
              <directory>${basedir}/src/test</directory>
              <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
              </includes>
            </resource>
          </resources>
        </unitTest>
      </build>
    </project>

    下面的例子說明了如何遞歸的包含在${basedir}/src/test目錄中所有以.xml.properties為擴展名 的文件,但naughty.properties文件除外。請注意增加的project/build/unitTest/resources/excludes 節(jié)點:


      <project>
        ...
        <build>
          ...
          <unitTest>
            ...
            <resources>
              <resource>
                <directory>${basedir}/src/test</directory>
                <includes>
                  <include>**/*.xml</include>
                  <include>**/*.properties</include>
                </includes>
                <excludes>
                  <exclude>naughty.properties</exclude>
                </excludes>
              </resource>
            </resources>
          </unitTest>
        </build>
      </project>

    3.3.2 運行一個單獨的測試

    下面的命令運行了一個單獨的測試: 

    maven -Dtestcase=org.foo.bar.MyTest test:single-test

    3.4 打包

    3.4.1 JAR 資源


    <project>
      ...
      <build>
        <resources>
          <!-- A -->
          <resource>
            <directory>${basedir}/src/conf</directory>
            <includes>
              <include>*.xml</include>
              <include>*.properties</include>
            </includes>
          </resource>
          <!-- B -->
          <resource>
            <directory>${basedir}/src/messages</directory>
            <targetPath>org/apache/maven/messages</targetPath>
            <includes>
              <include>messages*.properties</include>
            </includes>
          </resource>
        </resources>
      </build>
    </project>

     

    3.5 部署

    3.5.1 固化SNAPSHOT依賴

    在開發(fā)時使用SNAPSHOT依賴包非常方便,但是在部署的時候,你需要把所有的SNAPSHOT依賴包 固定下來,以便發(fā)布一個包含固定jar的版本。如果你發(fā)布了一個含SNAPSHOT依賴包的項目,而 這些SNAPSHOT在項目發(fā)布后發(fā)生了變更,你可能很快就會發(fā)現(xiàn)這個版本沒法兒工作。 

    SNAPSHOT以時間戳為版本號部署到Maven上時,Maven可以識別foo-SNAPSHOT.jar實際上相當 foo-20030101.010101.jar。當部署的時刻來臨,你可以用下面的命令,讓MavenSNAPSHOT 版本號變?yōu)闀r間戳版本號。

           maven convert-snapshots

    Maven會提供交互的方式讓你選擇哪個SNAPSHOPT依賴包應該固化下來。這一過程結(jié)束后,Maven 就會把剛才你的選擇寫會你的POM。 

    如果你希望Maven簡單的、盡可能最好的固化SNAPSHOT依賴包,你可以用下面的命令: 

    maven convert-snapshots-auto

    3.5.2 拷貝依賴JAR

    maven.xml這樣寫下面的語句是最簡單的拷貝依賴包的方法。 


    <project
      xmlns:deploy="deploy">

      <goal name="deploy-my-project">
        ...
        <deploy:copy-deps todir="/path"/>
        ...
      </goal>

    </project>

    deploy:copy-deps標簽你就可以簡單的把項目所有的依賴包拷貝到任何 目錄,如果希望排除某個依賴包,需要給出一個依賴包的id列表,列表中依賴包就不會被拷貝。 


    <project
      xmlns:deploy="deploy">

      <goal name="deploy-my-project">
        ...
        <deploy:copy-deps todir="/path" excludes="servletapi,commons-util"/>
        ...
      </goal>
    </project>

    3.6 命名約定

    這部分將簡要的描述項目對象模型(POM)中命名約定。本篇文檔希望可以統(tǒng)一各式各樣jar包命名 方法,這些jar包一般為java開發(fā)者社區(qū)廣泛使用。 

    規(guī)則和指南

    3.6.1 項目

    一個項目必須由一個唯一的的標識,標識由a-z小寫字母和連線號構(gòu)成,其首字母必須以小寫字母 開頭。 

    <project>
      <groupId>bar</groupId>
      <artifactId>foo</artifactId>
      ...
    </project>

    所有項目間的引用都由組id和包id構(gòu)成。到現(xiàn)在為止,在POM與此相關的是下面將要(上面提到的?)談到的項目的 依賴聲明。 

    項目的名稱應該易于閱讀,可用于文檔。 

    <project>
      <groupId>bar</groupId>
      <artifactId>foo</artifactId>
      <name>The Grand Master Foo</name>
      ...
    </project>

    項目應該有一個組標識,組標識是名稱的基礎部分。 

    <project>
      <groupId>bar</groupId>
      <artifactId>foo</artifactId>
      <name>The Grand Master Foo</name>
      ...
    </project>

    所有項目發(fā)布的包都應基于項目唯一的標識,并且放在基于項目的組id的目錄中。對于上面的 項目來說,假定發(fā)布的包是jar類型的包,我們就會有如下目錄結(jié)構(gòu): 


    repository
     |
     +-- bar
         |-- distribution
         `-- jar
             |-- foo-1.0.jar
             `-- foo-2.0.jar

    3.6.2 依賴

    一個理想的典型依賴聲明的例子可能會象這樣:

     
    <project>
      <groupId>yourProject</groupId>
      <artifactId>yourArtifact</artifactId>
      <name>Your Groovey Machine</name>
      ...

      <dependencies>

       <dependency>
         <groupId>bar</groupId>
         <artifactId>foo</artifactId>
         <version>1.0</version>
       </dependency>

     </dependencies>

    </project>

    這樣一來,依賴于idfoo1.0 版本的bar項目 屬于org.foo.bar組。這個依賴會被解析為本地repositoryjar文件。上面 的情形假定發(fā)布的包是基于包id命名的。因此對于上述依賴,Maven就會采用 foo-1.0.jar作為jar名。 

    就像用戶反映的那樣,這種理想的方式并不能適應所有的項目。有幾種情形我們必須考慮調(diào)整 理想的依賴機制: 

    發(fā)布的jar包的并未使用項目作為基礎名,如xercesImpl就是所有發(fā)布的jar包的基礎名 它與gump idmaven中的id都不一樣。

     發(fā)布的jar包沒有使用任何版本聲明,如許多commons組件并沒有把版本號作為包名的一部分。 

    有些項目即沒有使用項目id作為基礎名也沒有版本聲明。例如,最壞的情形是Java Activation Framework jar包,它沒有遵循其他Sun的命名規(guī)則,也沒有在jar包中聲明 版本號,甚至在manifest中都沒有任何版本信息。 

    在多數(shù)情形下,任何例外的情況都可以用 <jar>(可選節(jié)點)、或者是重命名來解決。 現(xiàn)在,許多Jarkata的產(chǎn)品在repository已經(jīng)被重命名,因為在不久的未來,絕大多數(shù)的Jarkarta 項目將用maven進行構(gòu)建。但這不是公司政策,我們不需要解決所有情況的問題。

    3.6.3 發(fā)布多個包的項目

    Maven的依賴機制完全支持任何形式的多項目包。 Maven's dependency mechanism completely supports multiple project artifacts of any given type。

    下面的代碼包含了ant的主jar包和optional包加上hypothetical包。 


    <dependencies>

      <!-- A -->
      <dependency>
        <groupId>ant</groupId>
        <artifactId>ant</artifactId>
        <version>1.4.1</version>
      </dependency>

      <!-- B -->
      <dependency>
        <groupId>ant</groupId>
        <artifactId>ant-optional</artifactId>
        <version>1.4.1</version>
      </dependency>

      <!-- C -->
      <dependency>
        <groupId>ant</groupId>
        <artifactId>poorly-named</artifactId>
        <version>1.4.1</version>
      </dependency>

    </dependencies>

    所以A), B)  C)實際上是指向?qū)儆谕唤M的單個包的指針,這就是說,一個單獨的依賴就是對某個組中的某個 包的引用。目前artifact如果沒有特別說明的話,一般指的是jar包。但是依賴也可能是一個war文件或一個 發(fā)行包。我們試圖在提供多數(shù)情況下(構(gòu)建大多需要jar)使用的缺省方式的同時,也顧及靈活性。 

    3.6.4 遠程Repository布局

    這部分文檔將對Maven的遠程repositories做一個概要的說明。目前,主repository位于 Ibiblio,但是你也可以自己創(chuàng)建一 個遠程repositories,其結(jié)果描述可以在這部分文檔中找到。 

    任何獨立的項目在repository都有自己的目錄。每個項目有一個唯一的項目id和同名目錄, 項目的發(fā)行包就放在這個目錄中。 

    項目的目錄中可以存放各種各樣的artifacts,目前最為廣泛使用的兩種類型是jar包和發(fā)行包 下面是一個遠程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

    3.6.5本地Repository布局

    應該有一個接口集合的緊湊實現(xiàn)使本地repository目錄結(jié)構(gòu)更加隨意一些?,F(xiàn)在我只使用 了一個類來實現(xiàn),顯得有些臃腫。我還是認為本地和遠程repositories應保持相同的結(jié)構(gòu) 但是為了使用更樂于使用,我開始設計一些接口,用于滿足用戶自己安排自己本地Repository 布局,相似的遠程Repositor也在設計中。盡管目前本地repository仍與遠程repository 完全一致,我希望聽到更多的用戶反饋,以促進這些接口的開發(fā),或者完全拋棄它。 

    3.6.6 生成項目站點

    Maven可以為項目產(chǎn)生一個完成的web站點。這個web站點將包含各種各樣、由許多Maven插件 產(chǎn)生的報告,如javadocs,代碼度量,單元測試,changlog,及其它... 本節(jié)文檔接下來的 部分將闡述Maven支持的站點定制選項。 

    顏色

    考慮到一致性,缺省情況下,所有Maven產(chǎn)生的站點都使用相似的外觀。這使用戶一眼就能 認出由Maven產(chǎn)生的站點,產(chǎn)生熟悉的感覺,更加方便信息的獲取。當然,Maven開發(fā)組也 考慮到用戶可能會希望定制他們的站點。修改Maven產(chǎn)生的站點,最簡單的方法是指定你要 使用的顏色搭配。這只需要在project.properties簡單的設置適當?shù)膶傩?/span> 即可。下面是所有可用的屬性描述在 xdoc plugin 
    風格

    如果你感覺顏色太過于簡單,無法滿足你的要求,你可以用自己的stylesheet。為了重載 ${basedir}/xdocs/stylesheets/中的maven.css stylesheet,你可以通過設置maven.javadoc.stylesheet 屬性來指定你的 javadoc風格。 

    報告

    最后,如果你希望定制哪些報告需要自動產(chǎn)生,你需要在你的項目描述中包含 reports 標簽庫。 到目前為止,如果沒有reports標簽指定,所有插件報告都會產(chǎn)生。這個標簽 允許你選擇產(chǎn)生哪些報告而排斥另外一些報告,而且允許你安排順序。 

    目前的標準 報告集在xdoc中是硬編碼實現(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)生缺省的報告,但是還想增加或刪除一兩個,最好的方法是:給 xdoc:register-reports目標寫一個前置目標(postGoal)。 


    <postGoal name="xdoc:register-reports">
      <attainGoal name="maven-changelog-plugin:deregister"/>  
      <attainGoal name="maven-myown-plugin:register"/>  
    </postGoal>

    3.6.7 排除所有Maven產(chǎn)生的內(nèi)容

    某些情況下,用戶需要構(gòu)建只有文檔的站點,或是構(gòu)建聚合許多子項目的站點,但不希望 在站點上有個整體項目文檔導航條。設置 maven.xdoc.includeProjectDocumentation屬性值為no 即可解決這一問題。缺省的,Maven會包含項目文檔導航條,下面掛的是許多Maven 生成的報告。 


    posted on 2007-06-14 16:28 Jhonney 閱讀(1528) 評論(0)  編輯  收藏


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲视频中文字幕在线| 欧洲人成在线免费| 亚洲AV综合色区无码二区爱AV| 亚洲日韩国产精品乱| 最近2019中文字幕mv免费看| 96免费精品视频在线观看| 一级做性色a爰片久久毛片免费| 亚洲精品成a人在线观看夫| 亚洲国产夜色在线观看| 久久久久亚洲av无码尤物| 久久影视国产亚洲| 亚洲熟伦熟女新五十路熟妇| 在线观看免费亚洲| 日韩免费一区二区三区| 成人毛片免费视频| 中国在线观看免费国语版| 8x8x华人永久免费视频| 伊人久久免费视频| 久久青草91免费观看| 九九美女网站免费| 久久久久久久99精品免费观看| 中文字幕不卡免费视频| 九九99热免费最新版| 99精品免费视频| a级毛片免费播放| 免费无码又爽又刺激网站| 在线观看片免费人成视频播放| 国产99精品一区二区三区免费| 色老头综合免费视频| 成人在线免费视频| j8又粗又长又硬又爽免费视频| 四虎影视在线看免费观看| 产传媒61国产免费| 国产精品免费久久久久久久久| 国产精品内射视频免费| 国产日韩AV免费无码一区二区三区| 国产区在线免费观看| 久久成人免费大片| 精品成在人线AV无码免费看| 久久精品女人天堂AV免费观看| 在线播放免费人成视频在线观看 |