Maven小結

站在巨人的肩膀上

Maven Offical

Maven Guide


安裝&配置

Maven3

windows

  • 添加M2_HOME,環境變量
  • 修改PATH,添加%M2_HOME%\bin
  • 驗證,cmd運行mvn –version

Linux

  • vim ~/.bashrc
  • 文末添加M2_HOME=”maven路徑”,path=M2HOME/bin: path
  • resource ~/.bashrc
  • Termial 運行mvn –version

Maven Lifecycle

Clean Lifecycle

  • pre-clean
  • clean
  • post-clean

Default Lifecycle

  • validate
Validates whether project is correct and all necessary information is available to complete the build process.
  • initialize
Initializes build state, for example set properties
  • generate-sources
Generate any source code to be included in compilation phase
  • process-sources
Process the source code, for example, filter any value
  • generate-resources
  • process-resources
Copy and process the resources into the destination directory, ready for packaging phase
  • compile
  • process-classes
Post-process the generated files from compilation, for example to do bytecode enhancement/optimization on Java classes
  • generate-test-sources
Generate any test source code to be included in compilation phase
  • process-test-sources
Process the test source code, for example, filter any values.
  • process-test-resources
  • test-compile
Compile the test source code into the test destination directory
  • process-test-classes
Process the generated files from test code file compilation.
  • test
Run tests using a suitable unit testing framework(Junit is one)
  • prepare-package
Perform any operations necessary to prepare a package before the actual packaging.
  • package
Take the compiled code and package it in its distributable format, such as a JAR, WAR, or EAR file.
  • pre-integration-test
Perform actions required before integration tests are executed. For example, setting up the required environment.
  • integration-test
Process and deploy the package if necessary into an environment where integration tests can be run
  • post-integration-test
Perform actions required after integration tests have been executed. For example, cleaning up the environment.
  • verify
Run any check-ups to verify the package is valid and meets quality criterias
  • install
Install the package into the local repository, which can be used as a dependency in other projects locally.
  • deploy
Copies the final package to the remote repository for sharing with other developers and projects

Site Lifecycle

Maven的網站插件通常用於創建新的文檔,創建報告,部署網站等
- pre-site
- site
- post-site
- site-deploy


Maven Dependency

依賴的傳遞性

當項目A依賴於B,而B又依賴於C的時候,自然的A會依賴於C,這樣Maven在建立項目A的時候,會自動加載對C的依賴。

依賴傳遞對版本的選擇

假設A依賴於B和C,然後B依賴於D,D又依賴於E1.0,C直接依賴於E2.0,那麼這個時候A依賴的是E1.0還是E2.0,還是這兩個都依賴呢?兩個都依賴是肯定不行的,因爲它們可能會有衝突的地方。這個時候就涉及到Maven中依賴傳遞對版本的選擇問題。依賴傳遞在選擇版本的時候首先是根據深度選擇的。當一個項目同時經過不同的路徑依賴於同一個組件時,會選擇其深度最短的對應組件進行依賴。舉例來說,假設A->B->C->D1.0,A->E->D2.0,那麼這個時候A就會選擇對D相對路徑短的組件來進行依賴,也就是D2.0。那麼當深度一樣的時候Maven會如何選擇呢?即A->B->D1.0和A->C->D2.0,這個時候Maven會如何選擇A所依賴的D的版本呢?這種情況Maven會根據申明的依賴順序來進行選擇,先申明的會被作爲依賴包。向前面這種情況,如果先申明對B的依賴,則A依賴的就是D1.0,如果先申明對C的依賴,則A依賴的就是D2.0。

使用exclusion排除依賴

假設有這樣一種依賴關係,A->B->C,這個時候由於某些原因,我們不需要對C的依賴,但是我們又必須要對B的依賴,這個時候該怎麼辦呢?針對這種情況,Maven給我們提供了一個exclusion功能,我們可以在添加A對B的依賴時申明不需要引進B對C的依賴。

可選的依賴項

可選的依賴項表示可有可無,不一定需要的,它只是做一個標記。爲了便於大家理解,我們先看這樣一種情況,假設項目B依賴於項目C,這個時候我們把B對C的依賴利用optional標記爲可選的,它意味着B中只有部分地方用到了C,並不是必須要的,當你依賴於B,但是又不需要使用到B的C功能時,可以不依賴於C。這樣當A->B->C時,在建立項目A的時候將不會加入對C的依賴,因爲C對B是可選的,我們不一定會用到C。但是在建立項目B的時候,Maven就會加入對C的依賴。也就是說這種標記爲optional的依賴項對項目本身而言是沒有什麼影響的,它影響的是以該項目作爲依賴項的其他項目,如這裏的項目A。這種可選的依賴項有一個好處就是它會默認的作爲exclusion項排除。

依賴的作用域

在定義項目的依賴項的時候,我們可以通過scope來指定該依賴項的作用範圍。scope的取值有compile、runtime、test、provided、system和import。
compile:這是依賴項的默認作用範圍,即當沒有指定依賴項的scope時默認使用compile。compile範圍內的依賴項在所有情況下都是有效的,包括運行、測試和編譯時。
runtime:表示該依賴項只有在運行時纔是需要的,在編譯的時候不需要。這種類型的依賴項將在運行和test的類路徑下可以訪問。
test:表示該依賴項只對測試時有用,包括測試代碼的編譯和運行,對於正常的項目運行是沒有影響的。
provided:表示該依賴項將由JDK或者運行容器在運行時提供,也就是說由Maven提供的該依賴項我們只有在編譯和測試時纔會用到,而在運行時將由JDK或者運行容器提供。
system:當scope爲system時,表示該依賴項是我們自己提供的,不需要Maven到倉庫裏面去找。指定scope爲system需要與另一個屬性元素systemPath一起使用,它表示該依賴項在當前系統的位置,使用的是絕對路徑。


Maven Repository

  <repository>
      <releases>
          <enabled/>
          <updatePolicy/>
          <checksumPolicy/>
      </releases>
      <snapshots>
          <enabled/>
          <updatePolicy/>
          <checksumPolicy/>
      </snapshots>
      <id/>
      <name/>
      <url/>
      <layout/>
  </repository>

release和snapshots:是artifact的兩種policies,pom可以選擇那種政策有效。
enable:指定兩種類型是否可用,true or false
updatePolicy:說明更新發生的頻率always 或者 never 或者 daily(默認的)或者 interval:X(X是分鐘數)

checksumPolicy:當Maven的部署文件到倉庫中,它也部署了相應的校驗和文件。您可以選擇忽略,失敗,或缺少或不正確的校驗和警告。

layout:maven1.x與maven2有不同的layout,所以可以聲明爲default或者是legacy(遺留方式maven1.x)。


Maven Plugin

Maven本質上是一個插件框架,它的核心並不執行任何具體的構建任務,所有這些任務都交給插件來完成,例如編譯源代碼是由maven-compiler-plugin完成的。進一步說,每個任務對應了一個插件目標(goal),每個插件會有一個或者多個目標,例如maven-compiler-plugin的compile目標用來編譯位於src/main/java/目錄下的主源碼,testCompile目標用來編譯位於src/test/java/目錄下的測試源碼。

命令mvn compile實際上是先定位到compile這一生命週期階段,然後再根據綁定關係調用maven-compiler-plugin的compile目標。第二種方式是直接在命令行指定要執行的插件目標,例如mvn archetype:generate 就表示調用maven-archetype-plugin的generate目標,這種帶冒號的調用方式與生命週期無關。


Pom begin

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
</project>

注1:命名空間等信息可以不寫,最好寫,IDE會根據命名空間指定的約束,模板信息驗證書寫的pom文件的合法性,和智能補全功能。

注2:modelVersion 描述這個POM文件是遵從哪個版本的項目描述符。maven2,maven3都是4.0.0


Maven profile

profile可以讓我們定義一系列的配置信息,然後指定其激活條件。這樣我們就可以定義多個profile,然後每個profile對應不同的激活條件和配置信息,從而達到不同環境使用不同配置信息的效果。


Maven Run

Run special java main

mvn exec:java -Dexec.mainClass="com.vineetmanohar.module.Main" -Dexec.args="arg0 arg1 arg2"

Run Special Test Method

mvn -Dtest=TestCircle#xyz test

TestCircle is class name ,xyz is method
For integration tests use it.test=… option instead of test=…:


Maven convert to eclipse and IDEA

  • 生成eclipse項目:mvn eclipse:eclipse
  • 生成idea項目:mvn idea:idea

Pom詳解

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd ">
    <!-- 聲明項目描述符遵循哪一個POM模型版本。模型本身的版本很少改變,雖然如此,但它仍然是必不可少的,這是爲了當Maven引入了新的特性或者其他模型變更的時候,確保穩定性。 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 父項目的座標。如果項目中沒有規定某個元素的值,那麼父項目中的對應值即爲項目的默認值。 座標包括group ID,artifact ID和 version。 -->
    <parent>
        <!-- 被繼承的父項目的全球唯一標識符 -->
        <groupId/>
        <!-- 被繼承的父項目的構件標識符 -->
        <artifactId/>
        <!-- 被繼承的父項目的版本 -->
        <version/>
        <!-- 父項目的pom.xml文件的相對路徑。相對路徑允許你選擇一個不同的路徑。默認值是../pom.xml。Maven首先在構建當前項目的地方尋找父項目的pom,其次在文件系統的這個位置(relativePath位置),然後在本地倉庫,最後在遠程倉庫尋找父項目的pom。 -->
        <relativePath/>
    </parent>

    <!-- 項目的全球唯一標識符,通常使用全限定的包名區分該項目和其他項目。並且構建時生成的路徑也是由此生成, 如com.mycompany.app生成的相對路徑爲:/com/mycompany/app -->
    <groupId>asia.banseon</groupId>
    <!-- 構件的標識符,它和group ID一起唯一標識一個構件。換句話說,你不能有兩個不同的項目擁有同樣的artifact ID和groupID;在某個特定的group ID下,artifact ID也必須是唯一的。構件是項目產生的或使用的一個東西,Maven爲項目產生的構件包括:JARs,源碼,二進制發佈和WARs等。 -->
    <artifactId>banseon-maven2</artifactId>
    <!-- 項目產生的構件類型,例如jar、war、ear、pom。插件可以創建他們自己的構件類型,所以前面列的不是全部構件類型 -->
    <packaging>jar</packaging>
    <!-- 項目當前版本,格式爲:主版本.次版本.增量版本-限定版本號 -->
    <version>1.0-SNAPSHOT</version>
    <!-- 項目的名稱, Maven產生的文檔用 -->
    <name>banseon-maven</name>
    <!-- 項目主頁的URL, Maven產生的文檔用 -->
    <url>http://www.baidu.com/banseon</url>
    <!-- 項目的詳細描述, Maven 產生的文檔用。 當這個元素能夠用HTML格式描述時(例如,CDATA中的文本會被解析器忽略,就可以包含HTML標籤), 不鼓勵使用純文本描述。如果你需要修改產生的web站點的索引頁面,你應該修改你自己的索引頁文件,而不是調整這裏的文檔。 -->
    <description>A maven project to study maven.</description>

    <!-- 描述了這個項目構建環境中的前提條件。 -->
    <prerequisites>
        <!-- 構建該項目或使用該插件所需要的Maven的最低版本 -->
        <maven>2.0</maven>
    </prerequisites>

    <!-- 項目的問題管理系統(Bugzilla, Jira, Scarab,或任何你喜歡的問題管理系統)的名稱和URL,本例爲 jira -->
    <issueManagement>
        <!-- 問題管理系統(例如jira)的名字, -->
        <system>jira</system>
        <!-- 該項目使用的問題管理系統的URL -->
        <url>http://jira.baidu.com/banseon</url>
    </issueManagement>

    <!-- 項目持續集成信息 -->
    <ciManagement>
        <!-- 持續集成系統的名字,例如continuum -->
        <system/>
        <!-- 該項目使用的持續集成系統的URL(如果持續集成系統有web接口的話)。 -->
        <url/>
        <!-- 構建完成時,需要通知的開發者/用戶的配置項。包括被通知者信息和通知條件(錯誤,失敗,成功,警告) -->
        <notifiers>
            <!-- 配置一種方式,當構建中斷時,以該方式通知用戶/開發者 -->
            <notifier>
                <!-- 傳送通知的途徑 -->
                <type/>
                <!-- 發生錯誤時是否通知 -->
                <sendOnError/>
                <!-- 構建失敗時是否通知 -->
                <sendOnFailure/>
                <!-- 構建成功時是否通知 -->
                <sendOnSuccess/>
                <!-- 發生警告時是否通知 -->
                <sendOnWarning/>
                <!-- 不贊成使用。通知發送到哪裏 -->
                <address/>
                <!-- 擴展配置項 -->
                <configuration/>
            </notifier>
        </notifiers>
    </ciManagement>

    <!-- 項目創建年份,4位數字。當產生版權信息時需要使用這個值。 -->
    <inceptionYear/>

    <!-- 項目相關郵件列表信息 -->
    <mailingLists>
        <!-- 該元素描述了項目相關的所有郵件列表。自動產生的網站引用這些信息。 -->
        <mailingList>
            <!-- 郵件的名稱 -->
            <name>Demo</name>
            <!-- 發送郵件的地址或鏈接,如果是郵件地址,創建文檔時,mailto: 鏈接會被自動創建 -->
            <post>[email protected]</post>
            <!-- 訂閱郵件的地址或鏈接,如果是郵件地址,創建文檔時,mailto: 鏈接會被自動創建 -->
            <subscribe>[email protected]</subscribe>
            <!-- 取消訂閱郵件的地址或鏈接,如果是郵件地址,創建文檔時,mailto: 鏈接會被自動創建 -->
            <unsubscribe>[email protected]</unsubscribe>
            <!-- 你可以瀏覽郵件信息的URL -->
            <archive>http:/hi.baidu.com/banseon/demo/dev/</archive>
        </mailingList>
    </mailingLists>

    <!-- 項目開發者列表 -->
    <developers>
        <!-- 某個項目開發者的信息 -->
        <developer>
            <!-- SCM裏項目開發者的唯一標識符 -->
            <id>HELLO WORLD</id>
            <!-- 項目開發者的全名 -->
            <name>banseon</name>
            <!-- 項目開發者的email -->
            <email>[email protected]</email>
            <!-- 項目開發者的主頁的URL -->
            <url/>
            <!-- 項目開發者在項目中扮演的角色,角色元素描述了各種角色 -->
            <roles>
                <role>Project Manager</role>
                <role>Architect</role>
            </roles>
            <!-- 項目開發者所屬組織 -->
            <organization>demo</organization>
            <!-- 項目開發者所屬組織的URL -->
            <organizationUrl>http://hi.baidu.com/banseon</organizationUrl>
            <!-- 項目開發者屬性,如即時消息如何處理等 -->
            <properties>
                <dept>No</dept>
            </properties>
            <!-- 項目開發者所在時區, -11到12範圍內的整數。 -->
            <timezone>-5</timezone>
        </developer>
    </developers>

    <!-- 項目的其他貢獻者列表 -->
    <contributors>
        <!-- 項目的其他貢獻者。參見developers/developer元素 -->
        <contributor>
            <name/>
            <email/>
            <url/>
            <organization/>
            <organizationUrl/>
            <roles/>
            <timezone/>
            <properties/>
        </contributor>
    </contributors>

    <!-- 該元素描述了項目所有License列表。 應該只列出該項目的license列表,不要列出依賴項目的 license列表。如果列出多個license,用戶可以選擇它們中的一個而不是接受所有license。 -->
    <licenses>
        <!-- 描述了項目的license,用於生成項目的web站點的license頁面,其他一些報表和validation也會用到該元素。 -->
        <license>
            <!-- license用於法律上的名稱 -->
            <name>Apache 2</name>
            <!-- 官方的license正文頁面的URL -->
            <url>http://www.baidu.com/banseon/LICENSE-2.0.txt</url>
            <!-- 項目分發的主要方式:

                        repo,可以從Maven庫下載

                        manual, 用戶必須手動下載和安裝依賴 -->
            <distribution>repo</distribution>
            <!-- 關於license的補充信息 -->
            <comments>A business-friendly OSS license</comments>
        </license>
    </licenses>

    <!-- SCM(Source Control Management)標籤允許你配置你的代碼庫,供Maven web站點和其它插件使用。 -->
    <scm>
        <!-- SCM的URL,該URL描述了版本庫和如何連接到版本庫。欲知詳情,請看SCMs提供的URL格式和列表。該連接只讀。 -->
        <connection>

            scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)

        </connection>
        <!-- 給開發者使用的,類似connection元素。即該連接不僅僅只讀 -->
        <developerConnection>

            scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk

        </developerConnection>
        <!-- 當前代碼的標籤,在開發階段默認爲HEAD -->
        <tag/>
        <!-- 指向項目的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL。 -->
        <url>http://svn.baidu.com/banseon</url>
    </scm>

    <!-- 描述項目所屬組織的各種屬性。Maven產生的文檔用 -->
    <organization>
        <!-- 組織的全名 -->
        <name>demo</name>
        <!-- 組織主頁的URL -->
        <url>http://www.baidu.com/banseon</url>
    </organization>

    <!-- 構建項目需要的信息 -->
    <build>
        <!-- 該元素設置了項目源碼目錄,當構建項目的時候,構建系統會編譯目錄裏的源碼。該路徑是相對於pom.xml的相對路徑。 -->
        <sourceDirectory/>
        <!-- 該元素設置了項目腳本源碼目錄,該目錄和源碼目錄不同:絕大多數情況下,該目錄下的內容 會被拷貝到輸出目錄(因爲腳本是被解釋的,而不是被編譯的)。 -->
        <scriptSourceDirectory/>
        <!-- 該元素設置了項目單元測試使用的源碼目錄,當測試項目的時候,構建系統會編譯目錄裏的源碼。該路徑是相對於pom.xml的相對路徑。 -->
        <testSourceDirectory/>
        <!-- 被編譯過的應用程序class文件存放的目錄。 -->
        <outputDirectory/>
        <!-- 被編譯過的測試class文件存放的目錄。 -->
        <testOutputDirectory/>
        <!-- 使用來自該項目的一系列構建擴展 -->
        <extensions>
            <!-- 描述使用到的構建擴展。 -->
            <extension>
                <!-- 構建擴展的groupId -->
                <groupId/>
                <!-- 構建擴展的artifactId -->
                <artifactId/>
                <!-- 構建擴展的版本 -->
                <version/>
            </extension>
        </extensions>
        <!-- 當項目沒有規定目標(Maven2 叫做階段)時的默認值 -->
        <defaultGoal/>
        <!-- 這個元素描述了項目相關的所有資源路徑列表,例如和項目相關的屬性文件,這些資源被包含在最終的打包文件裏。 -->
        <resources>
            <!-- 這個元素描述了項目相關或測試相關的所有資源路徑 -->
            <resource>
                <!-- 描述了資源的目標路徑。該路徑相對target/classes目錄(例如${project.build.outputDirectory})。舉個例子,如果你想資源在特定的包裏(org.apache.maven.messages),你就必須該元素設置爲org/apache/maven/messages。然而,如果你只是想把資源放到源碼目錄結構裏,就不需要該配置。 -->
                <targetPath/>
                <!-- 是否使用參數值代替參數名。參數值取自properties元素或者文件裏配置的屬性,文件在filters元素裏列出。 -->
                <filtering/>
                <!-- 描述存放資源的目錄,該路徑相對POM路徑 -->
                <directory/>
                <!-- 包含的模式列表,例如**/*.xml. -->
                <includes/>
                <!-- 排除的模式列表,例如**/*.xml -->
                <excludes/>
            </resource>
        </resources>
        <!-- 這個元素描述了單元測試相關的所有資源路徑,例如和單元測試相關的屬性文件。 -->
        <testResources>
            <!-- 這個元素描述了測試相關的所有資源路徑,參見build/resources/resource元素的說明 -->
            <testResource>
                <targetPath/>
                <filtering/>
                <directory/>
                <includes/>
                <excludes/>
            </testResource>
        </testResources>
        <!-- 構建產生的所有文件存放的目錄 -->
        <directory/>
        <!-- 產生的構件的文件名,默認值是${artifactId}-${version}。 -->
        <finalName/>
        <!-- 當filtering開關打開時,使用到的過濾器屬性文件列表 -->
        <filters/>
        <!-- 子項目可以引用的默認插件信息。該插件配置項直到被引用時纔會被解析或綁定到生命週期。給定插件的任何本地配置都會覆蓋這裏的配置 -->
        <pluginManagement>
            <!-- 使用的插件列表 。 -->
            <plugins>
                <!-- plugin元素包含描述插件所需要的信息。 -->
                <plugin>
                    <!-- 插件在倉庫裏的group ID -->
                    <groupId/>
                    <!-- 插件在倉庫裏的artifact ID -->
                    <artifactId/>
                    <!-- 被使用的插件的版本(或版本範圍) -->
                    <version/>
                    <!-- 是否從該插件下載Maven擴展(例如打包和類型處理器),由於性能原因,只有在真需要下載時,該元素才被設置成enabled。 -->
                    <extensions/>
                    <!-- 在構建生命週期中執行一組目標的配置。每個目標可能有不同的配置。 -->
                    <executions>
                        <!-- execution元素包含了插件執行需要的信息 -->
                        <execution>
                            <!-- 執行目標的標識符,用於標識構建過程中的目標,或者匹配繼承過程中需要合併的執行目標 -->
                            <id/>
                            <!-- 綁定了目標的構建生命週期階段,如果省略,目標會被綁定到源數據裏配置的默認階段 -->
                            <phase/>
                            <!-- 配置的執行目標 -->
                            <goals/>
                            <!-- 配置是否被傳播到子POM -->
                            <inherited/>
                            <!-- 作爲DOM對象的配置 -->
                            <configuration/>
                        </execution>
                    </executions>
                    <!-- 項目引入插件所需要的額外依賴 -->
                    <dependencies>
                        <!-- 參見dependencies/dependency元素 -->
                        <dependency></dependency>
                    </dependencies>
                    <!-- 任何配置是否被傳播到子項目 -->
                    <inherited/>
                    <!-- 作爲DOM對象的配置 -->
                    <configuration/>
                </plugin>
            </plugins>
        </pluginManagement>
        <!-- 使用的插件列表 -->
        <plugins>
            <!-- 參見build/pluginManagement/plugins/plugin元素 -->
            <plugin>
                <groupId/>
                <artifactId/>
                <version/>
                <extensions/>
                <executions>
                    <execution>
                        <id/>
                        <phase/>
                        <goals/>
                        <inherited/>
                        <configuration/>
                    </execution>
                </executions>
                <dependencies>
                    <!-- 參見dependencies/dependency元素 -->
                    <dependency></dependency>
                </dependencies>
                <goals/>
                <inherited/>
                <configuration/>
            </plugin>
        </plugins>
    </build>

    <!-- 在列的項目構建profile,如果被激活,會修改構建處理 -->
    <profiles>
        <!-- 根據環境參數或命令行參數激活某個構建處理 -->
        <profile>
            <!-- 構建配置的唯一標識符。即用於命令行激活,也用於在繼承時合併具有相同標識符的profile。 -->
            <id/>
            <!-- 自動觸發profile的條件邏輯。Activation是profile的開啓鑰匙。profile的力量來自於它

                        能夠在某些特定的環境中自動使用某些特定的值;這些環境通過activation元素指定。activation元素並不是激活profile的唯一方式。 -->
            <activation>
                <!-- profile默認是否激活的標誌 -->
                <activeByDefault/>
                <!-- 當匹配的jdk被檢測到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4開頭的JDK。 -->
                <jdk/>
                <!-- 當匹配的操作系統屬性被檢測到,profile被激活。os元素可以定義一些操作系統相關的屬性。 -->
                <os>
                    <!-- 激活profile的操作系統的名字 -->
                    <name>Windows XP</name>
                    <!-- 激活profile的操作系統所屬家族(如 'windows') -->
                    <family>Windows</family>
                    <!-- 激活profile的操作系統體系結構 -->
                    <arch>x86</arch>
                    <!-- 激活profile的操作系統版本 -->
                    <version>5.1.2600</version>
                </os>
                <!-- 如果Maven檢測到某一個屬性(其值可以在POM中通過${名稱}引用),其擁有對應的名稱和值,Profile就會被激活。如果值

                                字段是空的,那麼存在屬性名稱字段就會激活profile,否則按區分大小寫方式匹配屬性值字段 -->
                <property>
                    <!-- 激活profile的屬性的名稱 -->
                    <name>mavenVersion</name>
                    <!-- 激活profile的屬性的值 -->
                    <value>2.0.3</value>
                </property>
                <!-- 提供一個文件名,通過檢測該文件的存在或不存在來激活profile。missing檢查文件是否存在,如果不存在則激活

                                profile。另一方面,exists則會檢查文件是否存在,如果存在則激活profile。 -->
                <file>
                    <!-- 如果指定的文件存在,則激活profile。 -->
                    <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
                    </exists>
                    <!-- 如果指定的文件不存在,則激活profile。 -->
                    <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
                </file>
            </activation>
            <!-- 構建項目所需要的信息。參見build元素 -->
            <build>
                <defaultGoal/>
                <resources>
                    <resource>
                        <targetPath/>
                        <filtering/>
                        <directory/>
                        <includes/>
                        <excludes/>
                    </resource>
                </resources>
                <testResources>
                    <testResource>
                        <targetPath/>
                        <filtering/>
                        <directory/>
                        <includes/>
                        <excludes/>
                    </testResource>
                </testResources>
                <directory/>
                <finalName/>
                <filters/>
                <pluginManagement>
                    <plugins>
                        <!-- 參見build/pluginManagement/plugins/plugin元素 -->
                        <plugin>
                            <groupId/>
                            <artifactId/>
                            <version/>
                            <extensions/>
                            <executions>
                                <execution>
                                    <id/>
                                    <phase/>
                                    <goals/>
                                    <inherited/>
                                    <configuration/>
                                </execution>
                            </executions>
                            <dependencies>
                                <!-- 參見dependencies/dependency元素 -->
                                <dependency></dependency>
                            </dependencies>
                            <goals/>
                            <inherited/>
                            <configuration/>
                        </plugin>
                    </plugins>
                </pluginManagement>
                <plugins>
                    <!-- 參見build/pluginManagement/plugins/plugin元素 -->
                    <plugin>
                        <groupId/>
                        <artifactId/>
                        <version/>
                        <extensions/>
                        <executions>
                            <execution>
                                <id/>
                                <phase/>
                                <goals/>
                                <inherited/>
                                <configuration/>
                            </execution>
                        </executions>
                        <dependencies>
                            <!-- 參見dependencies/dependency元素 -->
                            <dependency></dependency>
                        </dependencies>
                        <goals/>
                        <inherited/>
                        <configuration/>
                    </plugin>
                </plugins>
            </build>
            <!-- 模塊(有時稱作子項目) 被構建成項目的一部分。列出的每個模塊元素是指向該模塊的目錄的相對路徑 -->
            <modules/>
            <!-- 發現依賴和擴展的遠程倉庫列表。 -->
            <repositories>
                <!-- 參見repositories/repository元素 -->
                <repository>
                    <releases>
                        <enabled/>
                        <updatePolicy/>
                        <checksumPolicy/>
                    </releases>
                    <snapshots>
                        <enabled/>
                        <updatePolicy/>
                        <checksumPolicy/>
                    </snapshots>
                    <id/>
                    <name/>
                    <url/>
                    <layout/>
                </repository>
            </repositories>
            <!-- 發現插件的遠程倉庫列表,這些插件用於構建和報表 -->
            <pluginRepositories>
                <!-- 包含需要連接到遠程插件倉庫的信息.參見repositories/repository元素 -->
                <pluginRepository>
                    <releases>
                        <enabled/>
                        <updatePolicy/>
                        <checksumPolicy/>
                    </releases>
                    <snapshots>
                        <enabled/>
                        <updatePolicy/>
                        <checksumPolicy/>
                    </snapshots>
                    <id/>
                    <name/>
                    <url/>
                    <layout/>
                </pluginRepository>
            </pluginRepositories>
            <!-- 該元素描述了項目相關的所有依賴。 這些依賴組成了項目構建過程中的一個個環節。它們自動從項目定義的倉庫中下載。要獲取更多信息,請看項目依賴機制。 -->
            <dependencies>
                <!-- 參見dependencies/dependency元素 -->
                <dependency></dependency>
            </dependencies>
            <!-- 不贊成使用. 現在Maven忽略該元素. -->
            <reports/>
            <!-- 該元素包括使用報表插件產生報表的規範。當用戶執行“mvn site”,這些報表就會運行。 在頁面導航欄能看到所有報表的鏈接。參見reporting元素 -->
            <reporting></reporting>
            <!-- 參見dependencyManagement元素 -->
            <dependencyManagement>
                <dependencies>
                    <!-- 參見dependencies/dependency元素 -->
                    <dependency></dependency>
                </dependencies>
            </dependencyManagement>
            <!-- 參見distributionManagement元素 -->
            <distributionManagement></distributionManagement>
            <!-- 參見properties元素 -->
            <properties/>
        </profile>
    </profiles>

    <!-- 模塊(有時稱作子項目) 被構建成項目的一部分。列出的每個模塊元素是指向該模塊的目錄的相對路徑 -->
    <modules/>

    <!-- 發現依賴和擴展的遠程倉庫列表。 -->
    <repositories>
        <!-- 包含需要連接到遠程倉庫的信息 -->
        <repository>
            <!-- 如何處理遠程倉庫裏發佈版本的下載 -->
            <releases>
                <!-- true或者false表示該倉庫是否爲下載某種類型構件(發佈版,快照版)開啓。 -->
                <enabled/>
                <!-- 該元素指定更新發生的頻率。Maven會比較本地POM和遠程POM的時間戳。這裏的選項是:always(一直),daily(默認,每日),interval:X(這裏X是以分鐘爲單位的時間間隔),或者never(從不)。 -->
                <updatePolicy/>
                <!-- 當Maven驗證構件校驗文件失敗時該怎麼做:ignore(忽略),fail(失敗),或者warn(警告)。 -->
                <checksumPolicy/>
            </releases>
            <!-- 如何處理遠程倉庫裏快照版本的下載。有了releases和snapshots這兩組配置,POM就可以在每個單獨的倉庫中,爲每種類型的構件採取不同的策略。例如,可能有人會決定只爲開發目的開啓對快照版本下載的支持。參見repositories/repository/releases元素 -->
            <snapshots>
                <enabled/>
                <updatePolicy/>
                <checksumPolicy/>
            </snapshots>
            <!-- 遠程倉庫唯一標識符。可以用來匹配在settings.xml文件裏配置的遠程倉庫 -->
            <id>banseon-repository-proxy</id>
            <!-- 遠程倉庫名稱 -->
            <name>banseon-repository-proxy</name>
            <!-- 遠程倉庫URL,按protocol://hostname/path形式 -->
            <url>http://192.168.1.169:9999/repository/
            </url>
            <!-- 用於定位和排序構件的倉庫佈局類型-可以是default(默認)或者legacy(遺留)。Maven 2爲其倉庫提供了一個默認的佈局;然而,Maven 1.x有一種不同的佈局。我們可以使用該元素指定佈局是default(默認)還是legacy(遺留)。 -->
            <layout>default</layout>
        </repository>
    </repositories>

    <!-- 發現插件的遠程倉庫列表,這些插件用於構建和報表 -->
    <pluginRepositories>
        <!-- 包含需要連接到遠程插件倉庫的信息.參見repositories/repository元素 -->
        <pluginRepository></pluginRepository>
    </pluginRepositories>

    <!-- 該元素描述了項目相關的所有依賴。 這些依賴組成了項目構建過程中的一個個環節。它們自動從項目定義的倉庫中下載。要獲取更多信息,請看項目依賴機制。 -->
    <dependencies>
        <dependency>
            <!-- 依賴的group ID -->
            <groupId>org.apache.maven</groupId>
            <!-- 依賴的artifact ID -->
            <artifactId>maven-artifact</artifactId>
            <!-- 依賴的版本號。 在Maven 2裏, 也可以配置成版本號的範圍。 -->
            <version>3.8.1
            </version>
            <!-- 依賴類型,默認類型是jar。它通常表示依賴的文件的擴展名,但也有例外。一個類型可以被映射成另外一個擴展名或分類器。類型經常和使用的打包方式對應,儘管這也有例外。一些類型的例子:jar,war,ejb-client和test-jar。如果設置extensions爲 true,就可以在plugin裏定義新的類型。所以前面的類型的例子不完整。 -->
            <type>jar
            </type>
            <!-- 依賴的分類器。分類器可以區分屬於同一個POM,但不同構建方式的構件。分類器名被附加到文件名的版本號後面。例如,如果你想要構建兩個單獨的構件成JAR,一個使用Java 1.4編譯器,另一個使用Java 6編譯器,你就可以使用分類器來生成兩個單獨的JAR構件。 -->
            <classifier></classifier>
            <!-- 依賴範圍。在項目發佈過程中,幫助決定哪些構件被包括進來。欲知詳情請參考依賴機制。

                        - compile :默認範圍,用於編譯

                        - provided:類似於編譯,但支持你期待jdk或者容器提供,類似於classpath

                        - runtime: 在執行時需要使用

                        - test: 用於test任務時使用

                        - system: 需要外在提供相應的元素。通過systemPath來取得

                        - systemPath: 僅用於範圍爲system。提供相應的路徑

                        - optional: 當項目自身被依賴時,標註依賴是否傳遞。用於連續依賴時使用 -->
            <scope>test
            </scope>
            <!-- 僅供system範圍使用。注意,不鼓勵使用這個元素,並且在新的版本中該元素可能被覆蓋掉。該元素爲依賴規定了文件系統上的路徑。需要絕對路徑而不是相對路徑。推薦使用屬性匹配絕對路徑,例如${java.home}。 -->
            <systemPath></systemPath>
            <!-- 當計算傳遞依賴時, 從依賴構件列表裏,列出被排除的依賴構件集。即告訴maven你只依賴指定的項目,不依賴項目的依賴。此元素主要用於解決版本衝突問題 -->
            <exclusions>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
            <!-- 可選依賴,如果你在項目B中把C依賴聲明爲可選,你就需要在依賴於B的項目(例如項目A)中顯式的引用對C的依賴。可選依賴阻斷依賴的傳遞性。 -->
            <optional>true</optional>
        </dependency>
    </dependencies>

    <!-- 不贊成使用. 現在Maven忽略該元素. -->
    <reports></reports>

    <!-- 該元素描述使用報表插件產生報表的規範。當用戶執行“mvn site”,這些報表就會運行。 在頁面導航欄能看到所有報表的鏈接。 -->
    <reporting>
        <!-- true,則,網站不包括默認的報表。這包括“項目信息”菜單中的報表。 -->
        <excludeDefaults/>
        <!-- 所有產生的報表存放到哪裏。默認值是${project.build.directory}/site。 -->
        <outputDirectory/>
        <!-- 使用的報表插件和他們的配置。 -->
        <plugins>
            <!-- plugin元素包含描述報表插件需要的信息 -->
            <plugin>
                <!-- 報表插件在倉庫裏的group ID -->
                <groupId/>
                <!-- 報表插件在倉庫裏的artifact ID -->
                <artifactId/>
                <!-- 被使用的報表插件的版本(或版本範圍) -->
                <version/>
                <!-- 任何配置是否被傳播到子項目 -->
                <inherited/>
                <!-- 報表插件的配置 -->
                <configuration/>
                <!-- 一組報表的多重規範,每個規範可能有不同的配置。一個規範(報表集)對應一個執行目標 。例如,有1,2,3,4,5,6,7,8,9個報表。1,2,5構成A報表集,對應一個執行目標。2,5,8構成B報表集,對應另一個執行目標 -->
                <reportSets>
                    <!-- 表示報表的一個集合,以及產生該集合的配置 -->
                    <reportSet>
                        <!-- 報表集合的唯一標識符,POM繼承時用到 -->
                        <id/>
                        <!-- 產生報表集合時,被使用的報表的配置 -->
                        <configuration/>
                        <!-- 配置是否被繼承到子POMs -->
                        <inherited/>
                        <!-- 這個集合裏使用到哪些報表 -->
                        <reports/>
                    </reportSet>
                </reportSets>
            </plugin>
        </plugins>
    </reporting>

    <!-- 繼承自該項目的所有子項目的默認依賴信息。這部分的依賴信息不會被立即解析,而是當子項目聲明一個依賴(必須描述group ID和artifact ID信息),如果group ID和artifact ID以外的一些信息沒有描述,則通過group ID和artifact ID匹配到這裏的依賴,並使用這裏的依賴信息。 -->
    <dependencyManagement>
        <dependencies>
            <!-- 參見dependencies/dependency元素 -->
            <dependency></dependency>
        </dependencies>
    </dependencyManagement>

    <!-- 項目分發信息,在執行mvn deploy後表示要發佈的位置。有了這些信息就可以把網站部署到遠程服務器或者把構件部署到遠程倉庫。 -->
    <distributionManagement>
        <!-- 部署項目產生的構件到遠程倉庫需要的信息 -->
        <repository>
            <!-- 是分配給快照一個唯一的版本號(由時間戳和構建流水號)?還是每次都使用相同的版本號?參見repositories/repository元素 -->
            <uniqueVersion/>
            <id>banseon-maven2</id>
            <name>banseon maven2</name>
            <url>file://${basedir}/target/deploy</url>
            <layout/>
        </repository>
        <!-- 構件的快照部署到哪裏?如果沒有配置該元素,默認部署到repository元素配置的倉庫,參見distributionManagement/repository元素 -->
        <snapshotRepository>
            <uniqueVersion/>
            <id>banseon-maven2</id>
            <name>Banseon-maven2 Snapshot Repository</name>
            <url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url>
            <layout/>
        </snapshotRepository>
        <!-- 部署項目的網站需要的信息 -->
        <site>
            <!-- 部署位置的唯一標識符,用來匹配站點和settings.xml文件裏的配置 -->
            <id>banseon-site</id>
            <!-- 部署位置的名稱 -->
            <name>business api website</name>
            <!-- 部署位置的URL,按protocol://hostname/path形式 -->
            <url>

                scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web

            </url>
        </site>
        <!-- 項目下載頁面的URL。如果沒有該元素,用戶應該參考主頁。使用該元素的原因是:幫助定位那些不在倉庫裏的構件(由於license限制)。 -->
        <downloadUrl/>
        <!-- 如果構件有了新的group ID和artifact ID(構件移到了新的位置),這裏列出構件的重定位信息。 -->
        <relocation>
            <!-- 構件新的group ID -->
            <groupId/>
            <!-- 構件新的artifact ID -->
            <artifactId/>
            <!-- 構件新的版本號 -->
            <version/>
            <!-- 顯示給用戶的,關於移動的額外信息,例如原因。 -->
            <message/>
        </relocation>
        <!-- 給出該構件在遠程倉庫的狀態。不得在本地項目中設置該元素,因爲這是工具自動更新的。有效的值有:none(默認),converted(倉庫管理員從Maven 1 POM轉換過來),partner(直接從夥伴Maven 2倉庫同步過來),deployed(從Maven 2實例部署),verified(被覈實時正確的和最終的)。 -->
        <status/>
    </distributionManagement>

    <!-- 以值替代名稱,Properties可以在整個POM中使用,也可以作爲觸發條件(見settings.xml配置文件裏activation元素的說明)。格式是<name>value</name>。 -->
    <properties/>
    <!--配置代理服務器,當需要通過代理服務器訪問遠程倉庫時-->
    <proxies>
        <proxy>
            <id>optional</id>
            <active>true</active>
            <protocol>http</protocol>
            <username>proxyuser</username>
            <password>proxypass</password>
            <host>proxy.host.net</host>
            <port>80</port>
            <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
        </proxy>

    </proxies>
</project>
發佈了63 篇原創文章 · 獲贊 32 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章