Java maven构建命令使用总结
实践环境
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
maven构建生命周期
学习Maven构建命令之前,我们不烦先简单了解下Maven构建生命周期。
Maven基于构建生命周期的核心概念。构建生命周期由phase(形如clean,compile, install等)组成。每个phase由插件目标Plugin goal(形如sonar:sonar)组成。也就是说,每个phase负责构建生命周期中的特定步骤,并且通过绑定到该phase的的插件来实现这些步骤的具体执行。
每个插件目标代表一个特定的任务(比phase更精细),可能绑定到0个或多个构建phase。未绑定到任何phase的目标可以通过直接调用在构建生命周期之外执行。执行顺序取决于插件目标和phase的顺序
默认的生命周期由以下phase组成( 点击查看完整的phase列表)
validate- 校验项目是否是正确,并且是否可获取所有必要信息compiletestpackageverify- 对集成测试结果进行检查以确保满足关键质量。installdeploy
maven构建命令
mvn [选项] [
常用选项:
-f,--file 强制使用指定的POM文件
-U,--update-snapshots 强制检查缺少的release版和远程仓库已更新snapshots版(Forces a check for missing releases and updated snapshots on remote repositories)。个人理解:
- 如果构建依赖的
release版软件包在本地仓库不存在,则强制从远程仓库下载最新release版依赖包,否则不下载,使用本地仓库已有的release版依赖包 - 不管构建依赖的
snapshots版软件包在本地仓库是否存在,都强制检查远程仓库对应版本的软件包是否存在更新,如果存在则下载更新。
-N,--non-recursive 不递归到子项目(子模块)。
说明:多个goal、phase之间使用空格分隔。
示例:
# mvn clean -Dautoconfig.skip=true -Dmaven.test.skip=true install
常用内置phase介绍
clean 删除前一次构建生成的文件,包括classes目录中的.class文件,但不会删除classes, generated-sources, maven-status目录。
compile 编译项目源代码,会生成.class文件和对应软件包,注意:*.class以及软件包(比如*.jar)不存在,或者源代码有变动的情况下,执行编译,才会重新生成*.class及对应软件包,package,install,deploy等皆如此。
test 使用合适的单元测试框架(默认为Junit)运行测试。这些测试不应要求打包或部署代码。可使用-Dmaven.test.skip=true、-DskipTests参数跳过测试。这两者的区别在于:
-DskipTests不执行测试用例,但编译测试用例类生成相应的.class文件到target/test-classes下。-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。
package 获取编译后的代码,并将其打包为可分发的格式,例如jar
install 将打包的软件包安装至本地仓库,为本地其它项目提供依赖。实践表名,执行install命令,可能会生成在compile阶段未生成的软件包。
deploy 在集成或发布环境中完成,将最终软件包复制到远程存仓库,以便与其他开发人员和项目共享。
注意:
1、phase之间,phase和goal之间是有顺序区分的,按从左到右的顺序执行,如下两个命令,看似相同,执行效果是不一样的。
# mvn clean install # 先执行clean,再执行install
# mvn install clean # 先执行install,再执行clean
2、maven执行某个phase之前,会优按顺序执行该phase所属生命周期内,位于其之前的所有phase,比如执行默认生命周期的install,会优先执行validate —> compile -> test -> package -> verify(假设未使用其它会跳过phase的选项参数)
插件目标应用举例
sonar扫描
# mvn clean -Dautoconfig.skip=true -Dmaven.test.skip=true compile org.jacoco:jacoco-maven-plugin:prepare-agent sonar:sonar
问题:这里为啥需要用org.jacoco:jacoco-maven-plugin:prepare-agent插件目标呢?
答案:因为仅靠SonarQube本身是不知道实际上执行了哪些测试以及它们如何覆盖代码的,要获取此信息,它依赖于第三方测试覆盖率工具,对于Java,它依赖于JaCoCo收集和提供的数据
关于父POM构建
假设项目中包含子项目、模块,那么构建父POM时,会按序构建所有子项目、子模块,可以简单理解为批量构建。
参考连接
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven/
https://maven.apache.org/run.html