当前位置 : 首页 » 文章分类 :  开发  »  Apache-Maven-POM

Apache-Maven-POM

[TOC]


概述

POM全称是Project Object Model,即项目对象模型。pom.xml是maven的项目描述文件,它类似与antx的project.xml文件。pom.xml文件以xml的形式描述项目的信息,包括项目名称、版本、项目id、项目的依赖关系、编译环境、持续集成、项目团队、贡献管理、生成报表等等。总之,它包含了所有的项目信息。
Maven的中心思想是POM文件(项目对象模型)。POM文件是以XML文件的形式表述项目的资源,如源码、测试代码、依赖(用到的外部Jar包)等。POM文件应该位于项目的根目录下。
Maven的POM文件是一个xml文件,描述项目用到的资源,包括源代码目录、测试代码目录等的位置,以及项目依赖的外部jar包。
POM文件描述的是构建“什么”,而不是“如何”构建。如何构建是取决于Maven的构建阶段和目标。当然,如果需要,你也可以向Maven构建阶段中添加自定义的目标。
每一个项目都有一个POM文件。POM文件即pom.xml,应该放在项目的根目录下。一个项目如果分为多个子项目,一般来讲,父项目有一个POM文件,每一个子项目都有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。

下图说明了Maven是如何使用POM文件的,以及POM文件的主要组成部分:


Super POM

就像Java中的所有类都隐式继承自Object一样,对于pom.xml来说,它隐式继承超级POM,它包含了一些可以被继承的默认设置。
Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关的目标,它帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被方便的重写。

查看Super POM

查看 Super POM 默认配置的一个简单方法如下:
在你的电脑上的任意目录下创建一个 pom.xml 文件,使用最小pom中的内容,然后打开命令控制台,到 pom.xml 所在的目录下执行以下 mvn 命令:

mvn help:effective-pom

Maven 将会开始处理并显示 effective-pom,由于创建的是最小pom,所以所有内容都继承自超级POM

或者打开Maven安装目录中的lib/maven-model-builder-3.3.9.jar 包,能找到超级POM:maven-model-builder-3.3.9.jar\org\apache\maven\model\pom-4.0.0.xml,它是所有Maven POM的父POM,所有Maven项目继承该配置。

Maven-3.3.9的Super POM内容

<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!-- START SNIPPET: superpom -->
<project>
  <modelVersion>4.0.0</modelVersion>

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.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>
    <scriptSourceDirectory>${project.basedir}/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>
      <!-- NOTE: These plugins will be removed from future versions of the super POM -->
      <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.3.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
  </reporting>

  <profiles>
    <!-- NOTE: The release profile will be removed from future versions of the super POM -->
    <profile>
      <id>release-profile</id>

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

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

</project>
<!-- END SNIPPET: superpom -->

POM元素

project

  • modelVersion,遵从哪种pom描述版本,使用maven2必须配置为4.0.0
  • parent,父项目的坐标,如果有的话。如果项目中没有规定某个元素的值,那么父项目中的对应值即为默认值。坐标由groupId,artifactId和 version确定。
  • groupId,项目或者组织的唯一标志,并且配置时生成路径也是由此生成,如org.myproject.mojo生成的相对路径为:/org/myproject/mojo
  • artifactId,构建(artifact)的唯一标识,在给定的groupId中必须唯一。
  • version,项目当前版本,格式为:主版本.次版本.增量版本-限定版本号
  • packaging,此项目生成的构建的打包类型,如pom,jar,maven-plugin,ejb,war,ear,rar,par,默认值为jar
  • name,项目的名称, Maven产生的文档用,可选
  • url,项目主页的URL, Maven产生的文档用,可选
  • description,项目的详细描述, Maven 产生的文档用,可选
  • prerequisites,描述了这个项目构建环境中的前提条件。
  • modules/module,模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径
  • distributionManagement,项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。
  • properties/key=value,在整个pom文件中可引用的属性变量,格式为<name>value</name>
  • dependencyManagement,继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和artifact ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID匹配到这里的依赖,并使用这里的依赖信息。
  • dependencies/dependency,该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。
  • repositories/repository,发现依赖和扩展的远程仓库列表。
  • pluginRepositories/pluginRepository,发现插件的远程仓库列表,这些插件用于构建和报表
  • build,构建项目需要的信息
  • profiles/profile,一个或多个构建profile,如果被激活,会修改构建过程

dependencyManagement

dependencyManagement元素用于有子模块的maven项目的顶层POM文件中,通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。

顶层pom中的dependencies与dependencyManagement中的dependencies的区别
dependencyManagement 中的 dependencies 元素只表明依赖项版本的优先选择,并不影响项目的依赖项;而 dependencies 元素则影响项目的依赖项。
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

相对于dependencyManagement,所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。即父项目dependencies中声明的依赖项,即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)


distributionManagement

项目分发信息,主要用于artifact或site的部署参数配置。即在执行mvn deploy后要部署到的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。

  • repository,部署项目产生的构件到远程仓库需要的信息
  • snapshotRepository,构件的快照部署到哪里?如果没有配置该元素,默认部署到repository元素配置的仓库
  • site,部署项目的网站需要的信息
  • downloadUrl,项目下载页面的URL。如果没有该元素,用户应该参考主页。使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。
  • relocation,如果构件有了新的group ID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。
  • status,给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。有效的值有:none(默认),converted(仓库管理员从Maven 1 POM转换过来),partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部署),verified(被核实时正确的和最终的)。

例如部署到nexus私有库:

<distributionManagement>
    <repository>
        <id>pro-release</id>
        <name>Proj Release Repository</name>
        <url>http://172.27.19.161:8081/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
        <id>pro-snapshot</id>
        <name>Proj Snapshot Repository</name>
        <url>http://172.27.19.161:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>

parent

父项目的坐标,如果有的话。如果项目中没有规定某个元素的值,那么父项目中的对应值即为默认值。坐标由groupId,artifactId和 version确定。

  • groupId,父项目的groupId
  • artifactId,父项目的artifactId
  • version,父项目的version
  • relativePath,父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。

Maven聚合模块

Maven约定:
1、首先聚合模块必须为pom,否则无法构建
2、必须有元素,它是实现聚合的最核心配置。这里可以声明多个module元素。每个module的值都是一个当前pom的相对目录。模块所处的目录必须和模块所处的目录一致。
3、为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在。
4、聚合模块的pom没有实质性内容,只有一个pom.xml文件。只是用来帮助其他模块构建的工具。
maven构建:
maven首先解析聚合模块pom、分析要构建的模块、并计算出一个反应堆构建顺序,然后根据这个顺序依次构建各个模块。反应堆是所有模块组成的一个构建结构。


repository

在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。

  • uniqueVersion,是分配给快照一个唯一的版本号(由时间戳和构建流水号),还是每次都使用相同的版本号。默认值为true
  • releases,如何处理远程仓库里发布版本的下载
  • snapshots,如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。
  • id,远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库
  • name,用户定义的仓库名称
  • url,远程仓库URL,按protocol://hostname/path形式
  • layout,用于定位和存储构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。

releases

如何处理远程仓库里发布版本的下载

  • enabled,该仓库是否为下载某种类型构件(发布版,快照版)开启。默认值为true
  • updatePolicy,该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。
  • checksumPolicy,当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。默认为warn

snapshotRepository

部署到的snapshot远程仓库配置

  • id,repository的唯一标识,用来匹配settings.xml中配置的repository
  • name,用户定义的仓库名称
  • url,仓库url,格式为protocol://hostname/path

snapshots

用于repository的配置,表示如何处理从此库中的snapshots下载

  • enabled,该仓库是否为下载某种类型构件(发布版,快照版)开启。默认值为true
  • updatePolicy,该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。
  • checksumPolicy,当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。默认为warn

SNAPSHOT版本

有时pom.xml中的版本号version的值会有-SNAPSHOT后缀,SNAPSHOT表示开发分支上的最新代码,SNAPSHOT版本不保证代码的稳定性和不变性;相反,release版本(即任何不带-SNAPSHOT后缀的版本)的代码是不变的。
也就是说,SNAPSHOT版本是release版之前的开发版,SNAPSHOT版的代码比它的release版“旧”。
在release过程中,版本号x.y-SNAPSHOT变为x.y,同时,release过程还会将开发版的版本号改为x.(y+1)-SNAPSHOT。例如,版本1.0-SNAPSHOT发布(release)后变为版本1.0,同时新的开发版本号变为1.1-SNAPSHOT.

What is a SNAPSHOT version?
https://maven.apache.org/guides/getting-started/index.html#What_is_a_SNAPSHOT_version


dependency

dependency表示项目中一项依赖的配置信息

  • groupId,依赖的group ID,例如org.apache.maven
  • artifactId,依赖的artifact ID,即依赖的项目名
  • version,依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。
  • type,依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应,尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在plugin里定义新的类型。所以前面的类型的例子不完整。
  • classifier,依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。
  • scope,依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。
  • exclusions/exclusion,当计算传递依赖时,需要从依赖列表里被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖此项目的依赖。此元素主要用于解决版本冲突问题
  • optional,可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。默认值为false。

依赖范围(scope)配置

依赖范围配置用于限制一个依赖的传递性,也会影响编译、测试等阶段所使用的classpath路径,以及决定哪个artifact会被包含在项目的发布版本中。
有6中可用的范围:

  • compile,编译范围,默认为compile范围
    compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被传递和打包。
    对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中。
  • provided,已提供范围
    provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API,因为这个Servlet API JAR已经由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。
    对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。换句话说,它只影响到编译,测试阶段。在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,而在运行阶段,假定目标的容器(比如我们这里的liferay容器)已经提供了这个jar包,所以无需我们这个artifact对应的jar包了。
  • runtime,运行时范围
    runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。
  • test,测试范围
    test范围依赖 在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
  • system,系统范围
    system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。
  • import,导入范围,Maven 2.0.9及以上版本才有

Introduction to the Dependency Mechanism
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

maven dependency中scope=compile 和 provided区别
http://blog.csdn.net/u013704227/article/details/46460913

Maven学习详解(13)——Maven常用命令大全与pom文件讲解
http://blog.csdn.net/u012562943/article/details/50461166


依赖的传递、冲突、排除

依赖传递

假如项目A依赖B,B依赖C,即A->B->C,则maven会自动在项目A中导入C,这就是依赖的传递性。

阻断依赖传递
如果我的当前项目是project1,project1要依赖project2,project1依赖project2的配置中加上<optional>true</optional>,表示依赖可选,可选依赖阻断依赖的传递性。

<dependency>
    <groupId>com.projecct</groupId>
    <artifactId>project2</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
    <optional>true</optional>
</dependency>

那么以后所有声明依赖project1的项目如果也依赖project2,就必须写手动声明。比如project3依赖project1和project2,如果project3只声明了对project1的依赖,那么project2不会自动加入依赖,需要重新声明对project2的依赖。

依赖冲突

依赖冲突:一个项目A,通过不同依赖传递路径依赖于X,若在不同路径下传递过来的X版本不同,那么A应该导入哪个版本的X包呢?
冲突解决方案:

  • 1、如果依赖路径的长度不同,则“短路优先”:
    A->B->C->D->E->X(version 0.0.1)
    A->F->X(version 0.0.2)
    则A依赖于X(version 0.0.2)。

  • 2、依赖路径长度相同情况下,则“先声明优先”:
    A->E->X(version 0.0.1)
    A->F->X(version 0.0.2)
    则在项目A的<dependencies></dependencies>中,E,F哪个在先则A依赖哪条路径的X。

依赖排除

A->B->C(1.0)
此时在A项目中,不想使用C(1.0),而使用C(2.0)
则需要使用exclusion排除B对C(1.0)的依赖。并在A中引入C(2.0).
pom.xml中配置:

<!--排除B对C的依赖-->
<dependency>  
    <groupId>B</groupId>  
    <artifactId>B</artifactId>  
    <version>0.1</version>  
    <exclusions>
         <exclusion>
            <groupId>C</groupId>  
            <artifactId>C</artifactId><!--无需指定要排除项目的版本号-->
         </exclusion>
    </exclusions>
</dependency> 

<!---在A中引入C(2.0)-->
<dependency>  
    <groupId>C</groupId>  
    <artifactId>C</artifactId>  
    <version>2.0</version>  
</dependency>

build

构建项目需要的信息,默认值已在Super POM中配置。

  • sourceDirectory,该元素设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。默认值为src/main/java
  • scriptSourceDirectory,该元素设置了项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。默认值为src/main/scripts
  • testSourceDirectory,该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。默认值为src/test/java
  • outputDirectory,被编译过的应用class文件存放的目录。默认值为target/classes
  • testOutputDirectory,被编译过的测试class文件存放的目录。默认值为target/test-classes
  • extensions/extension,该项目使用的一系列构建扩展
  • defaultGoal,当项目没有规定目标(Maven2 叫做阶段)时的默认值
  • resources/resource,这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。默认值为src/main/resources
  • testResources/testResource,这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。默认值为src/test/resources
  • directory,构建产生的所有文件存放的目录,默认值为target
  • finalName,产生的构件的文件名,默认值是${artifactId}-${version}
  • filters/filter,当filtering开关打开时,使用到的过滤器属性文件列表
  • pluginManagement,该项目的子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置
  • plugins/plugin,使用的插件列表

extension

描述使用到的构建扩展

  • groupId,构建扩展的groupId
  • artifactId,构建扩展的artifactId
  • version,构建扩展的版本

resource

这个元素描述了项目相关或单元测试相关的所有资源路径

  • targetPath,描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。举个例子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven/messages。然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。
  • filtering,是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。
  • directory,描述存放资源的目录,该路径相对POM路径
  • includes/include,包含的模式列表,例如*/.xml
  • excludes/exclude,排除的模式列表,例如*/.xml

plugin

plugin元素包含描述插件所需要的信息。

  • groupId,插件在仓库里的group ID,默认值为org.apache.maven.plugins
  • artifactId,插件在仓库里的artifact ID
  • version,被使用的插件的版本(或版本范围)
  • extensions,是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。默认值为false
  • executions/execution,在构建生命周期中执行一组目标(goals)的配置。每个目标可能有不同的配置。
  • dependencies/dependency,项目引入插件所需要的额外依赖
  • inherited,任何配置是否被传播到子项目,默认值为true
  • configuration,专属此插件的配置信息

execution

execution元素包含了插件执行需要的信息

  • id,执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标
  • phase,绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到插件里配置的默认阶段
  • goals/goal,配置的执行目标
  • inherited,配置是否被传播到子POM,默认值为true
  • configuration,作为DOM对象的配置

profile

profile定义一个构建配置,可根据环境参数或命令行参数激活不同的构建配置

  • id,构建配置的唯一标识符。即用于命令行激活,也用于在继承时合并具有相同标识符的profile
  • activation,自动触发profile的条件逻辑。Activation是profile的开启钥匙。profile的力量来自于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。
  • build,构建项目所需要的信息。
  • modules/module,模块(有时称作子项目)被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径
  • distributionManagement,项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。
  • properties/key=value,在整个pom文件中可引用的属性变量,格式为<name>value</name>
  • dependencyManagement,继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和artifact ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID匹配到这里的依赖,并使用这里的依赖信息。
  • dependencies/dependency,该元素描述了项目相关的所有依赖。
  • repositories/repository,发现依赖和扩展的远程仓库列表。
  • pluginRepositories/pluginRepository,发现插件的远程仓库列表,这些插件用于构建和报表

activation

  • activeByDefault,profile默认是否激活的标志,默认值为false,如果设为true此profile将被激活,除非此pom中另一个profile被命令行参数-P指定。
  • jdk,当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,而!1.4激活所有版本不是以1.4开头的JDK。支持区间值,[1.5,)匹配jdk1.5及以上版本。
  • os,当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。
  • property,如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活。如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段
  • file,如果指定的文件存在,则激活profile。

os

当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。

  • name,激活profile的操作系统的名字
  • family,激活profile的操作系统所属家族(如windows或linux)
  • arch,激活profile的操作系统体系结构,如x86
  • version,激活profile的操作系统版本

property

如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活。如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段

  • name,激活profile的属性的名称
  • value,激活profile的属性的值

file

提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活profile。另一方面,exists则会检查文件是否存在,如果存在则激活profile。

  • missing,如果指定的文件不存在,则激活profile。
  • exists,如果指定的文件存在,则激活profile。

使用maven profile实现多环境可移植构建
http://blog.csdn.net/mhmyqn/article/details/24501281

Maven简介(三)——profile介绍
http://elim.iteye.com/blog/1900568


参考


上一篇 JavaScript

下一篇 c3p0

域名迁移公告
2017年12月20日起,本博客迁移到新域名madaimeng.com,旧域名masikkk.com不再更新内容,但将永久保持可访问!
阅读
7,647
阅读预计30分钟
创建日期 2017-05-15
修改日期 2017-08-31
类别
百度推荐