Maven用戶指南(3)

多項目構建和Reactor
在Maven中,Reactor是一個用於控制多項目構建的工具。Reactor用Werkz包,並根據每個項目 各自定義的依賴關係來安排構建順序。Reactor的意圖在於:鼓勵創建/重構具有更小、更鬆散、 更有一致性單元的項目。r源於面向組件編程,在向組件編程中,整個系統由許多鬆散的個體 構成,這些個體需要聚合起來作爲一個整體進行部署。

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

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

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

這裏是一個使用Reactor標籤,遍歷一系列組件,最後產生項目站點的例子:

  <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個項目的文檔,形成一個統一的視圖,你可以參考 db.apache.org站點,它從所有的子項目中收集 信息,最終形成一個有導航條,郵件列表,開發者列表和源碼repository統一的站點。這解決 了在收集子項目信息過程中的冗餘、易於產生錯誤的問題。db.apache.org的子項目只需關注 自身的信息,卻可以自動的集成到高層的項目站點中。

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

maven -o jar:jar
        這等同於:

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

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

maven.repo.remote.enabled=false
        在maven beta 9版本中,這個屬性並沒有起作用(新版本已經解決了這個問題)。可以這樣來清空 maven.repo.remote 屬性:

maven.repo.remote.enabled=
        在命令行或屬性文件中設置都一樣。

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

命令行選項介紹
如果你用命令行來構建,這裏提供了一個關於命令行選項的快速參考。

Options:
-D,--define arg   定義一個系統屬性
-E,--emacs        輸出簡潔的日誌信息
-X,--debug        輸出debug信息
-b,--nobanner     禁止 logo banner
-d,--dir arg      設置指定的工作目錄
-e,--exception    輸出異常堆棧信息
-f,--find arg     通過搜尋項目文件來確定執行的項目文件及其工作目錄
-g,--goals        顯示可用的目標
-h,--help         顯示幫助信息
-i,--info         顯示系統信息
-o,--offline      離線構建
-p,--pom arg      指定項目文件
-v,--version      顯示版本號

測試
測試資源
通常情況下,你需要在測試類路徑上爲測試指定某些資源。你可以在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 節點:

  <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>
運行一個單獨的測試
下面的命令運行了一個單獨的測試:

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依賴
在開發時使用SNAPSHOT依賴包非常方便,但是在部署的時候,你需要把所有的SNAPSHOT依賴包 固定下來,以便發佈一個包含固定jar的版本。如果你發佈了一個含SNAPSHOT依賴包的項目,而 這些SNAPSHOT在項目發佈後發生了變更,你可能很快就會發現這個版本沒法兒工作。

當SNAPSHOT以時間戳爲版本號部署到Maven上時,Maven可以識別foo-SNAPSHOT.jar實際上相當 於foo-20030101.010101.jar。當部署的時刻來臨,你可以用下面的命令,讓Maven把SNAPSHOT 版本號變爲時間戳版本號。

maven convert-snapshots
Maven會提供交互的方式讓你選擇哪個SNAPSHOPT依賴包應該固化下來。這一過程結束後,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標籤你就可以簡單的把項目所有的依賴包拷貝到任何 目錄,如果希望排除某個依賴包,需要給出一個依賴包的id列表,列表中依賴包就不會被拷貝。

<project
  xmlns:deploy="deploy">

  <goal name="deploy-my-project">
    ...
    <deploy:copy-deps todir="/path" excludes="servletapi,commons-util"/>
    ...
  </goal>
</project> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章