Maven学习(三)————Maven核心概念(二)

引言

承接上一篇《Maven学习(二)————Maven核心概念(一)》,介绍 Maven  生命周期、插件、目标、继承、聚合等一些概念。

一、Maven 生命周期

1.1 理解 Maven 生命周期及主要构建过程

Maven 构建生命周期,也称Maven 项目的生命周期,或 Maven 生命周期。

它描述了一个项目从编译到发布的整个过程。一个典型的 Maven 工程构建(build)生命周期是由以下几个主要阶段(phase)组成的。

阶段处理描述
验证 validate验证项目验证项目是否正确且所有必须信息是可用的
编译 compile执行编译源代码编译在此阶段完成
测试 Test测试使用适当的单元测试框架(例如JUnit)运行测试。
包装 package打包创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify检查对集成测试的结果进行检查,以保证质量达标
安装 install安装安装打包的项目到本地仓库,以供其他项目使用
部署 deploy部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

Maven 有三个标准生命周期:clean、 build(或default)、site(生成站点,适用于动态 web 项目)

理解构建阶段和生命周期的关系很重要,一个生命周期可以划分为多个构建阶段,Maven 的三个标准生命周期包括以下这些构建阶段:

【注意】build 生命周期中总共包含 23 个构建阶段,但比较重要的构建阶段就是上图这些,它们并非如图所示是紧挨着执行的,但可以保证顺序一定会如上图所示。当我们执行 install 构建过程的时候,maven会自动从 pre-clean 阶段执行,一直到 install。

1.2 构建阶段与 Maven 命令

Maven 的三个标准生命周期以及构建阶段,都会有特定的maven 指令,如上面所述,比较重要的构建阶段包括:compile、test、install等,它们对应的命令包含但不限于以下这些:

1、mvn clean:清理上次编译生成的 class 文件

2、mvn compile:编译主程序(main 目录下的源码文件)

3、mvn test-compile:编译测试程序(test 目录下的源码文件)

4、mvn test : 执行测试

5、mvn package:获取编译后的字节码文件,并按照可发布的格式打包成 jar 或 war

6、mvn install:安装工程包到本地仓库,该 jar 包可以作为本地其他工程的依赖。

7、mvn site:生成站点(此项构建过程包含在 site 生命周期中,上图未列出,只针对于动态 web 项目)

如果手动执行这些命令,需要在 pom.xml 文件所在的目录下打开 cmd 才可以,否则会构建失败。通常情况下,我们会使用开发工具中的 maven 插件来执行这些命令,而不是手动键入这些 maven 命令。

(目前很多项目都是 spring boot 项目,多为jar 包部署,所以本文暂不涉及 动态 web 工程相关的详细描述)

二、Maven 插件及执行目标

2.1 插件 plugin

Maven 插件用于完成 maven 项目的实际构建工作。

上文中提到, Maven 包括三个标准生命周期,这三个标准生命周期以 build 作为重要,它们包含了许多细分的构建阶段,这些阶段我们可以理解为一个概念性的接口,规定了这个阶段所要完成的工作,而由 Maven 插件来实际真正完成这些工作内容。

比如,我们输入 mvn clean 来完成 clean 阶段的旧字节码文件的清理工作,但 clean 的具体操作是由 maven-clean-plugin 插件来完成的。所以说, Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件来完成的,Maven 实际上是一个依赖插件执行的框架。

常用的插件有如下这些:

插件描述
clean构建之后清理目标文件。删除目标目录。
compiler编译 Java 源文件。
surefile运行 JUnit 单元测试。创建测试报告。
jar从当前工程中构建 JAR 文件。
war从当前工程中构建 WAR 文件。
javadoc为工程生成 Javadoc。
antrun从构建过程的任意一个阶段中运行一个 ant 任务的集合。

2.2 目标 goal

maven 中 目标的概念与插件紧密联系。一个插件目标可以代表一个特定的任务,它是比构建阶段更精细的划分。

这些目标被绑定在各自所属的不同阶段,或者无绑定,无绑定的目标可以穿插在构建过程之间独立执行。

插件通常提供了一个目标的集合,并且可以使用下面的语法执行:

mvn [plugin-name]:[goal-name]

例如,我们可以单独执行 compiler插件中的 compile 目标(任务):

mvn compiler:compile

三、Maven继承

Maven 提供一种依赖继承的方式,用于解决一些公共依赖统一版本的问题。

比如,三个maven 工程都依赖了 JUnit ,但是可能三个项目都引入了不同的版本依赖,这可能会造成某些情况下的测试结果出错的问题。

这个时候,我们就可以将JUnit 依赖提升到父工程中,统一指定版本号。在这种情况下,子工程只需要在依赖中标明 GAV 依赖坐标的前两项即可。这样,就可以在父工程中统一管理版本号,便于管理。

3.1 操作步骤

由于本文是概念性描述,后面会有实操的演示,这里还需要留意记忆。

1、创建一个Maven工程作为父工程。打包方式是pom

2、在子工程中通过<parent>标签声明父工程的引用

3、将子工程的坐标中与父工程坐标重复的部分剔除,主要是groupId 和 version

4、在父工程中统一junit的依赖

5、在子工程中删除junit依赖的版本号部分

【注意】配置继承后,执行安装命令时要先安装父工程。

四、Maven聚合概念

到目前为止,我们已经知道,maven可以轻松的管理项目的构建。在第一篇Maven 学习中《Maven学习(一)————Maven技术概述》引言部分,我提到项目开发中,项目过大导致工程代码庞大而出现的分工困难问题。

那么我们可以将项目拆分成多个 业务子模块,这些模块都是 maven 项目,然后通过彼此依赖的方式,建立联系(注意,两个项目 A 和 B 不能相互依赖,彼此依赖的意思是多个 maven 项目存在依赖关系,而两个项目无法双向依赖)。

但这依然存在一个问题,即需要在构建的时候,分别去构建每一个 maven 子工程,有没有可以一键构建所有子工程的方法?

maven 聚合就是为了解决这个问题。

maven 聚合的概念本身和 maven 继承没有什么交集,但是为了简化操作,在实际开发过程中,人们往往更习惯于将 maven 的父工程作为一个总的聚合工程。

操作非常简单,只需要在 pom 文件中加入<modules>标签项即可,如下图所示:

这样,只需要在 parent 项目上进行 maven 操作即可。

在接下来的文章中,我会以 demo 的形式演示一些 maven 应用于工程项目上的一些习惯性规则。包括一些在核心概念中并没有介绍的内容,也会在下面的实践中逐一展开。不得不说,虽然maven 应用起来非常简单,但是要想真正弄懂,还是需要下一番功夫的。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven学习(四)————Eclipse 中的 Maven 工程

引言 创建一个 Maven 版 Hello World。 一、Eclipse 中 Maven 插件的准备工作 除了 JDK 和必须的 Eclipse 之外&#xff0c;还需要在 Eclipse 中设置Maven 相关的信息。这里有最重要的两项 maven 配置&#xff1a; 1.1 Maven Installations 说明&#xff1a;该项设置是指定…

数据结构与算法————稀疏数组

引言 数据压缩方面&#xff0c;我们往往可以通过稀疏数组来保存有效数据&#xff0c;节省存储空间。 一、稀疏数组的概念 当一个数组中大部分元素是0&#xff0c;或为同一个值的时候&#xff0c;可以使用稀疏数组来保存数组。 它是一个十分有效的存储结构&#xff0c;便于节…

Linux进阶之路————crond定时任务调度

引言 crond 的概念和 crontab 是不可分割的。crontab 是一个命令&#xff0c;而 crond 是Linux 下用来周期性执行某种任务或等待处理某些事件的守护进程&#xff0c;类似于 Windows 下的计划任务。 当装完操作系统之后&#xff0c;默认便会安装 crond 服务工具&#xff0c;并…

Maven配置_01

1 下载相应的Maven--->地址:http://maven.apache.org/download.cgi 2 将下载的压缩包解压到自己指定的文件夹 C:\OS\apache-maven-3.5.2 3 配置环境变量 3.1 此电脑-->鼠标右键-->属性-->高级系统设置-->环境变量 3.2 用户变量或者系统变量中选择 新建 输入…

Linux进阶之路————Linux磁盘分区与挂载

引言 对于Linux来说&#xff0c;无论有几个分区&#xff0c;分给哪一目录使用&#xff0c;它归根结底就只有一个根目录 / &#xff0c;一个独立且唯一的文件结构&#xff0c;Linux 中每个分区都是用来组成整个文件系统的一部分。 Linux采用一种叫“载入”的处理方法&#xff…

Spring jndi连接数据库

Spring jndi连接数据库JNDI 即Java命名目录接口 Java Naming Dictory Interface Spring.xml配置文件 <bean name"dbsource1" class"org.springframework.jdbc.core.JdbcTemplate"><property name"jndi" value"java:comp/env/jdbc/…

Maven学习(五)————依赖的特性辨析

引言 在Maven 中&#xff0c;依赖有一些特性必须我们掌握&#xff0c;如依赖的传递性。 一、依赖的传递性 其实依赖的传递性非常好理解。 上图&#xff0c;如果 Maven 项目 B 已经依赖了 C &#xff0c;A 又依赖了 B&#xff0c;那么 A 不需要再在自己的pom 中重复引入 C 的…

ZXing生成二维码

pom.xml <!-- https://mvnrepository.com/artifact/com.google.zxing/core --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.2</version></dependency> ​ ​<!-- ht…

Java NIO————NIO 简介

引言 Java NIO (New IO&#xff0c;或Non Blocking IO) 是从Java1.4 版本开始引入的一个新的 IO API&#xff0c;可以代替标准的Java IO API。 NIO与原来的IO有同样的作用和目的&#xff0c;但是使用的方式完全不同。 NIO支持面向缓冲区、基于通道的IO操作。NIO将以更加高效…

MySql主从同步最小配置

MySql主从同步最小配置 MySql配置文件配置window: my.ini centos: my.cnf主数据库配置 #配置数据库的唯一标识符,一般1位主库,从库为ip地址最后一位 server-id 1 #启用二进制日志,对应mysql-bin.xxxxx文件 log-bin mysql-bin #需要同步的数据库名 binlog-do-dbtest1 #不需要…

解决pom文件第一行报错(unknown)-亲测有效

原文链接&#xff1a;https://blog.csdn.net/u010947534/article/details/93743582 问题&#xff1a; Eclipse导入maven项目时&#xff0c;或者新建一个springboot项目时&#xff0c;pom.xml文件第一行报错&#xff0c;没有错误信息提示&#xff0c;就一个Unknown&#xff0c…

Oracle中start with xx connect by prior 语句解析

Oracle中start with xx connect by prior 语句解析 ​ Oracle这种的start with语句主要对B型树的数据进行递归查询.可以指定数据树上的任一节点,然后查找到它所有的子节点或者父节点. ​ 现在有如下图的数据: 我们先想数据库插入数据,这里用到oracle的批量插入写法# 1 建表 CRE…

Spring Boot————Profile配置

引言 Spring Boot 的Profile配置&#xff0c;可以极大简化配置难度&#xff0c;可以有多种配置形式&#xff0c;根据位置有不同的生效方式。 探讨问题 Spring Boot 的 Profile 配置是为了解决不同环境可能存在的多种配置问题。 举例来说明的话&#xff0c;就是当我们开发完…

Enum的简单使用

package cn.silica.vo;/*** author laibaocen*/ public enum Separator {/*** 枚举值 大写* 如果只有枚举值,那么最后一个枚举值后可以不加分号*/SEMICOLON(0,";","分号"),COLON(1,":","冒号"),CONNECTIVE (2,"-","破折…

Java NIO ———— Buffer 缓冲区详解

引言 缓冲区是一个用于特定基本类型的容器。由java.nio 包定义&#xff0c;所有缓冲区都是 Buffer 抽象类的子类。 Java NIO 中的 Buffer &#xff0c;主要用于与NIO 通道进行交互。数据从通道存入缓冲区&#xff0c;从缓冲区取出到通道中。 一、创建缓冲区 缓冲区的本质是 …

基本类型理解巩固及补码原理总结

引言 本篇文章属于计算机基础通识&#xff0c;主要讨论&#xff1a;有符号类型、无符号类型的区别&#xff0c;byte、int 等类型的取值范围&#xff0c;最大值最小值的计算公式的由来&#xff0c;原码、反码、补码转换公式。 有符号类型与无符号类型 在 Java 中的八大基本类…

2021年3月15日_读书|总结笔记目录

深入理解Java虚拟机*第三版 慢慢填坑第一部分*自动内存管理 第二部分*虚拟机执行子系统 类文件结构 无关性的基石

LeetCode(#118)————杨辉三角形

问题描述 给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示例: 输入: 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] ] 实现方法 class Solution {public List<List<Intege…

数据结构与算法————九九乘法表

问题描述 通过Java语言实现九九乘法表的输出。使用一个for 循环和两个for循环。 一个for循环 public static void oneFor() {for (int i 1, j 1; i < 9; j) {System.out.print(j "*" i "" i * j "\t");if (j i) {i;j 0;System.ou…

JVM001_类文件结构

无关性的基石 实现语言无关性的基础是虚拟机和字节码存储格式。Java虚拟机不与任何语言绑定&#xff08;包括Java&#xff09;&#xff0c;它只与‘Class文件’这种特定的二进制文件格式所关联。Class文件中包含了Java虚拟机指令集、符号表以及其它辅助信息。出于安全考虑&…