POM 原文: https://maven.apache.org/guid…
构建我的项目
开发 Java 的过程中可能会应用很多依赖包,来自第三方的或者由本人搭建的 Maven 仓库。依赖包之间的版本兼容治理是开发中一个辣手的问题。Maven 将所有依赖无关的信息记录在 pom.xml 文件上,而后主动地下载和构建这些依赖包。
什么是 POM
POM 全称 Project Object Model(我的项目对象模型),是 Maven 的根本单元。这个 XML 文件蕴含了所有对于我的项目配置的信息,这些信息将用于 Maven 构建我的项目。它蕴含了一些默认值,target 文件夹是 build 目录,src/main/java 文件夹是源代码目录,src/test/java 是测试目录。运行 Maven 时,Maven 会首先寻找 POM 所在的文件夹,而后获取其中的配置信息,最初执行它将要做的工作。
Super POM
POM 文件之间能够有依赖关系,一个 POM 文件能够应用它继承的 POM 文件的配置信息。所有的 POM 文件都隐式地继承于 super-POM,super-POM 的内容可见:https://maven.apache.org/ref/…
Minimal 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>
组 id,id 和版本组成一个我的项目残缺的非法名称,例如组 id 为com.xich.app
,我的项目 id 为super-teacher
,版本号为1.0.0.RELEASE
。那么一个非法的残缺的项目名称为com.xich.app:super-teacher:1.0.0.RELEASE
。
下面的最小 POM 配置没有告知 Maven 要执行什么指标 (goal),那么 Maven 就会执行默认的指标(记住,这些默认的配置来自 POM 文件继承的 super-POM)。默认指标就是将目前这个我的项目打包为一个jar
包。
最小 POM 配置也没有阐明 Maven 仓库的地址,super-POM 中申明了仓库为https://repo.maven.apache.org/maven2
,那么它就会从这个仓库中下载所需的包。
我的项目继承
POM 中可被合并的元素包含:
dependencies
:依赖
developers and contributors
:开发者和贡献者
plugin lists
:插件列表
plugin executions with matching ids
:带有 id 的插件执行
plugin configuration
:插件配置
resources
:资源
你能够应用 parent
元素申明继承。
例子
以最小 POM 中的 POM 为例子,即com.mycompany.app:my-app:1
,咱们引入另一个我的项目:com.mycompany.app:module-alpha:1
我的项目的目录构造:
.
|--module-alpha
| --pom.xml
--pom.xml
能够看到 module-alpha.pom.xml
是com.mycompany.app:module-alpha:1
的 POM 配置。
当初,咱们想让 com.mycompany.app:my-app:1
作为父我的项目,那么 module-alpha
的pom.xml
应该为
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.mycompany.app</groupId>
<artifactId>module-alpha</artifactId>
<version>1</version>
</project>
其中 relativePath
指定了 POM 的所在位置
我的项目整合 (Project Aggregation)
我的项目整合相似我的项目继承,但它不是指定模块的 POM 作为父级 POM,而是指定父级 POM 中的模块进行整合。这样,父级我的项目就晓得它的模块有哪些,如果一个 Maven 指令在父我的项目中执行,那么 Maven 指令同样会执行在父我的项目的模块中。
具体用法:
- 将父级 POM 打包进
pom
- 在父级 POM 中指定其子模块的目录
例子
仍然是取下面的两个 POM 作为示例
位于 .\pom.xml
的com.mycompany.app:my-app:1
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>
位于 .\module-alpha\pom.xml
的com.mycompany.app:module-alpha:1
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>module-alpha</artifactId>
<version>1</version>
</project>
要把 module-alpha
整合进 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>module-alpha</module>
</modules>
</project>
下面的 POM 没有申明 module-alpha
的门路,是因为个别状况下,模块的 POM 在父级 POM 的下一级目录,且目录名称个别为模块名称。如果模块的门路不合乎上述标准,那么 module
元素中应该表明模块的门路,例如:
<modules>
<module>../my-module</module>
</modules>
变量
POM 有预约义变量和自定义变量。例如版本号元素 version
是project
元素上的子元素,那么能够通过以下形式复用这个变量。
<version>${project.version}</version>
变量是在继承后处理的。因而,如果在 POM 中定义了某个父级 POM 中已有的变量,那么父级 POM 中的变量就会被笼罩掉。
非凡变量
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>
自定义工夫戳格局的语法可见:https://docs.oracle.com/javas…
自定义变量能够应用 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>
以上例子中在 properties
定义了 mavenVersion
,在dependencies
中引入两个都应用了这个变量作为版本号,调用变量的语法为${变量名}
。