【maven】pom.xml详解

一、什么是POM

Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。

一个完整的pom.xml文件,放置在项目的根目录下。

[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"  
  2.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
  4.                       http://maven.apache.org/maven-v4_0_0.xsd">  
  5.   <modelVersion>4.0.0</modelVersion>  
  6.   <!– The Basics –>  
  7.   <groupId></groupId>  
  8.   <artifactId></artifactId>  
  9.   <version></version>  
  10.   <packaging></packaging>  
  11.   <dependencies></dependencies>  
  12.   <parent></parent>  
  13.   <dependencyManagement></dependencyManagement>  
  14.   <modules></modules>  
  15.   <properties></properties>  
  16.   <!– Build Settings –>  
  17.   <build></build>  
  18.   <reporting></reporting>  
  19.   <!– More Project Information –>  
  20.   <name></name>  
  21.   <description></description>  
  22.   <url></url>  
  23.   <inceptionYear></inceptionYear>  
  24.   <licenses></licenses>  
  25.   <organization></organization>  
  26.   <developers></developers>  
  27.   <contributors></contributors>  
  28.   <!– Environment Settings –>  
  29.   <issueManagement></issueManagement>  
  30.   <ciManagement></ciManagement>  
  31.   <mailingLists></mailingLists>  
  32.   <scm></scm>  
  33.   <prerequisites></prerequisites>  
  34.   <repositories></repositories>  
  35.   <pluginRepositories></pluginRepositories>  
  36.   <distributionManagement></distributionManagement>  
  37.   <profiles></profiles>  
  38. </project>  

二、基本设置

1、maven的协作相关属性

[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"  
  2.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
  4.                       http://maven.apache.org/maven-v4_0_0.xsd">  
  5.   <modelVersion>4.0.0</modelVersion>  
  6.   <groupId>org.codehaus.mojo</groupId>  
  7.   <artifactId>my-project</artifactId>  
  8.   <version>1.0</version>  
  9.   <packaging>war</packaging>  
  10. </project>  
  1. groupId : 组织标识,例如:org.codehaus.mojo,在M2_REPO目录下,将是: org/codehaus/mojo目录。
  2. artifactId : 项目名称,例如:my-project,在M2_REPO目录下,将是:org/codehaus/mojo/my-project目录。
  3. version : 版本号,例如:1.0,在M2_REPO目录下,将是:org/codehaus/mojo/my-project/1.0目录。
  4. packaging : 打包的格式,可以为:pom , jar , maven-plugin , ejb , war , ear , rar , par

2、POM之间的关系

主要用于POM文件的复用。

a)依赖关系:依赖关系列表(dependency list)是POM的重要部分

[html] view plain copy
  1. <dependencies>  
  2.    <dependency>  
  3.      <groupId>junit</groupId>  
  4.      <artifactId>junit</artifactId>  
  5.      <version>4.0</version>  
  6.      <scope>test</scope>  
  7.    </dependency>  
  8.    …  
  9.  </dependencies>  
  1. groupId , artifactId , version :
  2. scope : compile(default),provided,runtime,test,system
  3. exclusions

b)继承关系:继承其他pom.xml配置的机制。

比如父pom.xml:

[html] view plain copy
  1. <project>  
  2.   [...]  
  3.   <dependencies>  
  4.     <dependency>  
  5.       <groupId>junit</groupId>  
  6.       <artifactId>junit</artifactId>  
  7.       <version>4.4</version>  
  8.       <scope>test</scope>  
  9.     </dependency>  
  10.   </dependencies>  
  11.   [...]  
  12. </project>  
在子pom.xml文件继承它的依赖(还可以继承其他的:developers and contributors、plugin lists、reports lists、plugin executions with matching ids、plugin configuration):
[html] view plain copy
  1. [...]  
  2. <parent>  
  3. <groupId>com.devzuz.mvnbook.proficio</groupId>  
  4.   <artifactId>proficio</artifactId>  
  5.   <version>1.0-SNAPSHOT</version>  
  6. </parent>  
  7. [...]  
在这种机制下,maven还提供了一个类似java.lang.Object的顶级父pom.xml文件:
[html] view plain copy
  1. <project>  
  2.   <modelVersion>4.0.0</modelVersion>  
  3.   <name>Maven Default Project</name>  
  4.   <repositories>  
  5.     <repository>  
  6.       <id>central</id>  
  7.       <name>Maven Repository Switchboard</name>  
  8.       <layout>default</layout>  
  9.       <url>http://repo1.maven.org/maven2</url>  
  10.       <snapshots>  
  11.         <enabled>false</enabled>  
  12.       </snapshots>  
  13.     </repository>  
  14.   </repositories>  
  15.   <pluginRepositories>  
  16.     <pluginRepository>  
  17.       <id>central</id>  
  18.       <name>Maven Plugin Repository</name>  
  19.       <url>http://repo1.maven.org/maven2</url>  
  20.       <layout>default</layout>  
  21.       <snapshots>  
  22.         <enabled>false</enabled>  
  23.       </snapshots>  
  24.       <releases>  
  25.         <updatePolicy>never</updatePolicy>  
  26.       </releases>  
  27.     </pluginRepository>  
  28.   </pluginRepositories>  
  29.   <build>  
  30.     <directory>target</directory>  
  31.     <outputDirectory>target/classes</outputDirectory>  
  32.     <finalName>${project.artifactId}-${project.version}</finalName>  
  33.     <testOutputDirectory>target/test-classes</testOutputDirectory>  
  34.     <sourceDirectory>src/main/java</sourceDirectory>  
  35.     <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>  
  36.     <testSourceDirectory>src/test/java</testSourceDirectory>  
  37.     <resources>  
  38.       <resource>  
  39.         <directory>src/main/resources</directory>  
  40.       </resource>  
  41.     </resources>  
  42.     <testResources>  
  43.       <testResource>  
  44.         <directory>src/test/resources</directory>  
  45.       </testResource>  
  46.     </testResources>  
  47.     <pluginManagement>  
  48.        <plugins>  
  49.          <plugin>  
  50.            <artifactId>maven-antrun-plugin</artifactId>  
  51.            <version>1.1</version>  
  52.          </plugin>        
  53.          <plugin>  
  54.            <artifactId>maven-assembly-plugin</artifactId>  
  55.            <version>2.2-beta-2</version>  
  56.          </plugin>  
  57.          <plugin>  
  58.            <artifactId>maven-clean-plugin</artifactId>  
  59.            <version>2.2</version>  
  60.          </plugin>  
  61.          <plugin>  
  62.            <artifactId>maven-compiler-plugin</artifactId>  
  63.            <version>2.0.2</version>  
  64.          </plugin>  
  65.          <plugin>  
  66.            <artifactId>maven-dependency-plugin</artifactId>  
  67.            <version>2.0</version>  
  68.          </plugin>  
  69.          <plugin>  
  70.            <artifactId>maven-deploy-plugin</artifactId>  
  71.            <version>2.3</version>  
  72.          </plugin>  
  73.          <plugin>  
  74.            <artifactId>maven-ear-plugin</artifactId>  
  75.            <version>2.3.1</version>  
  76.          </plugin>  
  77.          <plugin>  
  78.            <artifactId>maven-ejb-plugin</artifactId>  
  79.            <version>2.1</version>  
  80.          </plugin>  
  81.          <plugin>  
  82.            <artifactId>maven-install-plugin</artifactId>  
  83.            <version>2.2</version>  
  84.          </plugin>  
  85.          <plugin>  
  86.            <artifactId>maven-jar-plugin</artifactId>  
  87.            <version>2.2</version>  
  88.          </plugin>  
  89.          <plugin>  
  90.            <artifactId>maven-javadoc-plugin</artifactId>  
  91.            <version>2.4</version>  
  92.          </plugin>  
  93.          <plugin>  
  94.            <artifactId>maven-plugin-plugin</artifactId>  
  95.            <version>2.4.1</version>  
  96.          </plugin>  
  97.          <plugin>  
  98.            <artifactId>maven-rar-plugin</artifactId>  
  99.            <version>2.2</version>  
  100.          </plugin>  
  101.          <plugin>                 
  102.            <artifactId>maven-release-plugin</artifactId>  
  103.            <version>2.0-beta-7</version>  
  104.          </plugin>  
  105.          <plugin>                 
  106.            <artifactId>maven-resources-plugin</artifactId>  
  107.            <version>2.2</version>  
  108.          </plugin>  
  109.          <plugin>  
  110.            <artifactId>maven-site-plugin</artifactId>  
  111.            <version>2.0-beta-6</version>  
  112.          </plugin>  
  113.          <plugin>  
  114.            <artifactId>maven-source-plugin</artifactId>  
  115.            <version>2.0.4</version>  
  116.          </plugin>           
  117.          <plugin>  
  118.             <artifactId>maven-surefire-plugin</artifactId>  
  119.             <version>2.4.2</version>  
  120.          </plugin>  
  121.          <plugin>  
  122.            <artifactId>maven-war-plugin</artifactId>  
  123.            <version>2.1-alpha-1</version>  
  124.          </plugin>  
  125.        </plugins>  
  126.      </pluginManagement>  
  127.   </build>  
  128.   <reporting>  
  129.     <outputDirectory>target/site</outputDirectory>  
  130.   </reporting>  
  131.   <profiles>  
  132.     <profile>  
  133.       <id>release-profile</id>  
  134.       <activation>  
  135.         <property>  
  136.           <name>performRelease</name>  
  137.           <value>true</value>  
  138.         </property>  
  139.       </activation>  
  140.       <build>  
  141.         <plugins>  
  142.           <plugin>  
  143.             <inherited>true</inherited>  
  144.             <groupId>org.apache.maven.plugins</groupId>  
  145.             <artifactId>maven-source-plugin</artifactId>  
  146.             <executions>  
  147.               <execution>  
  148.                 <id>attach-sources</id>  
  149.                 <goals>  
  150.                   <goal>jar</goal>  
  151.                 </goals>  
  152.               </execution>  
  153.             </executions>  
  154.           </plugin>  
  155.           <plugin>  
  156.             <inherited>true</inherited>  
  157.             <groupId>org.apache.maven.plugins</groupId>  
  158.             <artifactId>maven-javadoc-plugin</artifactId>  
  159.             <executions>  
  160.               <execution>  
  161.                 <id>attach-javadocs</id>  
  162.                 <goals>  
  163.                   <goal>jar</goal>  
  164.                 </goals>  
  165.               </execution>  
  166.             </executions>  
  167.           </plugin>  
  168.           <plugin>  
  169.             <inherited>true</inherited>  
  170.             <groupId>org.apache.maven.plugins</groupId>  
  171.             <artifactId>maven-deploy-plugin</artifactId>  
  172.             <configuration>  
  173.               <updateReleaseInfo>true</updateReleaseInfo>  
  174.             </configuration>  
  175.           </plugin>  
  176.         </plugins>  
  177.       </build>  
  178.     </profile>  
  179.   </profiles>  
  180. </project>  
可以通过下面命令查看当前pom.xml受到超pom.xml文件的影响:
mvn help:effective-pom

c)聚合关系:用于将多个maven项目聚合为一个大的项目。

[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"  
  2.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
  4.                       http://maven.apache.org/maven-v4_0_0.xsd">  
  5.   <modelVersion>4.0.0</modelVersion>  
  6.   <groupId>org.codehaus.mojo</groupId>  
  7.   <artifactId>my-parent</artifactId>  
  8.   <version>2.0</version>  
  9.   <modules>  
  10.     <module>my-project<module>  
  11.   </modules>  
  12. </project>  

3、属性

maven的属性,是值的占位符,类似EL,类似ant的属性,比如${X},可用于pom文件任何赋值的位置。有以下分类:

  1. env.X:操作系统环境变量,比如${env.PATH}
  2. project.x:pom文件中的属性,比如:<project><version>1.0</version></project>,引用方式:${project.version}
  3. settings.x:settings.xml文件中的属性,比如:<settings><offline>false</offline></settings>,引用方式:${settings.offline}
  4. Java System Properties:java.lang.System.getProperties()中的属性,比如java.home,引用方式:${java.home}
  5. 自定义:在pom文件中可以:<properties><installDir>c:/apps/cargo-installs</installDir></properties>,引用方式:${installDir}

4、构建设置

构建有两种build标签:
[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"  
  2.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
  4.                       http://maven.apache.org/maven-v4_0_0.xsd">  
  5.   …  
  6.   <!– "Project Build" contains more elements than just the BaseBuild set –>  
  7.   <build></build>  
  8.   <profiles>  
  9.     <profile>  
  10.       <!– "Profile Build" contains a subset of "Project Build"s elements –>  
  11.       <build></build>  
  12.     </profile>  
  13.   </profiles>  
  14. </project>  

build中的主要标签:Resources和Plugins。

Resources:用于排除或包含某些资源文件

[html] view plain copy
  1. <resources>  
  2.   <resource>  
  3.     <targetPath>META-INF/plexus</targetPath>  
  4.     <filtering>false</filtering>  
  5.     <directory>${basedir}/src/main/plexus</directory>  
  6.     <includes>  
  7.       <include>configuration.xml</include>  
  8.     </includes>  
  9.     <excludes>  
  10.       <exclude>**/*.properties</exclude>  
  11.     </excludes>  
  12.   </resource>  
  13. </resources>  
Plugins:设置构建的插件
[html] view plain copy
  1. <build>  
  2.    …  
  3.    <plugins>  
  4.      <plugin>  
  5.        <groupId>org.apache.maven.plugins</groupId>  
  6.        <artifactId>maven-jar-plugin</artifactId>  
  7.        <version>2.0</version>  
  8.        <extensions>false</extensions>  
  9.        <inherited>true</inherited>  
  10.        <configuration>  
  11.          <classifier>test</classifier>  
  12.        </configuration>  
  13.        <dependencies></dependencies>  
  14.        <executions></executions>  
  15.      </plugin>  

4、元素详解

parent

给出父项目的位置,如果存在上一级父项目的话。

如果没有特别指出的话,值就是父项目对于当前项目而言。

位置是一个 as a group ID, artifact ID 和version元素的组合。

 

modelVersion

描述这个POM文件遵从哪个版本的项目描述符。

 

groupId

针对一个项目的普遍唯一识别符。通常用一个完全正确的包的名字来与其他项目的类似名字来进行区分(比如:org.apache.maven)

 

artifactId

在给定groupID 的group里面为artifact 指定的标识符是唯一的 artifact 代表的是被制作或者被一个project应用的组件。

对于Maven项目的artifact 的例子包括:一些JARs, 原代码以及二进制的发布以及WARs.。

 

packaging:

这个项目生产出来的artifact 类型,举个例子 jar war  pom Plugins 能够创建他们自己的包,包括包的类型,所以这个列表不可能包含所有可能的类型。

 

name:

当前项目的全称。

 

version:

当前项目产生的artifact的当前版本。

 

description

当前项目的一个细节描述,当需要描述这个项目的时候被Maven所用,比如在web 站点中。

这个元素能够被指定为CDATA 类型,允许在描述器中 HTML的tags, 并不鼓励用空白文本来表示。

如果你需要去修改生成的web 站点的索引页,你能够用你自己的索引来代替自动生成的文本。

 

url

当前项目的主页的URL。

 

prerequisites:

描述当前项目的编译环境的先决条件。

 

issueManagement:

当前项目的发布管理信息。

 

ciManagement :

当前项目的连续集成信息。

 

inceptionYear

当前项目开始的年份, 用4位数字描述。 涉及到介绍情况时用作提供版权信息。

 

mailingLists

包含的信息包括邮件列表。

 

developers:

描述当前的项目的开发人员的信息。

 

contributors:

描述对当前项目有贡献的人员的信息,不特指开发人员。

 

licenses

这个元素描述了当前项目的所有的许可文件。每一个许可文件用一个许可元素来描述,然后描述额外的元素。

通常只列出适用于这个项目的许可文件以及适用于 依赖的非licenses.如果多个licenses都列出来了,那么假设这个用户选择其中的所需的,而不是接受所有的许可文件。

 

scm:

指定当前项目中的版本控制工具,比如CVS, Subversion, 等等。

 

organization

这个元素描述这个项目所属组织的各种属性的描述。这些属性应用于文档创建的时候 (版权通知和链接)。

 

build:

创建项目时必须的信息。

 

profiles:

本地项目编译档案文件时的列表,被激活时会修改build的过程。

 

modules:

模块 (有时被叫做子项目)作为当前项目的一部分。每一个被列出来的子模块都指向包含这个模块的目录文件的相对路径。

 

repositories

发现依赖和扩展的远程资源库。

 

pluginRepositories:

发现plugins 的远程资源库的列表,主要是为了编译和报告。

 

dependencies:

这个元素描述了所有与当前项目相关的依赖。

这些依赖被用作创建一个编译时的路径。

他们被自动的从资源库中下在下来依据当前项目的定义。如需更多信息,参看 the dependency mechanism reports     Deprecated.禁止适用。

现在的版本中被 Maven所忽略掉。

reporting:

这个元素包括报告的plugins 的指定,用作Maven生成站点的自动生成报告。这些报告将会运行当用户执行mvn site. 所有的报告将会包括在浏览器的导航栏中。

 

dependencyManagement:

缺省的依赖信息将会从这个元素中继承。这些依赖在这一部分中被不立刻被解决的。

当一个源于这个POM的元素描述了一个依赖根据匹配的 groupId 和 artifactId,这个部分的版本和其他值用作那些还没有指定的依赖。

 

distributionManagement:

对于一个项目分配的信息允许对于远程web服务器和资源库的site和artifacts配置。

 

properties

属性可以作为POM的自始自终的替换物,如果可行的话可以用作resources 的过滤器,格式是<name>value</name>。





你可能感兴趣的:(maven,pom.xml)