1. 简介

Archetype插件通过 pom.xml 文件创建了一个项目。这就是项目对象模型 (POM),一个项目的声明性描述。

当Maven运行一个目标的时候,每个目标都会访问定 义在项目POM里的信息。

这个POM文件在maven1中是project.xml,在maven2时改为pom.xml。

<?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)。

项目的基本信息中最重要的就是: groupId,artifactId,version,这三个关键信息组成了一个项目的坐标(Coordinate),它可以唯一的标示一个项目,也是项目依赖的根据。

  • groupId:指定 团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创 建这个项目的组织名称的逆向域名(reverse domain name)开头。例如,来自Sonatype 的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以 org.apache开头的groupId。
  • artifactId:在groupId下的表示一个单独项目的唯一标识符。
  • version:指定一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个 特定的版本。例如,对于在开发中的项目用“SNAPSHOT”标记。

以上三个标记 加上 modelVersion(设置为4.0.0) 都是pom.xml中必需的。

POM文件中除了可以指定上面提到的项目基本信息,dependencies,还可以定义插件, profiles,以及项目描述(description),研发人员(developer),邮件列表(mailing list)等。

2. Maven变量

我们在定义pom.xml 的时候,尤其是定义 dependencies时,通常会引入同一个版本的好多文件,比如spring 框架下,某个版本的spring-context,spring-test,spring-core,spring-beans,spring-webmvc 等等,即便它们下面有些是有依赖关系的,可以由maven帮我们做了,但是还有好多都是要自己写的,相当麻烦,如果这个你还可以接受,毕竟只定义一次嘛,那如果spring在未来哪天出了一个新特性,你特别想用,要升级一下,那又得重新改一遍,没准还改错了呢。这个时候就需要用到maven的变量了。这个时候就需要用到maven的变量了。

maven变量分为自定变量和内置变量

2.1 自定义变量

在pom文件中我们可以这样定义变量,

<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,目录结构如下:

如果让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到本地仓库的话,怎么破,比如这种结构:

.

额。。直接用<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)

其实聚合的构建方法和继承的是很相似的,这里列举一个例子,假设目录如下:

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建立四个项目,目录如图:

最终的目的是:pomLearn目录用于聚合,module1,module2继承module_parent

现在先配置好基础项目的关系,四个配置文件如下:

pomLearn——聚合 aggregation

注意:

  • packaging为pom
  • 在聚合的时候,父pom目录也需要引入"<module>"中,目录的路径是相对路劲。

module_parent

注意:

  • packaging为pom
  • 子项目继承module_parent后,即可不引入junit了

module1

注意:

  • 子项目的groupId可以与父项目不同;相同时可以省略

module2

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>

参考:

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权威指南

maven权威指南学习笔记(五)—— POM的更多相关文章

  1. maven POM —— maven权威指南学习笔记(五)

    1. 简介 Archetype插件通过 pom.xml 文件创建了一个项目.这就是项目对象模型 (POM),一个项目的声明性描述. 当Maven运行一个目标的时候,每个目标都会访问定 义在项目POM里 ...

  2. maven权威指南学习笔记(一)——简介

    maven是什么?有什么用? Maven是一个项目管理工具,它包含了     一个项目对象模型 (Project Object Model),     一组标准集合,     一个项目生命周期(Pro ...

  3. maven 简介 —— maven权威指南学习笔记(一)

    maven是什么?有什么用? Maven是一个项目管理工具,它包含了 一个项目对象模型 (Project Object Model), 一组标准集合, 一个项目生命周期(ProjectLifecycl ...

  4. maven权威指南学习笔记(三)——一个简单的maven项目

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

  5. maven 一个简单项目 —— maven权威指南学习笔记(三)

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

  6. maven权威指南学习笔记(四)—— maven生命周期(lifecycle)

    定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) -- 编译源码(compile) -- 编译测试源码(test-com ...

  7. maven生命周期(lifecycle)—— maven权威指南学习笔记(四)

    定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) …… 编译源码(compile) …… 编译测试源码(test-com ...

  8. maven权威指南学习笔记(二)——安装、运行、获取帮助

    这部分在网上很容易找到详细教程,这里就略写了. 基础:系统有配置好的jdk,通过 命令行 java -version,有类似下面的提示,表示java环境以配好 下载maven:官网 http://ma ...

  9. maven 安装、运行、获取帮助 —— maven权威指南学习笔记(二)

    这部分在网上很容易找到详细教程,这里就略写了. 基础:系统有配置好的jdk,通过 命令行 java -version,有类似下面的提示,表示java环境以配好 下载maven:官网 http://ma ...

随机推荐

  1. 调用Interop.zkemkeeper.dll无法使用解决方案

    调用Interop.zkemkeeper.dll无法使用 已经注册dll成功但是还是报错 检索 COM 类工厂中 CLSID 为 {00853A19-BD51-419B--2DABE57EB61F} ...

  2. 共有31款PHP 图形/图像处理开源软件(转)

    详情点击:http://www.oschina.net/project/lang/22/php?tag=141&os=0&sort=view PHP 图像处理库 Grafika Gra ...

  3. 第四章 --- 关于Javascript 设计模式 之 迭代器模式

    今天我先写 两个常用的迭代器的 例子.(同学们先自行体会这二种迭代器的优缺点) 需求:比较两个数组是否相等 tips: 当数组的下标不为数字的时候,默认为 该键值对 为 对象. 然后迭代器的原理基本来 ...

  4. Mysql基础(二)

    学习路线:数据约束-> 数据库的设计过程-> 存储过程的相关知识-> 触发器-> 权限管理 (一)数据约束 1.1.默认值的设置 创建员工表emp 将默认地址设置为'中国'my ...

  5. 无意之间发现的Servlet3.0新特性@WebServlet

    今天无意之间看到了一个注解,这个注解就是@WebServlet,@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Se ...

  6. Learning Spark 第四章——键值对处理

    本章主要介绍Spark如何处理键值对.K-V RDDs通常用于聚集操作,使用相同的key聚集或者对不同的RDD进行聚集.部分情况下,需要将spark中的数据记录转换为键值对然后进行聚集处理.我们也会对 ...

  7. easyui Datagrid查询报错Uncaught TypeError:Cannot read property 'length' of undefined

    1.问题描述 easyui中datagrid执行loadData方法出现如下异常:Cannot read property 'length' of undefined 2.一开始怀疑是js或者页面的问 ...

  8. Sicily 1444: Prime Path(BFS)

    题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...

  9. Activity系列讲解---数据传递

    在Android中,不同的Activity实例可能运行在一个进程中,也可能运行在不同的进程中.因此需要一种特别的机制帮助我们在Activity之间传递消息.Android中通过Intent对象来表示一 ...

  10. 导入excel

    1.js使用ajaxfileupload.js实现文件上传 2.将文件转为字节 3.将字节转为excel保存到服务器 4.根据路径读取excel文件并转为dataSet 5.将dataSet写入数据库