POM:Poject Object Model,项目对象模型。
项目基础信息:
modelVersion:
当前POM模型的版本。
groupId:
当前Maven项目隶属的实际项目。
artifactId:
当前Maven项目的实际项目名称。推荐使用项目名-模块名的方式。
version:
项目当前的版本。
packaging:
项目的打包方式。默认为jar。
classifier:
定义构建输出的一些附属构件。如源码、javadoc等。不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成。
artifactId-version [-classifier].packaging
name:
声明了一个对于用户更友好的项目名称。
属性配置:
properties:
- 内容属性
${basedir}:项目根目录。
${version}:项目版本。
- POM属性
${project.artifactId}:对应<project><artifactId>元素的值。
${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/。
${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/。
${project.build.directory}:项目构建输出目录,默认为target/。
${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/。
${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes/。
${project.groupId}:项目的groupId。
${project.artifactId}:项目的artifactId。
- 自定义属性
properties:
property name:
- Settings属性
用户使用以settings.开头的属性引用settings.xml文件中XML元素的值。
- Java系统属性
- 环境变量属性
用户使用以env.开头的属性引用环境变量。
依赖管理:
dependencies:依赖信息。
dependency:单一依赖信息。
groupId:依赖的组ID。
artifactId:依赖的组唯一标识。
version:依赖的版本。
type:依赖的类型,对应于项目坐标定义的packaging。
scope:依赖范围。
optional:标记依赖是否可选。
exclusions:排除传递性依赖。
exclusion:排除传递性依赖。
groupId:
artifactId:
依赖范围:
用于控制依赖与classpath(编译classpath、测试classpath、运行classpath)之间的关系。
- compile:编译依赖范围,为默认依赖范围。范围为compile的依赖,对于编译、测试、运行三种classpath都有效。
- test:测试依赖范围。范围为test的依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。
- provided:已提供依赖范围。范围为provided的依赖,对于编译和测试classpath有效,但在运行时无效。
- runtime:运行时依赖。范围为runtime的依赖,对于测试和运行classpath有效,但在编译主代码时无效。
- system:系统依赖范围。依赖范围与provided一致。使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。systemPath元素可以引用环境变量。
- import:导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。只在dependencyManagement元素下有效。
依赖范围(scope) | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行classpath有效 | 例子 |
compile | Y | Y | Y | spring-core |
test | - | Y | - | JUnit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | Maven仓库之外的类库 |
传递性依赖:
account-email->spring-core->commons-logging
Maven会解析各个直接依赖的POM,将必要的间接依赖以传递性依赖的形式引入到当前的项目中。
compile | test | provided | runtime | |
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | runtime | - | - | runtime |
当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;当第二直接依赖的范围是test的时候,依赖不会得以传递;当第二直接依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样是provided;当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性依赖的范围为润time。
依赖调解:
- 路径最近者优先。
- 第一声明者优先。
可选依赖:
项目的传递依赖中,可选依赖不会对项目产生任何影响。在理想的情况下,是不应该使用可选依赖的。
排除依赖:
显式的排除传递性依赖,而后手动指定依赖。Maven解析后的依赖中,不可能出现groupId和artifactId相同但是version不同的两个依赖。
归类依赖:
使用properties定义属性,而后使用${}进行引用。
依赖解析机制:
- 当依赖的范围是system的时候,直接从本地文件系统解析构件。
- 根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功。
- 在本地仓库不存在相应构件的情况下,如果依赖的版本是显式的发布版本构件,则遍历所有的远程仓库,发现后,下载并解析使用。
- 如果依赖的版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或者LATEST真实的值,然后基于这个真实的值检查本地和远程仓库,如步骤2和3。
- 如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该值检查本地仓库,或者从远程仓库下载。
- 如果最后解析得到的构建版本是时间戳格式的快照,则复制其时间戳格式的文件至非时间戳格式,并使用该非时间戳格式的构件。
RELEASE:最新发布版本,不包括快照版本。
LATEST:最新版本,包括快照版本。
聚合:
将多个Maven项目或模块组合成一个项目,以便进行统一的构建。
<packaging>pom</packaging>
<modules>
<module>{相对于当前POM的目录}</module>
</modules>
继承:
消除重复配置。
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<relativePath>{默认值为../pom.xml}</relativePath>
</parent>
可继承的元素:
- groupId
- version
- description
- organization
- inceptionYear:项目的创始年份。
- url:项目的URL地址。
- developers:项目的开发者信息。
- contributors:项目的贡献者信息。
- disstibutionManagement:项目的部署配置。
- issueManagement:项目的缺陷跟踪系统信息。
- ciManagement:项目的持续集成系统信息。
- scm:项目的版本控制系统信息。
- mailingLists:项目的邮件列表信息。
- properties:自定义的Maven属性。
- dependencies:项目的依赖配置。
- dependencyManagement:项目的依赖管理配置。
- repositories:项目的仓库配置。
- build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等。
- reporting:包括项目的报告输出目录配置、报告插件配置等。
依赖管理:
让子模块继承到父模块的依赖配置,同时保证子模块依赖使用的灵活性。
反应堆:
所有模块组成的一个构建结构。
properties:
propertyName:
project.build.sourceEncoding:指定读取源码及文档的编码。
project.reporting.outputEncoding:指定呈现站点的html文档的编码。
远程仓库配置:
repositories:
repository:
id:
name:
url:
releases:
enabled:
updatePolicy:配置从远程仓库检查更新的频率。
never:从不检查更新。
always:每次构建都检查更新。
interval:每隔X分钟检查一次更新。
daily:每天检查一次更新。
checksumPolicy:配置Maven检查检验和文件的策略。
warn:在执行构建时输出警告信息。
fail:在执行构建时失败。
ignore:完全忽略校验和错误。
snapshots:
enabled:
layout:
插件管理:
pluginManagement:
plugins:
plugin:
groupId:
artifactId:
executions:
execution:
id:
phase:
goals:
插件仓库配置:
pluginRepositories:
pluginRepository:
id:
name:
url:
layout:
snapshots:
enabled:
releases:
enabled:
项目构建:
build:
plugins:
plugin:
groupId:
artifactId:
configuration:
executions:
execution:执行任务。
id:
phase:绑定的生命周期。
goals:指定插件目标。
goal:
资源过滤:
resources:
resource:
directory:
filtering:
testResources:
testResource:
directory:
filtering:
profiles:
profile:
id:
properties:
activation:
property:在某个系统属性存在时自动激活profile。
name:
os:操作系统环境激活。
name:
family:
arch:
version:
file:文件存在与否激活。
missing:
exists:
activeByDefault:默认激活。
-P:在命令行激活一个profile。
项目发布:
distributionManagement:
repository:发布版本仓库。
id:
name:
url:
snapshotRepository:快照版本仓库。
id:
name:
url:
项目信息:
scm:
connection:
developerConnection:
url:
ciManagement:
system:
url:
developers:
developer:
id:
name:
email:
timezone:
issueManagement:
system:
url:
licenses:
license:
name:
url:
快照版本:
在发布快照版本时,Maven为其打上时间戳。在项目依赖时,如果依赖的版本为快照版本,则按照更新规则更新快照版本。
快照版本只应该在组织内部的项目或模块间依赖使用。项目不应该依赖于任何组织外部的快照版本依赖。
Maven约定:
- 源码目录未src/main/java/
- 编译输出目录未target/classes/
- 打包方式为jar
- 包输出目录未target/