实践环境

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 - 校验项目是否是正确,并且是否可获取所有必要信息
  • compile
  • test
  • package
  • verify - 对集成测试结果进行检查以确保满足关键质量。
  • install
  • deploy

maven构建命令

mvn [选项] [<goal(s)>] [<phase(s)>]

常用选项:

-f,--file <arg> 强制使用指定的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 不递归到子项目(子模块)。

说明:多个goalphase之间使用空格分隔。

示例:

# mvn clean -Dautoconfig.skip=true -Dmaven.test.skip=true install

常用内置phase介绍

clean 删除前一次构建生成的文件,包括classes目录中的.class文件,但不会删除classes, generated-sources, maven-status目录。

compile 编译项目源代码,会生成.class文件和对应软件包,注意:*.class以及软件包(比如*.jar)不存在,或者源代码有变动的情况下,执行编译,才会重新生成*.class及对应软件包,packageinstalldeploy等皆如此。

test 使用合适的单元测试框架(默认为Junit)运行测试。这些测试不应要求打包或部署代码。可使用-Dmaven.test.skip=true-DskipTests参数跳过测试。这两者的区别在于:

  • -DskipTests 不执行测试用例,但编译测试用例类生成相应的.class文件到target/test-classes下。
  • -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。

package 获取编译后的代码,并将其打包为可分发的格式,例如jar

install 将打包的软件包安装至本地仓库,为本地其它项目提供依赖。实践表名,执行install命令,可能会生成在compile阶段未生成的软件包。

deploy 在集成或发布环境中完成,将最终软件包复制到远程存仓库,以便与其他开发人员和项目共享。

注意:

1、phase之间,phasegoal之间是有顺序区分的,按从左到右的顺序执行,如下两个命令,看似相同,执行效果是不一样的。

# 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

Java maven构建命令使用总结的更多相关文章

  1. java:Maven构建项目速度太慢的解决办法,以及报错Retrieving archetypes:' has encountered a problem

    如果报错信息如下: Retrieving archetypes:' has encountered a problemAn internal error occurred during:"R ...

  2. [Java]Maven构建时报错: "Error:java: 读取E:\XX\XXX..jar时出错; error in opening zip file"

    删除本地仓库中对应的jar包,pom.xml再reimport

  3. 使用jekins自动构建部署java maven项目(jdk1.7+tomcat7.0+jenkins2.19.3)

    1.下载jenkins 地址:https://jenkins.io/index.html 本人下载了2.19.3版本的war包:jenkins.war 2.安装jenkins 拷贝jenkins.wa ...

  4. 使用maven构建基本的web项目结构

    由于当前公司在组织进行项目基本结构的整理,将以前通过eclipse/ ant 方式构建的项目向maven上迁移,于是便进行maven项目方面的调研. 对于maven项目,基本的结构已经在标准文件中: ...

  5. Maven构建时跳过部分测试

    当遇到以下场景: 其他人写的单元测试影响统计结果 一些需要调用外部接口的测试暂不运行 需要在非本机环境上运行一些不回滚的单元测试 则有必要选择以下方法跳过部分测试. 在测试用例前加上注解 @Ignor ...

  6. IntelliJ IDEA 将 Maven 构建的 Java 项目打包

    前言 IntelliJ IDEA 编译生成 Jar 包的方式与 Eclipse 不同,如何将此 Maven 构建 Java 推荐引擎项目生成 Jar 包确实搜索了不少资料,有成功的有失败的,特将此验证 ...

  7. Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)

    之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ...

  8. 使用Maven构建和测试Java项目

    我们在创建项目时要学习的是如何使用 Maven 来创建一个 Java 应用程序.现在将学习如何构建和测试应用程序. 进入到 C:\MVN 目录我们准备创建来 java应用程序.打开 consumerB ...

  9. 构建命令maven install 打包不是最新的代码

    问题: 之前一直用的是mvn install 命令来构建项目,但是最近发现最新的代码没有在war包中.之前看的说 mvn install 命令会执行之前的所有阶段,会被编译,测试,打包. 经查最后采用 ...

  10. java基础-构建命令行运行的java程序简要注意

    今天编写了一个运行在服务端的java工具类,才发现自己以前很少关注运营方面的内容,导致在服务端部署一个java的工具变得异常困难,其实这也是自己对java的了解不够造成的. 首先,当代码编写完成之后, ...

随机推荐

  1. 2024盘古石取证比赛(APK)

    题目列表 使用软件: Notepad++,火眼证据分析软件,雷电分析app,DB browser for SQLCipher 1. 分析伏季雅的手机检材,手机中诈骗APP的包名是:[答案格式:abc. ...

  2. 微软的文本转语音服务Microsoft.CognitiveServices.Speech

    微软的Edge 浏览器里的大声朗读里-"晓晓" 很接近自然人,比起其它平台的强很多. 在AZURE 可免费体验,每月限额50万字,每个语音转换不超过10分钟长度. C# 调用: u ...

  3. C++笔记(4)友元

    通常情况下,公有类方法是访问类对象私有部分的唯一途径.除此之外,C++还提供了另外一种形式的访问权限:友元. 友元有三种: 友元函数 友元类 友元成员函数 通过让函数成为类的友元,可以赋予该函数与类的 ...

  4. 基于React的SSG静态站点渲染方案

    基于React的SSG静态站点渲染方案 静态站点生成SSG - Static Site Generation是一种在构建时生成静态HTML等文件资源的方法,其可以完全不需要服务端的运行,通过预先生成静 ...

  5. JavaServlet和后端的搭建(以Tomcat为例)

    目录 Servlet 前端如何才能访问到后端? 后端开发准备工作(配置Tomcat) 对象的生命周期 后端平台的搭建 创建Web项目(前提搭建好Tomcat配置) 创建Java文件 配置Web.xml ...

  6. Github 如何查看自己的 star 和 fork

    最近在 github 上看到偶尔有几个项目被 fork,心里也是挺开心的,但是查看项目的 fork 和 star,网上没有一个具体的教程,都是一个模板各种抄,本文就详细介绍如何查看. 查看 fork ...

  7. Prometheus + Grafana (1) 监控

    简介 Micrometer/Prometheus/Grafana体系是当前最成熟的低成本Java监控解决方案,而且通过其他的Prometheus exporter,还可以进行诸如我们可能需要的Wind ...

  8. java.sql.SQLException: Connection is read-only. Queries leading to data modification are not

    java.sql.SQLException: Connection is read-only. Queries leading to data modification are not 产生的原因:事 ...

  9. Mysql int类型字段插入表达式,值为0或1

    CREATE TABLE `t_user` ( `uId` INT(11) DEFAULT NULL, `uName` VARCHAR(20) DEFAULT NULL, `uPwd` VARCHAR ...

  10. Feign的客户端注解@EnableFeignClients,解决No qualifying bean of type 'xx.xx.类' available注入报错

    //如果使用Feign的客户端,请放开下列注释@EnableFeignClientsNo qualifying bean of type 'xx.xx.类' available //需要添加扫描的路径 ...