Maven
maven生命周期
- clean: 删除构建目录
- validate: 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
- compile: 编译工程源码
- test: 使用适当的单元测试框架(例如JUnit)运行测试。
- package: 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件
- verify: 运行检查操作来验证工程包是有效的,并满足质量要求。
- install: 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
- site: 创建新的报告文档、部署站点等
- deploy: 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。
pom.xml常用节点
基本信息
4.0.0
com.xstore.order.production
xstore-order-production
xstore-order-production
pom
1.0-SNAPSHOT
groupId
, artifactId
, name
, version
构成应用的坐标
packaging
默认为 jar
packaging
default bindings
- pom 声明该artifact仅仅是pom文件,是子模块的容器
- jar
- ejb
- maven-plugin
- war
- ear
- rar
version
- SNAPSHOT:快照版本
- ALPHA:内测版本
- BETA:公测版本
- RELEASE:稳定版本
- GA:正式发布
properties
dependencyManagement
build
Core Maven Plugins
The Resources Plugin
资源插件将文件从输入资源目录复制到输出目录。
- resources: 将main源码下的资源文件复制到main输出目录中
- testResources: 将test源码下的资源文件复制到test输出目录中
- copy-resources: 讲任意资源文件复制到输出目录中,需要指定来源和输出目录
maven-resources-plugin
3.0.2
output-resources
input-resources
*.png
true
上面的配置,将input-resources中的资源文件复制到output-resuorces中,并且排除了以png为后缀的文件。
其中filtering设置为true,则会用properties中声明的变量替换资源文件中的占位符变量:
Baeldung
将替代资源文件中包含如下文本的地方:
Welcome to ${resources.name}!
The Compiler Plugin
用以构建源码
- compile 编译main下的源码
- testCompile 编译test下的源码
maven-compiler-plugin
3.7.0
1.8
方便起见,可以将版本号声明为一个属性:
1.8
1.8
可以做一些额外的设置,如警告unchecked操作:
-Xlint:unchecked
The Surefire Plugin
用于执行单元测试,默认情况下将在target/surefire-reports
中生成xml报告
默认情况下,surefire将自动包含所有以Test
开始或以Test
,Tests
,TestCase
结束的测试类
包含在顶级POM中
- test 默认选项的goal
maven-surefire-plugin
2.21.0
DataTest.java
DataCheck.java
The Failsafe Plugin
用于项目的集成测试
与surefire插件不同的是,它必须在pom.xml中明确指定goal的值
- integeration-test: 运行集成测试,测试失败不会令构建失败
- verify: 确认集成测试通过
maven-failsafe-plugin
2.21.0
integration-test
verify
...
默认包含如下测试文件:
**/IT*.java
**/*IT.java
**/*ITCase.java
IT -> Integration Test
The Verifier Plugin
确保文件和目录的存在或不存在,也可以根据正则表达式检查文件的内容
- verify 显式指定时才会触发该插件
maven-verifier-plugin
1.1
input-resources/verifications.xml
verify
默认的检查文件位于src/test/verifier/verifications.xml
,如果想要使用别的文件,需要指定verificationFile
参数
下面的校验要求input-resources/baeldung.txt存在单词Welcome
input-resources/baeldung.txt
Welcome
The Install Plugin
将应用打包至本地仓库中。这个插件包含在顶级POM中,因此不需要显式的包含它
The Deploy Plugin
将包部署到远程Maven仓库中。
distributionManagement
用以定义要部署的仓库的信息
modules
Maven Pom Modules
my-project
another-project
third-project/pom-example.xml
无需考虑项目之间的依赖关系,maven会确保依赖的模块优先被构建
Maven 项目管理
https://blog.csdn.net/AAzpf/article/details/79650139
http://www.codebelief.com/article/2017/10/maven-best-practice-to-manage-multi-module-project/
使用maven进行模块管理,每个模块下面都有一个pom文件,pom中维护各模块之间的依赖和继承关系。
项目模块化可以将通用的部分抽离出来,方便重用。修改一部分代码不再需要build整个项目,缩短了build时间。
Maven 依赖管理
http://ifeve.com/maven-dependency-mechanism/
传递性依赖
假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。当项目中出现多个版本构件依赖的情形,依赖调解决定最终应该使用哪个版本。项目会选择依赖关系树中路径最短的版本作为依赖。当两个版本的依赖路径长度一致时,POM中依赖声明的顺序决定了哪个版本会被使用,也叫作”第一声明原则”。
依赖范围
- compile 默认范围
- provided provided范围表明你希望由JDK或者某个容器提供运行时依赖。如Servlet API和相关的Java EE APIs,会由web容器提供运行时依赖。provided依赖只对编译和测试classpath有效,并且不能传递。
- runtime 编译时不需要依赖,而只在运行时依赖。此依赖范围对运行和测试classpath有效,对编译classpath无效。
- test 只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。
- system 系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。
- import import范围只适用于pom文件中的
部分。表明指定的POM必须使用 部分的依赖。因为依赖已经被替换,所以使用import范围的依赖并不影响依赖传递。
依赖管理
Maven提供了一个机制来集中管理依赖信息,叫做依赖管理元素
。假设你有许多项目继承自同一个公有的父项目,那可以把所有依赖信息放在一个公共的POM文件,并且在子POM中简单第引用该构件即可。