1. 简介

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

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <groupId>MavenLearn</groupId>
  8. <artifactId>simple</artifactId>
  9. <packaging>pom</packaging>
  10. <version>1.0-SNAPSHOT</version>
  11.  
  12. <dependencies>
  13. <dependency>
  14. <groupId>junit</groupId>
  15. <artifactId>junit</artifactId>
  16. <version>4.11</version>
  17. <scope>test</scope>
  18. </dependency>
  19. </dependencies>
  20. </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文件中我们可以这样定义变量,

  1. <properties>
  2. <spring.group>org.springframework</spring.group>
  3. <spring.version>3.1.1.RELEASE</spring.version>
  4. </properties>

在使用的时候,通过如下方法引用

  1. <dependency>
  2. <groupId>${spring.group}</groupId>
  3. <artifactId>spring-context</artifactId>
  4. <version>${spring.version}</version>
  5. </dependency>

需要注意的是,在“<properties>”中除了可以自己构建需要的变量,也可以指定项目内置变量的值,例如,设置源码编码、生成报告编码和surefire插件的jvm运行参数为utf-8:

  1. <properties>
  2.  
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4.  
  5. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  6.  
  7. <argLine>-Dfile.encoding=UTF-8</argLine>
  8.  
  9. </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,其配置如下:

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

它有一个子模块,my-module,目录结构如下:

如果让my-module继承my-app,那其pom可以如下配置(前提是my-app已经install到了local repository,或者my-app的pom文件在my-module pom文件的上一级目录):

  1. <project>
  2. <parent>
  3. <groupId>com.mycompany.app</groupId>
  4. <artifactId>my-app</artifactId>
  5. <version>1</version>
  6. </parent>
  7. <modelVersion>4.0.0</modelVersion>
  8. <groupId>com.mycompany.app</groupId>
  9. <artifactId>my-module</artifactId>
  10. <version>1</version>
  11. </project>

如果不是上面的目录结构,又没有install到本地仓库的话,怎么破,比如这种结构:

.

额。。直接用<relativePath>标签指定父级pom的路径就好了,

  1. <project>
  2. <parent>
  3. <groupId>com.mycompany.app</groupId>
  4. <artifactId>my-app</artifactId>
  5. <version>1</version>
  6. <relativePath>../parent/pom.xml</relativePath>
  7. </parent>
  8. <modelVersion>4.0.0</modelVersion>
  9. <artifactId>my-module</artifactId>
  10. </project>

3.2 pom聚合(Aggregation)

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

parent是用于聚合的,my-module是子项目,

parent的pom如下:

  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.mycompany.app</groupId>
  4. <artifactId>my-app</artifactId>
  5. <version>1</version>
  6. <packaging>pom</packaging>
  7.  
  8. <modules>
  9. <module>../my-module</module>
  10. </modules>
  11. </project>

注意两点:

  • 必须指定<packaging>pom</packaging>
  • 在module中,可以通过相对路径指定要聚合的项目的pom路径,例子中只有一个子项目,如果有多个,都在modules中指定就可以了

被聚合的项目my-module的pom如下:

  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.mycompany.app</groupId>
  4. <artifactId>my-module</artifactId>
  5. <version>1</version>
  6. </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

  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <name>Maven Default Project</name>
  4.  
  5. <repositories>
  6. <repository>
  7. <id>central</id>
  8. <name>Maven Repository Switchboard</name>
  9. <layout>default</layout>
  10. <url>http://repo1.maven.org/maven2</url>
  11. <snapshots>
  12. <enabled>false</enabled>
  13. </snapshots>
  14. </repository>
  15. </repositories>
  16.  
  17. <pluginRepositories>
  18. <pluginRepository>
  19. <id>central</id>
  20. <name>Maven Plugin Repository</name>
  21. <url>http://repo1.maven.org/maven2</url>
  22. <layout>default</layout>
  23. <snapshots>
  24. <enabled>false</enabled>
  25. </snapshots>
  26. <releases>
  27. <updatePolicy>never</updatePolicy>
  28. </releases>
  29. </pluginRepository>
  30. </pluginRepositories>
  31.  
  32. <build>
  33. <directory>${project.basedir}/target</directory>
  34. <outputDirectory>${project.build.directory}/classes</outputDirectory>
  35. <finalName>${project.artifactId}-${project.version}</finalName>
  36. <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
  37. <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
  38. <!-- TODO: MNG-3731 maven-plugin-tools-api < 2.4.4 expect this to be relative... -->
  39. <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
  40. <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
  41. <resources>
  42. <resource>
  43. <directory>${project.basedir}/src/main/resources</directory>
  44. </resource>
  45. </resources>
  46. <testResources>
  47. <testResource>
  48. <directory>${project.basedir}/src/test/resources</directory>
  49. </testResource>
  50. </testResources>
  51. <pluginManagement>
  52. <plugins>
  53. <plugin>
  54. <artifactId>maven-antrun-plugin</artifactId>
  55. <version>1.3</version>
  56. </plugin>
  57. <plugin>
  58. <artifactId>maven-assembly-plugin</artifactId>
  59. <version>2.2-beta-2</version>
  60. </plugin>
  61. <plugin>
  62. <artifactId>maven-clean-plugin</artifactId>
  63. <version>2.2</version>
  64. </plugin>
  65. <plugin>
  66. <artifactId>maven-compiler-plugin</artifactId>
  67. <version>2.0.2</version>
  68. </plugin>
  69. <plugin>
  70. <artifactId>maven-dependency-plugin</artifactId>
  71. <version>2.0</version>
  72. </plugin>
  73. <plugin>
  74. <artifactId>maven-deploy-plugin</artifactId>
  75. <version>2.4</version>
  76. </plugin>
  77. <plugin>
  78. <artifactId>maven-ear-plugin</artifactId>
  79. <version>2.3.1</version>
  80. </plugin>
  81. <plugin>
  82. <artifactId>maven-ejb-plugin</artifactId>
  83. <version>2.1</version>
  84. </plugin>
  85. <plugin>
  86. <artifactId>maven-install-plugin</artifactId>
  87. <version>2.2</version>
  88. </plugin>
  89. <plugin>
  90. <artifactId>maven-jar-plugin</artifactId>
  91. <version>2.2</version>
  92. </plugin>
  93. <plugin>
  94. <artifactId>maven-javadoc-plugin</artifactId>
  95. <version>2.5</version>
  96. </plugin>
  97. <plugin>
  98. <artifactId>maven-plugin-plugin</artifactId>
  99. <version>2.4.3</version>
  100. </plugin>
  101. <plugin>
  102. <artifactId>maven-rar-plugin</artifactId>
  103. <version>2.2</version>
  104. </plugin>
  105. <plugin>
  106. <artifactId>maven-release-plugin</artifactId>
  107. <version>2.0-beta-8</version>
  108. </plugin>
  109. <plugin>
  110. <artifactId>maven-resources-plugin</artifactId>
  111. <version>2.3</version>
  112. </plugin>
  113. <plugin>
  114. <artifactId>maven-site-plugin</artifactId>
  115. <version>2.0-beta-7</version>
  116. </plugin>
  117. <plugin>
  118. <artifactId>maven-source-plugin</artifactId>
  119. <version>2.0.4</version>
  120. </plugin>
  121. <plugin>
  122. <artifactId>maven-surefire-plugin</artifactId>
  123. <version>2.4.3</version>
  124. </plugin>
  125. <plugin>
  126. <artifactId>maven-war-plugin</artifactId>
  127. <version>2.1-alpha-2</version>
  128. </plugin>
  129. </plugins>
  130. </pluginManagement>
  131. </build>
  132.  
  133. <reporting>
  134. <outputDirectory>${project.build.directory}/site</outputDirectory>
  135. </reporting>
  136. <profiles>
  137. <profile>
  138. <id>release-profile</id>
  139.  
  140. <activation>
  141. <property>
  142. <name>performRelease</name>
  143. <value>true</value>
  144. </property>
  145. </activation>
  146.  
  147. <build>
  148. <plugins>
  149. <plugin>
  150. <inherited>true</inherited>
  151. <groupId>org.apache.maven.plugins</groupId>
  152. <artifactId>maven-source-plugin</artifactId>
  153. <executions>
  154. <execution>
  155. <id>attach-sources</id>
  156. <goals>
  157. <goal>jar</goal>
  158. </goals>
  159. </execution>
  160. </executions>
  161. </plugin>
  162. <plugin>
  163. <inherited>true</inherited>
  164. <groupId>org.apache.maven.plugins</groupId>
  165. <artifactId>maven-javadoc-plugin</artifactId>
  166. <executions>
  167. <execution>
  168. <id>attach-javadocs</id>
  169. <goals>
  170. <goal>jar</goal>
  171. </goals>
  172. </execution>
  173. </executions>
  174. </plugin>
  175. <plugin>
  176. <inherited>true</inherited>
  177. <groupId>org.apache.maven.plugins</groupId>
  178. <artifactId>maven-deploy-plugin</artifactId>
  179. <configuration>
  180. <updateReleaseInfo>true</updateReleaseInfo>
  181. </configuration>
  182. </plugin>
  183. </plugins>
  184. </build>
  185. </profile>
  186. </profiles>
  187.  
  188. </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 —— maven权威指南学习笔记(五)的更多相关文章

  1. netty权威指南学习笔记五——分隔符和定长解码器的应用

    TCP以流的方式进行数据传输,上层应用协议为了对消息进行区分,通常采用以下4中方式: 消息长度固定,累计读取到长度综合为定长LEN的报文后,就认为读取到了一个完整的消息,将计数器置位,重新开始读取下一 ...

  2. IDA Pro 权威指南学习笔记(五) - IDA 主要的数据显示窗口

    在默认配置下,IDA(从 6.1 版开始)会在对新二进制文件的初始加载和分析阶段创建 7 个显示窗口 3 个立即可见的窗口分别为 IDA-View 窗口.函数窗口和消息输出窗口 可以通过 View - ...

  3. HTTP权威指南-学习笔记

    目录 HTTP权威指南-学习笔记 HTTP: Web的基础 URL与资源 HTTP报文 连接管理 HTTP结构 Web服务器 代理 缓存 集成点: 网关,隧道及中继 Web机器人 识别,认证与安全 客 ...

  4. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...

  5. CSS权威指南学习笔记系列(1)CSS和文档

    题外话:HTML是一种结构化语言,而CSS是它的补充:这是一种样式语言.CSS是前端三板斧之一,因此学习CSS很重要.而我还是菜鸟,所以需要加强学习CSS.这个是我学习CSS权威指南的笔记,如有不对, ...

  6. Hadoop权威指南学习笔记二

    MapReduce简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.n ...

  7. Hadoop权威指南学习笔记一

    Hadoop简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出.一起学习一起进步. 转载请注明:http://blog.csdn.net/ ...

  8. Hadoop权威指南学习笔记三

    HDFS简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考.有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my ...

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

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

随机推荐

  1. Atitit.软件gui按钮and面板---os区-----linux windows搜索文件 文件夹

    Atitit.软件gui按钮and面板---os区-----搜索文件 1. Find 1 2. 寻找目录 1 3. 2. Locate// everything 1 4. 3. Whereis (wi ...

  2. 浅谈PCIe体系结构(详细剖析PCIE数据流向)

    <PCI-Express 体系结构导读> <浅谈PCIe体系结构> http://blog.sina.com.cn/s/articlelist_1685243084_3_1.h ...

  3. hdu 2987最大权闭合图模板类型题

    /* 最大权闭合图模板类型的题,考验对知识概念的理解. 题意:如今要辞退一部分员工.辞退每个员工能够的到一部分利益(能够是负的),而且辞退员工,必须辞退他的下属.求最大利益和辞退的最小人数. 最大权闭 ...

  4. Leetcode[81]-Search for a Range

    Link: https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ Given a sorted array of integ ...

  5. 危险系数 set容器

    题目描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个危险系数DF( ...

  6. Composer fails to download http json files on "update", not a network issue, https fine

    "repositories": [ { "packagist": false }, { "type": "composer&quo ...

  7. WPF集合

    Dependency Property 依赖属性 http://www.cnblogs.com/HelloMyWorld/archive/2013/02/21/2920149.html Attache ...

  8. python操作word

    python教程(百度经验) Python 操作Word(Excel.PPT等通用)   import win32comfrom win32com.client import Dispatch, co ...

  9. seajs中引用jquery插件

    步骤一:使用define封装成seajs模块,返回匿名函数,包含插件的源码 define(function(require,exports,moudles){ return function(jque ...

  10. mq和redis安装

    [root@129-2-10-8 src]# cat b.sh #!/bin/bash ####install redis software #####echo "############# ...