POM 是 Project Object Model 的缩写,即项目对象模型。
pom.xml 就是 maven 的配置文件,用以描述项目的各种信息。
pom 配置一览:
4.0.0 ... ...... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...... ... ... ...
一般 jar 包被识别为: groupId:artifactId:version 的形式。
在 maven 中,根据 groupId、artifactId、version 组合成 groupId:artifactId:version 来唯一识别一个 jar 包。
groupId - 团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着 java 的包结构。
artifactId - 单独项目的唯一标识符。比如我们的 tomcat、commons 等。不要在 artifactId 中包含点号(.)。
version - 一个项目的特定版本。
packaging - 项目的类型,描述了项目打包后的输出,默认是 jar。常见的输出类型为:pom, jar, maven-plugin, ejb, war, ear, rar, par。
dependencies:
... ... ... org.apache.maven maven-embedder2.0 jar test true org.apache.maven maven-core
groupId, artifactId, version - 和基本配置中的 groupId、artifactId、version 意义相同。
type - 对应 packaging 的类型,如果不使用 type 标签,maven 默认为 jar。
scope - 此元素指的是任务的类路径(编译和运行时,测试等)以及如何限制依赖关系的传递性。有 5 种可用的限定范围:
systemPath - 仅当依赖范围是系统时才使用。否则,如果设置此元素,构建将失败。该路径必须是绝对路径,因此建议使用 propertie 来指定特定的路径,如$ {java.home} / lib。由于假定先前安装了系统范围依赖关系,maven 将不会检查项目的仓库,而是检查库文件是否存在。如果没有,maven 将会失败,并建议您手动下载安装。
optional - optional 让其他项目知道,当您使用此项目时,您不需要这种依赖性才能正常工作。
exclusions - 包含一个或多个排除元素,每个排除元素都包含一个表示要排除的依赖关系的 groupId 和 artifactId。与可选项不同,可能或可能不会安装和使用,排除主动从依赖关系树中删除自己。
parent:
maven 支持继承功能。子 POM 可以使用 parent 指定父 POM ,然后继承其配置。
4.0.0 my-project org.codehaus.mojo my-parent2.0 ../my-parent
dependencyManagement
dependencyManagement 是表示依赖 jar 包的声明。即你在项目中的 dependencyManagement 下声明了依赖,maven 不会加载该依赖,dependencyManagement 声明可以被子 POM 继承。
dependencyManagement 的一个使用案例是当有父子项目的时候,父项目中可以利用 dependencyManagement 声明子项目中需要用到的依赖 jar 包,之后,当某个或者某几个子项目需要加载该依赖的时候,就可以在子项目中 dependencies 节点只配置 groupId 和 artifactId 就可以完成依赖的引用。
dependencyManagement 主要是为了统一管理依赖包的版本,确保所有子项目使用的版本一致,类似的还有plugins和pluginManagement。
modules
子模块列表。
4.0.0 org.codehaus.mojo my-parent2.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: 值定义了资源的路径。构建的默认目录是[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vc25Mils-1684164371011)(https://g.yuque.com/gr/latex?%7Bbasedir%7D%2Fsrc%2Fmain%2Fresources%E3%80%82%0Aincludes%3A%20%E4%B8%80%E7%BB%84%E6%96%87%E4%BB%B6%E5%8C%B9%E9%85%8D%E6%A8%A1%E5%BC%8F%EF%BC%8C%E6%8C%87%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%AD%E8%A6%81%E5%8C%85%E6%8B%AC%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BD%BF%E7%94%A8*%E4%BD%9C%E4%B8%BA%E9%80%9A%E9%85%8D%E7%AC%A6%E3%80%82%0Aexcludes%3A%20%E4%B8%8E%20includes%20%E7%B1%BB%E4%BC%BC%EF%BC%8C%E6%8C%87%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%AD%E8%A6%81%E6%8E%92%E9%99%A4%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BD%BF%E7%94%A8*%E4%BD%9C%E4%B8%BA%E9%80%9A%E9%85%8D%E7%AC%A6%E3%80%82%E6%B3%A8%E6%84%8F%EF%BC%9A%E5%A6%82%E6%9E%9C%20include%20%E5%92%8C%20exclude%20%E5%8F%91%E7%94%9F%E5%86%B2%E7%AA%81%EF%BC%8Cmaven%20%E4%BC%9A%E4%BB%A5%20exclude%20%E4%BD%9C%E4%B8%BA%E6%9C%89%E6%95%88%E9%A1%B9%E3%80%82%0AtestResources%3A%20testResources%20%E4%B8%8E%20resources%20%E5%8A%9F%E8%83%BD%E7%B1%BB%E4%BC%BC%EF%BC%8C%E5%8C%BA%E5%88%AB%E4%BB%85%E5%9C%A8%E4%BA%8E%EF%BC%9AtestResources%20%E6%8C%87%E5%AE%9A%E7%9A%84%E8%B5%84%E6%BA%90%E4%BB%85%E7%94%A8%E4%BA%8E%20test%20%E9%98%B6%E6%AE%B5%EF%BC%8C%E5%B9%B6%E4%B8%94%E5%85%B6%E9%BB%98%E8%AE%A4%E8%B5%84%E6%BA%90%E7%9B%AE%E5%BD%95%E4%B8%BA%EF%BC%9A)]{basedir}/src/test/resources 。
plugins
... org.apache.maven.plugins maven-jar-plugin2.6 false true test ... ...
... 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-ftp1.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 ... ...
这部分标签都非常简单,基本都能做到顾名思义,且都属于可有可无的标签,所以这里仅简单介绍一下:
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
profiles
activation 是一个 profile 的关键。配置文件的功能来自于在某些情况下仅修改基本 POM 的功能。这些情况通过 activation 元素指定。
... test false1.5 Windows XP Windows x865.1.2600 sparrow-type African ... ${basedir}/file2.properties ${basedir}/file1.properties