:notebook: 本文已归档到:「」
简介
什么是 pom?
POM 是 Project Object Model 的缩写,即项目对象模型。
pom.xml 就是 maven 的配置文件,用以描述项目的各种信息。
pom 配置一览
复制代码 4.0.0 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
基本配置
- project -
project
是 pom.xml 中描述符的根。 - modelVersion -
modelVersion
指定 pom.xml 符合哪个版本的描述符。maven 2 和 3 只能为 4.0.0。
一般 jar 包被识别为: groupId:artifactId:version
的形式。
复制代码 4.0.0 org.codehaus.mojo my-project 1.0 war
maven 坐标
在 maven 中,根据 groupId
、artifactId
、version
组合成 groupId:artifactId:version
来唯一识别一个 jar 包。
- groupId - 团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着 java 的包结构。
- artifactId - 单独项目的唯一标识符。比如我们的 tomcat、commons 等。不要在 artifactId 中包含点号(.)。
- version - 一个项目的特定版本。
- maven 有自己的版本规范,一般是如下定义 major version、minor version、incremental version-qualifier ,比如 1.2.3-beta-01。要说明的是,maven 自己判断版本的算法是 major、minor、incremental 部分用数字比较,qualifier 部分用字符串比较,所以要小心 alpha-2 和 alpha-15 的比较关系,最好用 alpha-02 的格式。
- maven 在版本管理时候可以使用几个特殊的字符串 SNAPSHOT、LATEST、RELEASE。比如
1.0-SNAPSHOT
。各个部分的含义和处理逻辑如下说明:- SNAPSHOT - 这个版本一般用于开发过程中,表示不稳定的版本。
- LATEST - 指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个 snapshot 版,具体看哪个时间最后。
- RELEASE :指最后一个发布版。
- packaging - 项目的类型,描述了项目打包后的输出,默认是 jar。常见的输出类型为:pom, jar, maven-plugin, ejb, war, ear, rar, par。
依赖配置
dependencies
... 复制代码... ... org.apache.maven maven-embedder 2.0 jar test true org.apache.maven maven-core
- groupId, artifactId, version - 和基本配置中的
groupId
、artifactId
、version
意义相同。 - type - 对应
packaging
的类型,如果不使用type
标签,maven 默认为 jar。 - scope - 此元素指的是任务的类路径(编译和运行时,测试等)以及如何限制依赖关系的传递性。有 5 种可用的限定范围:
- compile - 如果没有指定
scope
标签,maven 默认为这个范围。编译依赖关系在所有 classpath 中都可用。此外,这些依赖关系被传播到依赖项目。 - provided - 与 compile 类似,但是表示您希望 jdk 或容器在运行时提供它。它只适用于编译和测试 classpath,不可传递。
- runtime - 此范围表示编译不需要依赖关系,而是用于执行。它是在运行时和测试 classpath,但不是编译 classpath。
- test - 此范围表示正常使用应用程序不需要依赖关系,仅适用于测试编译和执行阶段。它不是传递的。
- system - 此范围与 provided 类似,除了您必须提供明确包含它的 jar。该 artifact 始终可用,并且不是在仓库中查找。
- compile - 如果没有指定
- systemPath - 仅当依赖范围是系统时才使用。否则,如果设置此元素,构建将失败。该路径必须是绝对路径,因此建议使用
propertie
来指定特定的路径,如$ {java.home} / lib。由于假定先前安装了系统范围依赖关系,maven 将不会检查项目的仓库,而是检查库文件是否存在。如果没有,maven 将会失败,并建议您手动下载安装。 - optional -
optional
让其他项目知道,当您使用此项目时,您不需要这种依赖性才能正常工作。 - exclusions - 包含一个或多个排除元素,每个排除元素都包含一个表示要排除的依赖关系的
groupId
和artifactId
。与可选项不同,可能或可能不会安装和使用,排除主动从依赖关系树中删除自己。
parent
maven 支持继承功能。子 POM 可以使用 parent
指定父 POM ,然后继承其配置。
复制代码 4.0.0 org.codehaus.mojo my-parent 2.0 ../my-parent my-project
- relativePath - 注意
relativePath
元素。在搜索本地和远程存储库之前,它不是必需的,但可以用作 maven 的指示符,以首先搜索给定该项目父级的路径。
dependencyManagement
dependencyManagement
是表示依赖 jar 包的声明。即你在项目中的 dependencyManagement
下声明了依赖,maven 不会加载该依赖,dependencyManagement
声明可以被子 POM 继承。
dependencyManagement
的一个使用案例是当有父子项目的时候,父项目中可以利用 dependencyManagement
声明子项目中需要用到的依赖 jar 包,之后,当某个或者某几个子项目需要加载该依赖的时候,就可以在子项目中 dependencies
节点只配置 groupId
和 artifactId
就可以完成依赖的引用。
dependencyManagement
主要是为了统一管理依赖包的版本,确保所有子项目使用的版本一致,类似的还有plugins
和pluginManagement
。
modules
子模块列表。
复制代码 4.0.0 org.codehaus.mojo my-parent 2.0 pom my-project another-project third-project/pom-example.xml
properties
属性列表。定义的属性可以在 pom.xml 文件中任意处使用。使用方式为 ${propertie}
。
... 复制代码... 1.7 1.7 UTF-8 UTF-8
构建配置
build
build 可以分为 "project build" 和 "profile build"。
... 复制代码... ...
基本构建配置:
复制代码 install ${basedir}/target ${artifactId}-${version} ... filters/filter1.properties
defaultGoal : 默认执行目标或阶段。如果给出了一个目标,它应该被定义为它在命令行中(如 jar:jar)。如果定义了一个阶段(如安装),也是如此。
directory :构建时的输出路径。默认为:${basedir}/target
。
finalName :这是项目的最终构建名称(不包括文件扩展名,例如:my-project-1.0.jar)
filter :定义 * .properties
文件,其中包含适用于接受其设置的资源的属性列表(如下所述)。换句话说,过滤器文件中定义的“name = value”对在代码中替换$ {name}字符串。
resources
资源的配置。资源文件通常不是代码,不需要编译,而是在项目需要捆绑使用的内容。
复制代码 ... META-INF/plexus false ${basedir}/src/main/plexus configuration.xml **/*.properties ... ...
- resources: 资源元素的列表,每个资源元素描述与此项目关联的文件和何处包含文件。
- targetPath: 指定从构建中放置资源集的目录结构。目标路径默认为基本目录。将要包装在 jar 中的资源的通常指定的目标路径是 META-INF。
- filtering: 值为 true 或 false。表示是否要为此资源启用过滤。请注意,该过滤器
* .properties
文件不必定义为进行过滤 - 资源还可以使用默认情况下在 POM 中定义的属性(例如$ {project.version}),并将其传递到命令行中“-D”标志(例如,“-Dname = value”)或由 properties 元素显式定义。过滤文件覆盖上面。 - directory: 值定义了资源的路径。构建的默认目录是
${basedir}/src/main/resources
。 - includes: 一组文件匹配模式,指定目录中要包括的文件,使用*作为通配符。
- excludes: 与
includes
类似,指定目录中要排除的文件,使用*作为通配符。注意:如果include
和exclude
发生冲突,maven 会以exclude
作为有效项。 - testResources:
testResources
与resources
功能类似,区别仅在于:testResources
指定的资源仅用于 test 阶段,并且其默认资源目录为:${basedir}/src/test/resources
。
plugins
复制代码 ... org.apache.maven.plugins maven-jar-plugin 2.6 false true test ... ...
-
groupId, artifactId, version :和基本配置中的
groupId
、artifactId
、version
意义相同。 -
extensions :值为 true 或 false。是否加载此插件的扩展名。默认为 false。
-
inherited :值为 true 或 false。这个插件配置是否应该适用于继承自这个插件的 POM。默认值为 true。
-
configuration - 这是针对个人插件的配置,这里不扩散讲解。
-
dependencies :这里的
dependencies
是插件本身所需要的依赖。 -
executions :需要记住的是,插件可能有多个目标。每个目标可能有一个单独的配置,甚至可能将插件的目标完全绑定到不同的阶段。执行配置插件的目标的执行。
- id: 执行目标的标识。
- goals: 像所有多元化的 POM 元素一样,它包含单个元素的列表。在这种情况下,这个执行块指定的插件目标列表。
- phase: 这是执行目标列表的阶段。这是一个非常强大的选项,允许将任何目标绑定到构建生命周期中的任何阶段,从而改变 maven 的默认行为。
- inherited: 像上面的继承元素一样,设置这个 false 会阻止 maven 将这个执行传递给它的子代。此元素仅对父 POM 有意义。
- configuration: 与上述相同,但将配置限制在此特定目标列表中,而不是插件下的所有目标。
... 复制代码maven-antrun-plugin 1.1 echodir run verify false Build Dir: ${project.build.directory}
pluginManagement
与 dependencyManagement
很相似,在当前 POM 中仅声明插件,而不是实际引入插件。子 POM 中只配置 groupId
和 artifactId
就可以完成插件的引用,且子 POM 有权重写 pluginManagement 定义。
它的目的在于统一所有子 POM 的插件版本。
directories
... 复制代码${basedir}/src/main/java ${basedir}/src/main/scripts ${basedir}/src/test/java ${basedir}/target/classes ${basedir}/target/test-classes ...
目录元素集合存在于 build
元素中,它为整个 POM 设置了各种目录结构。由于它们在配置文件构建中不存在,所以这些不能由配置文件更改。
如果上述目录元素的值设置为绝对路径(扩展属性时),则使用该目录。否则,它是相对于基础构建目录:${basedir}
。
extensions
扩展是在此构建中使用的 artifacts 的列表。它们将被包含在运行构建的 classpath 中。它们可以启用对构建过程的扩展(例如为 Wagon 传输机制添加一个 ftp 提供程序),并使活动的插件能够对构建生命周期进行更改。简而言之,扩展是在构建期间激活的 artifacts。扩展不需要实际执行任何操作,也不包含 Mojo。因此,扩展对于指定普通插件接口的多个实现中的一个是非常好的。
... 复制代码... ... org.apache.maven.wagon wagon-ftp 1.0-alpha-3
reporting
报告包含特定针对 site
生成阶段的元素。某些 maven 插件可以生成 reporting
元素下配置的报告,例如:生成 javadoc 报告。reporting
与 build
元素配置插件的能力相似。明显的区别在于:在执行块中插件目标的控制不是细粒度的,报表通过配置 reportSet
元素来精细控制。而微妙的区别在于 reporting
元素下的 configuration
元素可以用作 build
下的 configuration
,尽管相反的情况并非如此( build
下的 configuration
不影响 reporting
元素下的 configuration
)。
另一个区别就是 plugin
下的 outputDirectory
元素。在报告的情况下,默认输出目录为 ${basedir}/target/site
。
... 复制代码... ... sunlink javadoc true http://java.sun.com/j2se/1.5.0/docs/api/
项目信息
项目信息相关的这部分标签都不是必要的,也就是说完全可以不填写。
它的作用仅限于描述项目的详细信息。
下面的示例是项目信息相关标签的清单:
... 复制代码maven-notes maven 学习笔记 https://github.com/dunwu/maven-notes 2017 Apache License, Version 2.0 https://www.apache.org/licenses/LICENSE-2.0.txt repo A business-friendly OSS license ... ... victor Zhang Peng forbreak at 163.com https://github.com/dunwu ... ... architect developer +8 ... ...
这部分标签都非常简单,基本都能做到顾名思义,且都属于可有可无的标签,所以这里仅简单介绍一下:
-
name - 项目完整名称
-
description - 项目描述
-
url - 一般为项目仓库的 host
-
inceptionYear - 开发年份
-
licenses - 开源协议
-
organization - 项目所属组织信息
-
developers - 项目开发者列表
-
contributors - 项目贡献者列表,
<contributor>
的子标签和<developer>
的完全相同。
环境配置
issueManagement
这定义了所使用的缺陷跟踪系统(Bugzilla,TestTrack,ClearQuest 等)。虽然没有什么可以阻止插件使用这些信息的东西,但它主要用于生成项目文档。
... 复制代码... Bugzilla http://127.0.0.1/bugzilla/
ciManagement
CI 构建系统配置,主要是指定通知机制以及被通知的邮箱。
... 复制代码... continuum http://127.0.0.1:8080/continuum true true false false continuum@127.0.0.1
mailingLists
邮件列表
... 复制代码... User List user-subscribe@127.0.0.1 user-unsubscribe@127.0.0.1 user@127.0.0.1 http://127.0.0.1/user/ http://base.google.com/base/1/127.0.0.1
scm
SCM(软件配置管理,也称为源代码/控制管理或简洁的版本控制)。常见的 scm 有 svn 和 git 。
... 复制代码... scm:svn:http://127.0.0.1/svn/my-project scm:svn:https://127.0.0.1/svn/my-project HEAD http://127.0.0.1/websvn/my-project
prerequisites
POM 执行的预设条件。
... 复制代码... 2.0.6
repositories
repositories
是遵循 Maven 存储库目录布局的 artifacts 集合。默认的 Maven 中央存储库位于https://repo.maven.apache.org/maven2/上。
... 复制代码false always warn true never fail codehausSnapshots Codehaus Snapshots http://snapshots.maven.codehaus.org/maven2 default ... ...
pluginRepositories
与 repositories
差不多。
... 复制代码... ...http://mojo.codehaus.org/my-project deployed
distributionManagement
它管理在整个构建过程中生成的 artifact 和支持文件的分布。从最后的元素开始:
... 复制代码... ...http://mojo.codehaus.org/my-project deployed
-
repository - 与
repositories
相似 -
site - 站点信息
-
relocation - 项目迁移位置
profiles
activation
是一个 profile
的关键。配置文件的功能来自于在某些情况下仅修改基本 POM 的功能。这些情况通过 activation
元素指定。
... 复制代码test ... false 1.5 Windows XP Windows x86 5.1.2600 sparrow-type African ${basedir}/file2.properties ${basedir}/file1.properties