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;并…

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

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

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

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

解决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…

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

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

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

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

JVM001_类文件结构

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

Maven学习(六)————企业Maven项目最佳实践

引言 在《Maven学习&#xff08;三&#xff09;————Maven核心概念&#xff08;二&#xff09;》中&#xff0c;学到了Maven 继承和 Maven 聚合的概念&#xff0c;这两个概念&#xff0c;解决的问题分别是&#xff1a; 1、解决一些公共依赖统一版本的问题。 2、统一打包部署…

JVM003_属性表

属性表 预备知识 javac -g Xxx.java 在生成class文件的时候生成所有调试信息javap -v Xxx.class 输出附加信息 属性表结构 类型名称数量备注u2attribute_name_index1属性名称索引&#xff0c;指向一个CONSTANT_Utf8_info型常量的索引u4attribute_length1该属性表的长度u1in…

Lombok ——自动化方法生成器

引言 此文为简单的Lombok 演示。 Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具&#xff0c;通过使用对应的注解&#xff0c;可以在编译源码的时候生成对应的方法。简而言之&#xff0c;一句话就是&#xff1a;通过简单的注解…

LeetCode(#26)————删除排序数组中的重复项

题目 给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums […

JVM006_类加载的过程

类加载 类加载时机 类加载的过程 新术语 类加载器 简单的理解为将类转换为二进制流的类或接口。 数组的元素类型 数组去掉所有维度的类型。 数组的组件类型 数组去掉一个维度的类型。 基本块 按照控制流拆分的代码块。 1. 加载 加载是类加载过程的一个阶段。加载阶段主…

服务端开发——云服务器的端口转发设置(SSH隧道)

引言 本篇博客介绍端口转发的知识&#xff0c;并详细阐述操作和设置步骤。这是因为在实际工作中&#xff0c;会有很多企业从安全的角度考虑&#xff0c;为线上或重要的服务器设置一个跳板机&#xff08;堡垒机&#xff09;&#xff0c;避免远程开发人员直接操作&#xff0c;是…

Shiro————核心设计思想

引言 以此篇博客为引&#xff0c;开启一个新的专栏分类——Shiro。 之前在工作中有比较快速的学习过Shiro安全框架&#xff0c;但经过一年的荒废&#xff0c;已经不是很熟悉了&#xff0c;通过这个系列&#xff0c;深入研究和学习Shiro的一些知识&#xff0c;填补安全管理方面…

Web应用安全————账号冻结与 Session 实时失效

引言 开篇时说些题外话&#xff0c;最近刚刚被公司CY&#xff0c;不过很快找到了下家&#xff0c;也同时拿到了三家公司的Offer。一周面试下来&#xff0c;总体感觉面试题少了&#xff0c;不过多了上机程序题。新公司是做外包&#xff0c;不过相比于上一家公司&#xff0c;也算…

Web应用安全————Shiro 解决会话固定漏洞

引言 承接上一篇《Web应用安全————账号冻结与 Session 实时失效》关于 session 的学习&#xff0c;本篇博客聚焦如何通过 shiro 解决会话固定导致的漏洞问题。 首先&#xff0c;没怎么接触过应用安全方面的小伙伴可能会发起疑问 - 什么是会话固定&#xff1f; 简单来说&…