文章目录
POM是什么
POM是Project Object Model的缩写,是Maven的核心配置文件,以XML形式包含了工程的基本信息以及构建的细节配置,对于大多数工程使用pom的默认值就可以,也可以自定义,Maven会在当前目录寻找POM文件,获取必要的配置信息,然后执行目标。
Maven有一个基础POM配置,所有的工程中的POM都会继承这个默认的POM。
POM基本配置
POM所必须的最基本配置如下:
- project 跟标签
- modelVersion 应该为4.0.0
- groupId 工程的组织ID
- artifactId 工程ID
- version 工程版本
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>
以上是POM要求的最基本的配置信息,其他配置如果未设定则会取Maven的默认值,例如打包类型默认为jar,仓库地址默认为https://repo.maven.apache.org/maven2
工程的继承
POM主要包含以下内容:
- 依赖
- 开发者信息
- 插件列表
- 插件运行信息
- 插件配置
- 资源
所有的maven工程都会继承默认的POM,当然用户也可以自行定义父工程POM,例如:
例子1
场景
在之前的例子中com.mycompany.app:my-app:1,再引入一个新的子工程com.mycompany.app:my-module:1.
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
其目录结构:
.
|-- my-module
| `-- pom.xml
`-- pom.xml
解决方案
com.mycompany.app:my-app:1 为com.mycompany.app:my-module:1 的父工程,com.mycompany.app:my-module:1的POM配置为:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
配置中多了父工程的配置,子工程会继承部分父工程的属性。
例如,子工程如果想与父工程的groupId 或者version ,在子工程中去掉相关标签即可:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<artifactId>my-module</artifactId>
</project>
例子2
场景
工程目录为以下结构:
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
解决方案
可以通过< relativePath >来指定父工程pom的路径,通常建议使用相对路径:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
工程的聚合
工程的聚合与继承类似,继承是在子工程中指定父工程,聚合是在父工程中指定模块。当在父工程执行maven命令时,会根据配置把所有子工程都执行一遍。实现工程的聚合需要:
- 父工程POM的packaging设置为pom
- 在父工程中指定子模块
例子3
场景
com.mycompany.app:my-app:1’s POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>
com.mycompany.app:my-module:1’s POM
project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
目录结构
.
|-- my-module
| `-- pom.xml
`-- pom.xml
解决方案
将my-module聚合进my-app,对my-app的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>
其中module需要设置为子模块的相对路径
例子4
场景
如果改变目录结构为以下:
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
解决方案
<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>
工程的继承与聚合
如果有多个Maven工程,并且这些工程有公共配置,可以将这些公共的配置抽取为父工程,各个工程继承这个父工程。
如果有一组工程,希望他们共同构建,可以创建一个父工程,在父工程中指定这些工程为子模块,这样只需要在父工程中执行构建命令,所有与工程都会进行构建。
当然集成与聚合的配置是需要同时进行的,相关的规则为:
- 在子工程POM中指定父工程POM的相对路径
- 将父工程POM的packaging属性设置为pom
- 在父工程POM中指定子模块的相对路径
例子5
场景
com.mycompany.app:my-app:1’s POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>
com.mycompany.app:my-module:1’s POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
文件目录:
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
解决方案
com.mycompany.app:my-app:1’s 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>
com.mycompany.app:my-module:1’s POM
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
POM中的变量
在工程的POM中可以指定变量,以避免多次复制的繁琐,例如工程版本指定变量project.version:
<version>${project.version}</version>
注意:变量的处理在继承处理之后,也就是说子工程的变量设置会覆盖父工程中的
可用的变量
项目模型中的变量
POM中的标签属性是单个值的都可以设置为变量,例如${project.groupId}, ${project.version}, ${project.build.sourceDirectory}
特殊变量
变量 | 含义 |
---|---|
project.basedir | 当前工程所在目录 |
project.baseUri | 当前工程所在位置的URL |
maven.build.timestamp | 工程构建的开始时间 |
构建时间的格式可以设置:
<project>
...
<properties>
<maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss'Z'</maven.build.timestamp.format>
</properties>
...
</project>
其他属性
POM中可以引用任何在properties标签中定义的变量:
<project>
...
<properties>
<mavenVersion>3.0</mavenVersion>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>${mavenVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>${mavenVersion}</version>
</dependency>
</dependencies>
...
</project>