maven POM —— maven權威指南學習筆記(五)

1. 簡介

Archetype插件經過 pom.xml 文件建立了一個項目。這就是項目對象模型 (POM),一個項目的聲明性描述。html

當Maven運行一個目標的時候,每一個目標都會訪問定 義在項目POM裏的信息。java

這個POM文件在maven1中是project.xml,在maven2時改成pom.xml。web

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>MavenLearn</groupId>
    <artifactId>simple</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

上面是一個簡單的pom.xml文件的例子,能夠看到,在上面這個文件中主要定義了,項目的基本信息 和 項目的依賴信息(dependencies)。spring

項目的基本信息中最重要的就是: groupId,artifactId,version,這三個關鍵信息組成了一個項目的座標(Coordinate),它能夠惟一的標示一個項目,也是項目依賴的根據。apache

  • groupId:指定 團體,公司,小組,組織,項目,或者其它團體。團體標識的約定是,它以創 建這個項目的組織名稱的逆向域名(reverse domain name)開頭。例如,來自Sonatype 的項目有一個以com.sonatype開頭的groupId,而Apache Software的項目有以 org.apache開頭的groupId。
  • artifactId:在groupId下的表示一個單獨項目的惟一標識符。
  • version:指定一個項目的特定版本。發佈的項目有一個固定的版本標識來指向該項目的某一個 特定的版本。例如,對於在開發中的項目用「SNAPSHOT」標記。

以上三個標記 加上 modelVersion(設置爲4.0.0) 都是pom.xml中必需的。api

POM文件中除了能夠指定上面提到的項目基本信息,dependencies,還能夠定義插件, profiles,以及項目描述(description),研發人員(developer),郵件列表(mailing list)等。mvc

 

2. Maven變量

咱們在定義pom.xml 的時候,尤爲是定義 dependencies時,一般會引入同一個版本的好多文件,好比spring 框架下,某個版本的spring-context,spring-test,spring-core,spring-beans,spring-webmvc 等等,即使它們下面有些是有依賴關係的,能夠由maven幫咱們作了,可是還有好多都是要本身寫的,至關麻煩,若是這個你還能夠接受,畢竟只定義一次嘛,那若是spring在將來哪天出了一個新特性,你特別想用,要升級一下,那又得從新改一遍,沒準還改錯了呢。這個時候就須要用到maven的變量了。這個時候就須要用到maven的變量了。app

maven變量分爲自定變量內置變量框架

2.1 自定義變量

在pom文件中咱們能夠這樣定義變量,dom

<properties>
    <spring.group>org.springframework</spring.group>
    <spring.version>3.1.1.RELEASE</spring.version>
</properties>

在使用的時候,經過以下方法引用

<dependency>
    <groupId>${spring.group}</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

 

須要注意的是,在「<properties>」中除了能夠本身構建須要的變量,也能夠指定項目內置變量的值,例如,設置源碼編碼、生成報告編碼和surefire插件的jvm運行參數爲utf-8:

<properties> 

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 

        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 

        <argLine>-Dfile.encoding=UTF-8</argLine> 

</properties>

 

2.2 內置變量

  • ${basedir} 項目根目錄
  • ${project.build.directory} 構建目錄,缺省爲target
  • ${project.build.outputDirectory} 構建過程輸出目錄,缺省爲target/classes
  • ${project.build.finalName} 產出物名稱,缺省爲${project.artifactId}-${project.version}
  • ${project.packaging} 打包類型,缺省爲jar
  • ${project.xxx} 當前pom文件的任意節點的內容

 

3. 繼承(Inheritance)聚合(Aggregation)

接下來講一下pom的繼承(Inheritance)聚合(Aggregation)

繼承是用在多個子項目,相同的配置的部分,能夠抽離出來造成一個父pom,子項目都繼承它。這樣好處是,減小配置,配置的地方少了,出錯的可能就減少了;抽取出了公共的配置,便於維護。

聚合是把多個子項目合併到一塊兒,能夠用一個命令就完成整個項目的集成。舉個例子,一個系統有三個子模塊,由三個團隊分別負責開發,都開發完以後,須要發佈系統,聚合以後就能夠一個命令搞定,而不是各個子項目分別打包,再集成爲一個,各類問題。。。

 

3.1 pom繼承(Inheritance)

繼承的內容包括:dependencies、研發者信息、插件列表(包含reports)、插件的執行設置(plugin executions with matching ids)、插件配置、資源配置(resource)。

一個列子:

com.mycompany.app:my-app:1,其配置以下:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
  <packaging>pom</packaging> 
</project>

它有一個子模塊,my-module,目錄結構以下:

image

若是讓my-module繼承my-app,那其pom能夠以下配置(前提是my-app已經install到了local repository,或者my-app的pom文件在my-module pom文件的上一級目錄):

<project>
<parent>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>

若是不是上面的目錄結構,又沒有install到本地倉庫的話,怎麼破,好比這種結構:

image.

額。。直接用<relativePath>標籤指定父級pom的路徑就行了,

<project>
<parent>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
  <relativePath>../parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>my-module</artifactId>
</project>

 

3.2 pom聚合(Aggregation)

其實聚合的構建方法和繼承的是很類似的,這裏列舉一個例子,假設目錄以下:

image

parent是用於聚合的,my-module是子項目,

parent的pom以下:

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>

<modules>
<module>../my-module</module>
</modules>
</project>

注意兩點:

  • 必須指定<packaging>pom</packaging>
  • 在module中,能夠經過相對路徑指定要聚合的項目的pom路徑,例子中只有一個子項目,若是有多個,都在modules中指定就能夠了

被聚合的項目my-module的pom以下:

<project>
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.mycompany.app</groupId>
 <artifactId>my-module</artifactId>
 <version>1</version>
</project>

 

3.3 繼承與聚合小結

總結一下繼承和聚合

區別

1.對於聚合模塊來講,它知道有哪些被聚合的模塊,但那些被聚合的模塊不知道這個聚合模塊的存在。

2.對於繼承關係的父 POM來講,它不知道有哪些子模塊繼承與它,但那些子模塊都必須知道本身的父 POM是什麼。

共同點

1.聚合 POM與繼承關係中的父POM的 packaging都是pom

2.聚合模塊與繼承關係中的父模塊除了 POM以外都沒有實際的內容。

 

3.4 繼承(Inheritance)+ 聚合(Aggregation)

咱們能夠單獨使用繼承或者聚合的特性,也能夠結合起來使用,

下面來一個集合繼承與聚合的實例,

首先用idea創建四個項目,目錄如圖:

clipboard

最終的目的是:pomLearn目錄用於聚合,module1,module2繼承module_parent

如今先配置好基礎項目的關係,四個配置文件以下:

pomLearn——聚合 aggregation

clipboard[1]

注意:

  • packaging爲pom
  • 在聚合的時候,父pom目錄也須要引入"<module>"中,目錄的路徑是相對路勁。

 

module_parent

clipboard[2]

注意:

  • packaging爲pom
  • 子項目繼承module_parent後,便可不引入junit了

 

module1

clipboard[3]

注意:

  • 子項目的groupId能夠與父項目不一樣;相同時能夠省略

 

module2

clipboard[4]

 

ok,運行一下mvn clean,出現如下結果,配置成功:

D:\Java\jdk1.8.0_65\bin\java -Dmaven.multiModuleProjectDirectory=$M2_HOME -Dmaven.home=D:\Coding\apache-maven-3.3.3 -Dclassworlds.conf=D:\Coding\apache-maven-3.3.3\bin\m2.conf -Didea.launcher.port=7539 "-Didea.launcher.bin.path=D:\Coding\JetBrains\IntelliJ IDEA 14.0\bin" -Dfile.encoding=UTF-8 -classpath "D:\Coding\apache-maven-3.3.3\boot\plexus-classworlds-2.5.2.jar;D:\Coding\JetBrains\IntelliJ IDEA 14.0\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain org.codehaus.classworlds.Launcher -Didea.version=14.0 clean
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] module_parent
[INFO] module1
[INFO] module2
[INFO] pomLearn
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building module_parent 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module_parent ---
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building module1 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module1 ---
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building module2 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module2 ---
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building pomLearn 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ pomLearn ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] module_parent ...................................... SUCCESS [  0.135 s]
[INFO] module1 ............................................ SUCCESS [  0.003 s]
[INFO] module2 ............................................ SUCCESS [  0.002 s]
[INFO] pomLearn ........................................... SUCCESS [  0.001 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.230 s
[INFO] Finished at: 2016-01-19T23:50:18+08:00
[INFO] Final Memory: 8M/309M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

 

3.5 Super POM

在沒有特別指定的狀況下,咱們使用的pom文件都是繼承自maven的Super POM,文章最後列出的就是Maven 2.1.x 的Super POM,也能夠參看maven document 的 Introduction to the POM

<project>
    <modelVersion>4.0.0</modelVersion>
    <name>Maven Default Project</name>

    <repositories>
        <repository>
            <id>central</id>
            <name>Maven Repository Switchboard</name>
            <layout>default</layout>
            <url>http://repo1.maven.org/maven2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>Maven Plugin Repository</name>
            <url>http://repo1.maven.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <updatePolicy>never</updatePolicy>
            </releases>
        </pluginRepository>
    </pluginRepositories>

    <build>
        <directory>${project.basedir}/target</directory>
        <outputDirectory>${project.build.directory}/classes</outputDirectory>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
        <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
        <!-- TODO: MNG-3731 maven-plugin-tools-api < 2.4.4 expect this to be relative... -->
        <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>${project.basedir}/src/test/resources</directory>
            </testResource>
        </testResources>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.3</version>
                </plugin>
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.2-beta-2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.4</version>
                </plugin>
                <plugin>
                    <artifactId>maven-ear-plugin</artifactId>
                    <version>2.3.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-ejb-plugin</artifactId>
                    <version>2.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <version>2.5</version>
                </plugin>
                <plugin>
                    <artifactId>maven-plugin-plugin</artifactId>
                    <version>2.4.3</version>
                </plugin>
                <plugin>
                    <artifactId>maven-rar-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-release-plugin</artifactId>
                    <version>2.0-beta-8</version>
                </plugin>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.3</version>
                </plugin>
                <plugin>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>2.0-beta-7</version>
                </plugin>
                <plugin>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>2.0.4</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.4.3</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.1-alpha-2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

    <reporting>
        <outputDirectory>${project.build.directory}/site</outputDirectory>
    </reporting>
    <profiles>
        <profile>
            <id>release-profile</id>

            <activation>
                <property>
                    <name>performRelease</name>
                    <value>true</value>
                </property>
            </activation>

            <build>
                <plugins>
                    <plugin>
                        <inherited>true</inherited>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>attach-sources</id>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <inherited>true</inherited>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>attach-javadocs</id>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <inherited>true</inherited>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-deploy-plugin</artifactId>
                        <configuration>
                            <updateReleaseInfo>true</updateReleaseInfo>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

</project>
View Code

 

 

 

 

參考:

Introduction to the POM,maven document,http://maven.apache.org/guides/introduction/introduction-to-the-pom.html

聚合與繼承,iqeq00,http://iqeq00.iteye.com/blog/2033617?utm_source=tuicool&utm_medium=referral

Maven聚合與繼承,chenzhou123520,http://chenzhou123520.iteye.com/blog/1582166

一個多maven項目聚合的實例,kyfxbl,http://www.iteye.com/topic/1126788

maven權威指南

相關文章
相關標籤/搜索