type
status
date
slug
summary
tags
category
password
1、概述
pom.xml 文件是整个 Maven 项目的核心配置文件。pom.xml 文件记录了整个项目的基础配置信息、相关依赖插件、构建配置和远程库等信息。pom.xml 文件整体内容我总结为五个部分:- 基本设置
- 依赖设置
- 构建设置
- 项目信息设置
- 环境设置
前三部分基本所有 Maven 项目都会涉及,应该重点掌握。
2、基本配置
基本配置的元素是所有 Maven 项目必须配置的,如果没有配置项目在编译的时候就会报错。基本结构如下:
2.1 modelVersion
POM 模型版本,一般写
4.0.0 版本,该版本是同时被 Maven2 和 Maven3 支持的版本。2.2 groupId、artifactId、version
在 maven 中,根据
groupId、artifactId、version 组合成 groupId:artifactId:version 来唯一识别一个 jar 包在仓库的坐标位置,被称为 maven 坐标。- groupId - 团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着 java 的包结构。
- artifactId - 单独项目的唯一标识符。比如我们的 tomcat、commons 等。不要在 artifactId 中包含点号
.。
- version - 项目的版本号。版本号命名是有规定的,例如 Spring Boot 采用的版本号命名风格。
- Major 主版本号,当有非兼容性的变更时,递增主版本号。
- Minor 次版本号,当以可向后兼容的方式增加了功能时,递增次的版本号。
- Patch 补丁版本号,当有向后兼容的 bug 修复时,递增补丁版本号。
- Label 标记,用来区分开发版、快照版、里程碑版、正式发行版。各个版本说明如下:
- SNAPSHOT - 这个版本一般用于开发过程中,表示不稳定的版本。每次刷新项目依赖时都会去远程库中查看是否有最新版本。
- LATEST - 指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个 snapshot 版,具体看哪个时间最后。
- RELEASE :指最后一个发布版。只要版本号不变,就算远程库中该版本号的项目进行了更新,也不会去远程库中拉取最新版本的项目

2.3 packaging
项目的类型,描述了项目打包后的输出,输出类型有:
pom, jar, maven-plugin, ejb, war, ear, rar, par。默认是 jar。- pom:在父级项目中的 pom.xml 文件使用的 packaging 配置一定为 pom。父级的 pom 文件只作项目的子模块的整合,在
maven install时不会生成 jar/war 压缩包。
父级 pom 文件的作用:
- 可以通过
<modules>标签来整合子模块的编译顺序(Maven引入依赖使用最短路径原则,例如 a<–b<–c1.0 ,d<–e<–f<–c1.1,由于路径最短,最终引入的为 c1.0;但路径长度相同时,则会引入先申明的依赖)。因此尽量将更加底层的 service 放在更先的位置优先加载依赖较为合适。
- 可以将一些子项目中共用的依赖或将其版本统一写到父级配置中,以便统一管理。
- groupId、artifactId、version能直接从父级继承,减少子项目的 pom 配置。
- jar:默认打包方式,这种打包方式意味着在
maven build时会将这个项目中的所有 java 文件都进行编译形成.class文件,且按照原来的 java 文件层级结构放置,最终压缩为一个 jar 文件。
- war:war 包与 jar 包非常相似,同样是编译后的
.class文件按层级结构形成文件树后打包形成的压缩包。不同的是,它会将项目中依赖的所有jar包都放在WEB-INF/lib这个文件夹下。WEB-INF/classes文件夹仍然放置我们自己代码的编译后形成的内容。war 包非常适合部署时使用,不再需要下载其他的依赖包,能够使用户拿到 war 包直接使用,因此它经常使用于微服务项目群中的入口项目的 pom 配置中。
3、依赖配置
3.1 parent
父项目坐标,类似于 java 的集成,将继承父项目的依赖和插件等。
- relativePath - 注意
relativePath元素。在搜索本地和远程存储库之前,它不是必需的,但可以用作 maven 的指示符,以首先搜索给定该项目父级的路径。
3.2 properties
POM 定义的常量,可供 POM 文件的其他地方引用,格式是
<name>value</name>,引用时通过 ${name} 来获取 value 的值。Maven 总共有 6 类属性:
- 内置属性:主要用两个常用内置属性
-
${basedir}表示项目根目录,即包含 pom.xml 文件的目录。 ${version}表示项目版本。
- POM 属性:引用本 POM 文件中对应元素的值。如
${project.artifactId}就对应了<project><artifactId>xxx</artifactId></project>元素的值,常用的 POM 属性包括: ${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/${project.build.directory}:项目构建输出目录,默认为target/${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/${project.testOutputDirectory}:项目测试主代码输出目录,默认为target/testclasses/${project.groupId}:项目的 groupId${project.artifactId}:项目的 artifactId${project.version}:项目的 version,与${version}等价${project.build.finalName}:项目打包输出文件的名称,默认为{project.artifactId}-${project.version}
- Settings 属性:同理 POM 属性,引用
settings.xml文件中的 XML 元素的值,以settings.开头。如${settings.localRepository}指向用户本地仓库的地址。
- Java 属性:引用 java 系统属性,以
java.开头,如${java.home}指向了 java 根目录。
- ENV 属性:引用所有环境变量属性,以
env.开头,如${env.JAVA_HOME}指代了 JAVA_HOME 环境变量的的值。
- 自定义属性。可在其他地方通过
${}来引用该属性。例如下面就定义了 java 属性的版本号,并自定义了一个 file.encoding 属性。
3.3 dependencies
定义了项目相关的所有依赖,每一个依赖包由
<dependency> 包围,<groupId>、<artifactId>、<version> 标签定义了依赖包在仓库中的唯一坐标,Maven 根据该坐标按照 本地仓库 > 中央仓库 > 远程仓库 的查找顺序去查找依赖包。- groupId, artifactId, version - 和基本配置中的
groupId、artifactId、version意义相同。
- type - 对应
packaging的类型,如果不使用type标签,maven 默认为 jar。
- scope - 此元素指的是任务的类路径(编译和运行时,测试等)以及如何限制依赖关系的传递性。有 5 种可用的限定范围:
- compile - 默认的
scope,参与当前项目的编译、运行、测试、打包等全过程参与(程序员写的业务代码)。此外,这些依赖关系被传播到依赖项目。 - provided - 编译、运行、测试阶段参与,打包阶段不参与,不可传递。(例如
servlet-api.jar、JDK)。 - runtime - 编译不参与,在运行、测试、打包阶段参与。(例如
mysql.jar驱动) - test - 只在测试阶段参与,编译、运行和打包阶段不参与,不可传递。(例如
junit.jar) - system - 不是从本地 maven 仓库引入,而是在本地目录的下的 jar,与 provided 相似 。一般不使用。 (oracle 驱动
ojdbc14.jar)
- systemPath - 仅当依赖范围是系统时才使用。否则,如果设置此元素,构建将失败。该路径必须是绝对路径,因此建议使用
propertie来指定特定的路径,如$ {java.home} / lib。由于假定先前安装了系统范围依赖关系,maven 将不会检查项目的仓库,而是检查库文件是否存在。如果没有,maven 将会失败,并建议您手动下载安装。
- optional -
optional用来控制当前依赖是否向下传递成为间接依赖;optional 默认值为 false,表示可以向下传递称为间接依赖;为 true 则表示当前依赖不能向下传递成为间接依赖。仅适用于项目的单纯依赖关系,不适合父子工程。假设 A 工程是 parent,那么 A 工程即便加上了 optinal,子项目也将继承父工程的所有依赖关系。
3.4 dependencyManagement
继承父类的依赖,但是只是作为一个范围约束,只有子项目通过
<dependency> 显示引入该范围内的依赖才算真正引入。这种继承方式更加灵活,而且子项目的 <dependency> 里面不需要说明 version 版本号,可以在父项目里面统一管理版本号。父项目通过
<dependencyManagement> 限制依赖范围。子类引入父项目的依赖范围,通过
<dependency> 真正引入依赖,不用添加版本号。3.5 modules
子模块列表。
4、构建配置
4.1 bulid
build 可以分为
project build 和 profile build。项目的构建信息,可以分为五大部分
- 基本构建配置
- 扩展配置
- 目录配置
- 资源配置
- 插件配置
4.1.1 基本构建配置
4.1.2 扩展配置
简单来讲,extensions 是在 build 过程被激活的产品。
4.1.3 目录配置
4.1.4 资源配置
4.1.5 插件配置
4.2 reporting
报告包含特定针对
site 生成阶段的元素。某些 maven 插件可以生成 reporting 元素下配置的报告,例如:生成 javadoc 报告。reporting 与 build 元素配置插件的能力相似。明显的区别在于:在执行块中插件目标的控制不是细粒度的,报表通过配置 reportSet 元素来精细控制。而微妙的区别在于 reporting 元素下的 configuration 元素可以用作 build 下的 configuration ,尽管相反的情况并非如此( build 下的 configuration 不影响 reporting 元素下的 configuration )。另一个区别就是
plugin 下的 outputDirectory 元素。在报告的情况下,默认输出目录为 ${basedir}/target/site。5、环境信息设置
项目信息相关的这部分标签都不是必要的,也就是说完全可以不填写。这里只做简单介绍。
6、环境设置
这里介绍几个常用的环境配置
6.1 repositories
远程仓库列表,当 Maven 在本地仓库和中央仓库中找不到所需要的依赖包时就会去远程仓库查找,可通过
<repository> 定义多个远程仓库。pluginRepositories 的作用和配置类同 repositories 。6.2 distributionManagement
管理构建过程中生成的 artifact,包括部署到远程仓库、生成站点信息等。
6.3 profiles
profiles 是用来解决多环境切换的问题。比如我们有三套开发、测试、正式三套环境,在 pom.xml 中添加以下配置我们有三种方式激活不同的环境:
activation激活。在activation中配置了默认的选项activeByDefault,所以默认激活的是 prod 环境。
- 命令行激活。在命令行使用
-P参数可以激活test环境。
activeProfiles激活。下面配置也可以激活test环境
pom.xml 中的 profile 可以看做 pom.xml 的副本,可以使用与 pom.xml 相同的子元素与配置方法。你没看错,profiles 里面可以使用上面列出来的所有元素!这里只介绍 profile 里面特有的 activation 元素,表示用来激活 profile 的条件。profile配置项在setting.xml中也有,是pom.xml中profile元素的裁剪版本,只包含了id,activation,repositories,pluginRepositories和properties五个元素。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。参考Maven系列:Settings配置。
参考
- Author:mcbilla
- URL:http://mcbilla.com/article/3c46171c-4823-4d56-ae33-adb95514cf90
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts
