乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Maven中文手冊

       漂在北方的狼 2007-09-19
      Maven最早始于Jarkarta Turbine項(xiàng)目,目的是為了簡化構(gòu)建過程。這個(gè)項(xiàng)目下面有 幾個(gè)子項(xiàng)目,每個(gè)子項(xiàng)目都有自己的Ant文件,但是區(qū)別很小,而且生成的JAR 文件都要check inCVS中。我們希望有一種標(biāo)準(zhǔn)的方式來構(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開發(fā)者的日常工作更加輕松,并有助于理解基于java的項(xiàng)目

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

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

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

      <?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./</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>
              POM 
      繼承機(jī)制
      現(xiàn)在有一種簡單方式可以用于在POM中進(jìn)行繼承,下面是一個(gè)簡單的例子: 

      <?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ī)制已經(jīng)能夠給帶來很多好處。這些機(jī)制的意圖在于簡化構(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.</url>
        </organization>

        <gumpRepositoryId>jakarta</gumpRepositoryId>

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

        <repository>
          <connection>
            scm:cvs server:anoncvs@cvs.:/home/cvspublic:jakarta-commons/${pom.artifactId}
          </connection>
          <url> http://cvs./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}替換進(jìn)去。有許多項(xiàng)目的 構(gòu)建都以相似的方式進(jìn)行構(gòu)建,這樣一來,對于項(xiàng)目的公共部分,你就可以使用一個(gè)主模板, 然后在子POM對象project.xml中定義有區(qū)別的部分,而這部分內(nèi)容通常很少。 

      這種機(jī)制確實(shí)還可以簡化那些需要產(chǎn)生多個(gè)JAR包的項(xiàng)目。由于project.xml和標(biāo)準(zhǔn)Ant構(gòu)建 不會相互干擾,我計(jì)劃在公共部分測試?yán)^承機(jī)制。 

      如果你對使用這種機(jī)制,DVSL報(bào)告會變成什么樣感到疑惑,我要說,你很上路。我已經(jīng)修改 DVSL報(bào)告來適應(yīng)POM本身,這就是說DVSL轉(zhuǎn)換是基于java對象的。在使用繼承和插值機(jī)制的 時(shí)候,為了正確的產(chǎn)生DVSL報(bào)告,這是很有必要的。象上面列出的子模板是無法工作的,我們 需要全面的解析POM。我能說的是,它可以工作了!我所使用的處理方式可能不是最有效率的 方式,但仍有提升的空間。因?yàn)?/span>POM只會被處理一次(不管怎么說,這就它的原理,我可能漏了 某些東西),然后到處使用,至少這就是我以前試圖做的事情,所以我們很有可能會取得平衡。 

      如果你不使用繼承和插值,那么一切照常工作。maven站點(diǎn)本身一切ok,有幾個(gè)剛部署的站點(diǎn) 已經(jīng)使用了我昨晚提交的東西了。 

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

      maven.xml
      文件
      項(xiàng)目中的maven.xml文件是Maven在執(zhí)行過程中要使用的定制文件。 

      在這個(gè)文件中,你可以加入Maven構(gòu)建中需要的額外處理?;蛘咴?/span>Maven目標(biāo)前后附加自己 的代碼,如jar  test 

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

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

      簡單的maven.xml例子
      注意由于Maven并未缺省的定義‘compile‘目標(biāo),下面這個(gè)例子沒法運(yùn)行。 

      這是一個(gè)簡單的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>
      你可能會注意到這里一些有意思的東西,下面我們將逐一解釋。 

      project
      節(jié)點(diǎn)
      project
      節(jié)點(diǎn), <project>, 是任何 maven.xml 文件的根節(jié)點(diǎn)。 

      項(xiàng)目節(jié)點(diǎn)有一個(gè)缺省的屬性:default="nightly-build",如果用戶只是簡單鍵入 沒有參數(shù)的maven命令,Maven就會用nightly-build 目標(biāo)作為缺省目標(biāo)。 

      接下來是幾個(gè)名字空間的聲明,如: 

      xmlns:j="jelly:core" 
      所有以j:作為前綴的節(jié)點(diǎn),Jelly都會把它視為在core標(biāo)識下 預(yù)定義的標(biāo)簽庫。 

      xmlns:u="jelly:util" 
      所有以u:作為前綴的節(jié)點(diǎn),Jelly都會把它視為在標(biāo)識下 預(yù)定義的標(biāo)簽庫。 


      所有在maven.xml文件使用的Jelly標(biāo)簽庫,都必須在project節(jié)點(diǎn)中定義,并且 分配一個(gè)名稱空間前綴。 

      Maven
      已經(jīng)預(yù)先包含了jeez標(biāo)簽庫作為空前綴。這個(gè)標(biāo)簽庫在一個(gè)名稱空間內(nèi)包含了 ant  werkz 標(biāo)簽庫。這樣,任何werkzant標(biāo)簽都無須名稱空間 即可使用,同時(shí)也簡化了ant的遷移過程。 

      目標(biāo)
      goal
      是一個(gè) werkz 標(biāo)簽,類似于Anttarget;它是包含了一系列可執(zhí)行標(biāo)簽的容器。 

      由于jeez 標(biāo)簽庫已經(jīng)由maven預(yù)先注冊了,一個(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)前加上插件名,這樣一來,就不會和你自己的goal沖突,如 jar:jar就是 jar 插件定義的目標(biāo),用于創(chuàng)建項(xiàng)目的jar包。 

      Jelly
      編程
      在每個(gè)目標(biāo)里,由Jelly標(biāo)簽提供功能,讓我們來看看例子里的這些代碼。 

      set
      <j:set var="goals" value="compile,test" />
      這行就是一個(gè)jellycore標(biāo)簽set,它使用了project節(jié)點(diǎn)中定義的前綴 j: 

      set
      標(biāo)簽設(shè)置了一個(gè)由var屬性定義的Jelly變量,值由 value 指定。和Antproerties不一樣,Jelly變量在被賦值后仍可以改變。 

      mkdir
      <mkdir dir="${maven.build.dir}" />
      等同于Ant任務(wù) mkdir, 用于創(chuàng)建目錄,目錄名由變量 ${maven.build.dir}指定。 

      tokenize
      <u:tokenize var="goals" delim=",">${goals}</u:tokenize>
      這行執(zhí)行的是Jelly tokenize 標(biāo)簽。這是Jelly util 標(biāo)簽庫中標(biāo)簽, 這個(gè)標(biāo)簽庫已經(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è)由逗號分隔、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
      標(biāo)簽提供簡單循環(huán)功能,節(jié)點(diǎn)值就是循環(huán)體。 

      items 
      屬性是一個(gè)表達(dá)式,是在循環(huán)過程中需要遍歷的值集合。 
      集合中的值被逐個(gè)取出,存放在var 屬性指定的變量中。你可以在 forEach 循環(huán)體訪問這個(gè)變量。 
      indexVar 
      屬性指定了一個(gè)計(jì)數(shù)器(起始基數(shù)為0)變量,用于在處理 過程中計(jì)數(shù)。 

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

      Maven 
      配置
      屬性的處理機(jī)制
      Maven
      按下面的順序依次讀入properties文件: 


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

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

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

      插件的屬性
      上述屬性文件處理完后,Maven才會開始調(diào)用插件,但是 PluginManager 會禁止插件 覆蓋已經(jīng)設(shè)置的屬性值。這和Maven一般的屬性處理方式是相反的,這是因?yàn)椴寮荒茉?/span>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)匀豢梢栽跇?biāo)準(zhǔn)屬性 文件集的任何一個(gè)文件中覆蓋這個(gè)屬性。所以如果在${project.home}/project.properties 文件定義了如下屬性值: 

      maven.checkstyle.format = turbine
      Checkstyle
      就會使用Turbine的編碼規(guī)范。 

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

      屬性 描述 缺省值 
      maven.build.dest 
      目錄名,存放編譯生成的類  ${maven.build.dir}/classes 
      maven.build.dir 
      存放構(gòu)建結(jié)果的目錄,如類文件,文檔,單元測試報(bào)告等等。 
      注意: ${user.home}/build.properties文件中改變maven.build.dir 的缺省值或許會得到一個(gè) 較為個(gè)性化的目錄布局。但是,這會干擾Maven由從源碼開始的編譯工作,因?yàn)樗僭O(shè)jar 會被創(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聲明頭,如: 
      <?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
      用于寫入用戶信息的本機(jī)目錄,如解開插件包、緩沖數(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 
      在進(jìn)行dist:deploy處理的時(shí)候,發(fā)行包所要部署的目標(biāo)機(jī)器  login. 
      maven.repo.central.directory 
      在進(jìn)行dist:deploy處理的時(shí)候,發(fā)行包所要部署的目標(biāo)目錄。  /public/html/maven 
      maven.repo.local 
      本機(jī)repository,用于存儲下載的jar包。  ${maven.home.local}/repository 
      maven.repo.remote 
      遠(yuǎn)程repository,如果本機(jī)repository沒有的jar包,maven會從這里下載。   http://www./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 


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

      代理屬性 描述 
      maven.proxy.host 
      代理的IP地址  
      maven.proxy.port 
      代理端口  
      maven.proxy.username 
      如果代理需要認(rèn)證的話,在這里填寫用戶名。 User name if your proxy requires authentication.  
      maven.proxy.password 
      如果代理需要認(rèn)證的話,在這里填寫密碼。  

      如果你實(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./maven /, http://www./maven/
      項(xiàng)目設(shè)置
      開始一個(gè)新項(xiàng)目
      如果你是第一次使用Maven,或者開始一個(gè)新的項(xiàng)目,你可以使用GenApp來自動創(chuàng)建Maven項(xiàng)目樹。 

      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í)行完畢,即生成下面的完整項(xiàng)目目錄樹: 

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

      構(gòu)建生命周期

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

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

      為了使用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依賴
      Maven中,SNAPSHOP是某個(gè)特定項(xiàng)目的最新構(gòu)建的jar包。如果你的項(xiàng)目依賴于另一個(gè)頻繁變更 的項(xiàng)目,你可以在你的POM中聲明SNAPSHOP依賴,以保持與那個(gè)項(xiàng)目的同步。例如,在你的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依賴 總會導(dǎo)致依賴失敗。在這種情況下,Maven就會去Maven repository取得一個(gè)SNAPSHOT 依賴包的拷貝。如果你正在離線工作,Maven就會發(fā)出警告:“SNAPSHO依賴包可能已經(jīng) 過期。 

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

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

      目前 db. 站點(diǎn)就是收集了其子項(xiàng)目的 豐富信息、并與一系列的Velocity 模板合成的。這一過程是由 Jelly Velocity 標(biāo)簽庫來完成的。 這里是其中的機(jī)制,有興趣可以看看。 

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

      這里是一個(gè)使用Reactor標(biāo)簽,遍歷一系列組件,最后產(chǎn)生項(xiàng)目站點(diǎ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個(gè)項(xiàng)目的文檔,形成一個(gè)統(tǒng)一的視圖,你可以參考 db.站點(diǎn),它從所有的子項(xiàng)目中收集 信息,最終形成一個(gè)有導(dǎo)航條,郵件列表,開發(fā)者列表和源碼repository統(tǒng)一的站點(diǎn)。這解決 了在收集子項(xiàng)目信息過程中的冗余、易于產(chǎn)生錯(cuò)誤的問題。db.的子項(xiàng)目只需關(guān)注 自身的信息,卻可以自動的集成到高層的項(xiàng)目站點(diǎn)中。 

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

      maven -o jar:jar
              
      這等同于: 

      maven -Dmaven.mode.online=false jar:jar
              
      或者你可以在屬性文件中設(shè)置 maven.mode.online 屬性為false。 

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

      maven.repo.remote.enabled=false
              
      maven beta 9版本中,這個(gè)屬性并沒有起作用(新版本已經(jīng)解決了這個(gè)問題)??梢赃@樣來清空 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)介紹
      如果你用命令行來構(gòu)建,這里提供了一個(gè)關(guān)于命令行選項(xiàng)的快速參考。 

      Options:
       -D,--define arg   
      定義一個(gè)系統(tǒng)屬性
       -E,--emacs        
      輸出簡潔的日志信息
       -X,--debug        
      輸出debug信息
       -b,--nobanner     
      禁止 logo banner
       -d,--dir arg      
      設(shè)置指定的工作目錄
       -e,--exception    
      輸出異常堆棧信息
       -f,--find arg     
      通過搜尋項(xiàng)目文件來確定執(zhí)行的項(xiàng)目文件及其工作目錄
       -g,--goals        
      顯示可用的目標(biāo)
       -h,--help         
      顯示幫助信息
       -i,--info         
      顯示系統(tǒng)信息
       -o,--offline      
      離線構(gòu)建
       -p,--pom arg      
      指定項(xiàng)目文件
       -v,--version      
      顯示版本號
      測試
      測試資源
      通常情況下,你需要在測試類路徑上為測試指定某些資源。你可以在POM中使用 

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

      <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為擴(kuò)展名 的文件,但naughty.properties文件除外。請注意增加的project/build/unitTest/resources/excludes 節(jié)點(diǎn): 

        <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>
      運(yùn)行一個(gè)單獨(dú)的測試
      下面的命令運(yùn)行了一個(gè)單獨(dú)的測試: 

      maven -Dtestcase=org.foo.bar.MyTest test:single-test
      打包
      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>
      部署

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

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

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

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

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

      <project
        xmlns:deploy="deploy">

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

      </project>
      deploy:copy-deps標(biāo)簽?zāi)憔涂梢院唵蔚陌秧?xiàng)目所有的依賴包拷貝到任何 目錄,如果希望排除某個(gè)依賴包,需要給出一個(gè)依賴包的id列表,列表中依賴包就不會被拷貝。 

      <project
        xmlns:deploy="deploy">

        <goal name="deploy-my-project">
          ...
          <deploy:copy-deps todir="/path" excludes="servletapi,commons-util"/>
          ...
        </goal>
      </project>
      命名約定
      這部分將簡要的描述項(xiàng)目對象模型(POM)中命名約定。本篇文檔希望可以統(tǒng)一各式各樣jar包命名 方法,這些jar包一般為java開發(fā)者社區(qū)廣泛使用。 

      規(guī)則和指南
      項(xiàng)目
      一個(gè)項(xiàng)目必須由一個(gè)唯一的的標(biāo)識,標(biāo)識由a-z小寫字母和連線號構(gòu)成,其首字母必須以小寫字母 開頭。 

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

      項(xiàng)目的名稱應(yīng)該易于閱讀,可用于文檔。 

      <project>
        <groupId>bar</groupId>
        <artifactId>foo</artifactId>
        <name>The Grand Master Foo</name>
        ...
      </project>
      項(xiàng)目應(yīng)該有一個(gè)組標(biāo)識,組標(biāo)識是名稱的基礎(chǔ)部分。 

      <project>
        <groupId>bar</groupId>
        <artifactId>foo</artifactId>
        <name>The Grand Master Foo</name>
        ...
      </project>
      所有項(xiàng)目發(fā)布的包都應(yīng)基于項(xiàng)目唯一的標(biāo)識,并且放在基于項(xiàng)目的組id的目錄中。對于上面的 項(xiàng)目來說,假定發(fā)布的包是jar類型的包,我們就會有如下目錄結(jié)構(gòu): 

      repository
       |
       +-- bar
           |-- distribution
           `-- jar
               |-- foo-1.0.jar
               `-- foo-2.0.jar
      依賴
      一個(gè)理想的典型依賴聲明的例子可能會象這樣: 

      <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項(xiàng)目 屬于org.foo.bar組。這個(gè)依賴會被解析為本地repositoryjar文件。上面 的情形假定發(fā)布的包是基于包id命名的。因此對于上述依賴,Maven就會采用 foo-1.0.jar作為jar名。 

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


      發(fā)布的jar包的并未使用項(xiàng)目作為基礎(chǔ)名,如xercesImpl就是所有發(fā)布的jar包的基礎(chǔ)名 它與gump idmaven中的id都不一樣。 
      發(fā)布的jar包沒有使用任何版本聲明,如許多commons組件并沒有把版本號作為包名的一部分。 
      有些項(xiàng)目即沒有使用項(xiàng)目id作為基礎(chǔ)名也沒有版本聲明。例如,最壞的情形是Java Activation Framework jar包,它沒有遵循其他Sun的命名規(guī)則,也沒有在jar包中聲明 版本號,甚至在manifest中都沒有任何版本信息。 

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

      發(fā)布多個(gè)包的項(xiàng)目
      Maven
      的依賴機(jī)制完全支持任何形式的多項(xiàng)目包。 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)實(shí)際上是指向?qū)儆谕唤M的單個(gè)包的指針,這就是說,一個(gè)單獨(dú)的依賴就是對某個(gè)組中的某個(gè) 包的引用。目前artifact如果沒有特別說明的話,一般指的是jar包。但是依賴也可能是一個(gè)war文件或一個(gè) 發(fā)行包。我們試圖在提供多數(shù)情況下(構(gòu)建大多需要jar)使用的缺省方式的同時(shí),也顧及靈活性。 

      遠(yuǎn)程Repository布局
      這部分文檔將對Maven的遠(yuǎn)程repositories做一個(gè)概要的說明。目前,主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,目前最為廣泛使用的兩種類型是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)更加隨意一些?,F(xiàn)在我只使用 了一個(gè)類來實(shí)現(xiàn),顯得有些臃腫。我還是認(rèn)為本地和遠(yuǎn)程repositories應(yīng)保持相同的結(jié)構(gòu) 但是為了使用更樂于使用,我開始設(shè)計(jì)一些接口,用于滿足用戶自己安排自己本地Repository 布局,相似的遠(yuǎn)程Repositor也在設(shè)計(jì)中。盡管目前本地repository仍與遠(yuǎn)程repository 完全一致,我希望聽到更多的用戶反饋,以促進(jìn)這些接口的開發(fā),或者完全拋棄它。 

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

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

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

      報(bào)告
      最后,如果你希望定制哪些報(bào)告需要自動產(chǎn)生,你需要在你的項(xiàng)目描述中包含 reports 標(biāo)簽庫。 到目前為止,如果沒有reports標(biāo)簽指定,所有插件報(bào)告都會產(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)寫一個(gè)前置目標(biāo)(postGoal)。 

      <postGoal name="xdoc:register-reports">
        <attainGoal name="maven-changelog-plugin:deregister"/>  
        <attainGoal name="maven-myown-plugin:register"/>  
      </postGoal>
              
      排除所有Maven產(chǎn)生的內(nèi)容
      某些情況下,用戶需要構(gòu)建只有文檔的站點(diǎn),或是構(gòu)建聚合許多子項(xiàng)目的站點(diǎn),但不希望 在站點(diǎn)上有個(gè)整體項(xiàng)目文檔導(dǎo)航條。設(shè)置 maven.xdoc.includeProjectDocumentation屬性值為no 即可解決這一問題。缺省的,Maven會包含項(xiàng)目文檔導(dǎo)航條,下面掛的是許多Maven 生成的報(bào)告。

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多