Maven 基础
博文目录
文章目录
- Maven
- 基础概念
- 生命周期 - Build Lifecycle
- 阶段 - Build Phase
- 目标 - Plugin goals
- 默认目标绑定
- Clean 生命周期
- Default 生命周期
- Site 生命周期
- 插件 - Plugin
- POM(Project Object Model)
- Super POM
- 项目继承 - Project Inheritance
- 项目聚合 - Project Aggregation
- 依赖机制 - Dependency Mechanism
- 依赖传递 - Transitive Dependencies
- 依赖仲裁 - Dependency mediation
- 依赖作用域 - Dependency Scope
- 插件 - Plugin
Maven 官方入门指南
Maven 官方插件配置指南
Maven 官方pom.xml 指南
Maven 官方所有可用插件
Maven
Maven 是一个项目管理工具,它在非常高的层次上规范了一套项目管理的标准流程,包括但不限于项目的创建、构建、测试、打包、分发、记录和部署等阶段,同时上述的每一个步骤都可以在一个定义良好的范围内拥有无限的变化。而开发人员在了解过 Maven 的工作原理后,即可快速上手任何遵循 Maven 规范的项目,省时省力
基础概念
生命周期 - Build Lifecycle
Maven 的核心概念是围绕着 build lifecycle
的,这意味着项目的构建和分发等过程都是被明确定义的。Maven 有三个内置的生命周期
- clean:负责处理项目清理
- default:负责将源码构建成最终包并复制到远程存储库(如公司内网的 Maven 仓库)
- site:负责处理创建项目的网站
每个生命周期都由多个阶段 Phases 组成
阶段 - Build Phase
每一个生命周期都由不同的阶段所定义,其中的阶段表示生命周期的一个步骤
这些阶段是有固定执行顺序的,每次执行都是从该生命周期的第一个阶段开始,直到到达指定的阶段才会停止
每个生命周期有都有多个阶段,但一般我们只需要关注其最重要的几个阶段即可,3个生命周期的完整的阶段可参考 这里
-
clean lifecycle
- clean:删除由以前的生成生成生成的所有文件
-
default lifecycle
- compile:编译项目的源代码
- test:使用合适的单元测试框架测试编译的源代码。这些测试不应该要求打包或部署代码
- package:将编译后的代码打包为可分发的格式,例如 JAR
- install:将软件包安装到本地存储库中,以便在本地其他项目中用作依赖项
- deploy:将最终包复制到远程存储库,是 default 生命周期的最终目标
目标 - Plugin goals
目标是由 插件 Plugin 提供的
每一个阶段都由多个目标组成,一个目标代表一个特定的任务(比阶段更精细)
一个目标可能被绑定到零个或多个阶段,未绑定到阶段的目标可以通过直接调用,从而在生命周期外执行
目标的执行顺序取决于目标和阶段被调用的顺序,如下命令中,clean 和 package 是阶段,而 dependency:copy-dependencies 是一个插件的目标
mvn clean dependency:copy-dependencies package
如果要执行此操作,则将首先执行clean阶段(这意味着它将运行c lean 生命周期的所有先前阶段,加上clean阶段本身),然后执行 dependency:copy-dependences 目标,最后执行 package 阶段(以及 default 生命周期的其他所有前置构建阶段)
此外,如果一个目标绑定到一个或多个构建阶段,那么该目标将在所有这些阶段中被调用
此外,构建阶段也可以绑定零个或多个目标。如果构建阶段没有绑定目标,则该构建阶段将不会执行。但如果它有一个或多个目标,它就会执行所有这些目标
默认目标绑定
完整的默认绑定关系看 这里
Clean 生命周期
Phase | plugin:goal |
---|---|
clean | clean:clean |
Default 生命周期
Default 生命周期的默认绑定,与 POM 的 packaging 元素有关系,packaging 的值最常见的有 pom,jar,war 等,如果没有指定该元素,则默认为 jar
每一种 packaging 都默认包含了多个绑定到 default 生命周期中的多个阶段的目标,如果是 jar / war
阶段 | 绑定到该阶段的插件目标 plugin:goal |
---|---|
process-resources | resources:resources |
compile | compiler:compile |
process-test-resoueces | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | jar:jar 或 war:war |
install | install:install |
deploy | deploy:deploy |
如果 packaging 为 jar 的项目执行 mvn package
,则默认会执行上述 install 之前的全部阶段的目标
如果是 pom
Phase | plugin:goal |
---|---|
package | |
install | install:install |
deploy | deploy:deploy |
Site 生命周期
Phase | plugin:goal |
---|---|
site | site:site |
site-deploy | site:deploy |
插件 - Plugin
插件是为 Maven 提供目标的组件,一个插件可以有一个或多个目标,其中每个目标都代表该插件的一种能力,如编译插件 Compiler Plugin 有两个目标,分别是 compile 和 testCompile,分别用来编译主代码的源码和测试代码的源码
插件需要配置目标与生命周期阶段的绑定。单独添加插件是不够的,您还必须指定运行的目标
如果一个阶段配置了多个目标,则优先运行绑定到 packaging 的默认目标,然后才是 POM 中配置的目标(按配置顺序执行),可以用 <executions>
元素做更多顺序的配置
配置举例
Modello 插件默认情况下绑定其目标 modello:java 到 generate-sources 阶段,要使用该插件并让它从模型中生成源代码并将其纳入到构建流程中,可以在的部分将以下内容添加到 POM 中。(这里我有点疑惑,我觉得默认目标和默认阶段应该都不需要额外写出来)
<plugin><groupId>org.codehaus.modello</groupId><artifactId>modello-maven-plugin</artifactId><version>1.8.1</version><executions><execution><configuration><models><model>src/main/mdo/maven.mdo</model></models><version>4.0.0</version></configuration><goals><goal>java</goal></goals></execution></executions></plugin>
有些目标能用在不止一个阶段,假设你有一个目标 display:time 用于在命令行中输出时间,你想将其绑定到 process-test-resources 阶段,那么可以做如下配置,支持同时配置多个 <execution>
<plugin><groupId>com.mycompany.example</groupId><artifactId>display-maven-plugin</artifactId><version>1.0</version><executions><execution><phase>process-test-resources</phase><goals><goal>time</goal></goals></execution></executions></plugin>
如果插件没有写版本号,则默认是使用最新的可用版本
POM(Project Object Model)
完整文档看 这里
项目对象模型或POM是Maven中的基本工作单元。它是一个XML文件,包含有关项目的信息以及Maven用于构建项目的配置详细信息。它包含大多数项目的默认值,如 构建目录是 target,源码目录是 src/main/java,测试源码目录是 src/test/java,等等。
当执行任务或目标时,Maven会在当前目录中查找POM。它读取POM,获得所需的配置信息,然后执行目标。
POM中可以指定的一些配置包括项目依赖项、可以执行的插件或目标、构建配置文件等。还可以指定其他信息,如项目版本、描述、开发人员、邮件列表等。
Super POM
Super POM 是 Maven 的默认 POM。除非明确设置,否则所有 POM 都会扩展超级 POM,Super POM 中指定的配置将由您为项目创建的 POM 继承。
Maven 3.6.3 的 Super POM 内容看 这里,定义了很多默认路径和默认仓库的信息,依赖的默认下载路径 https://repo.maven.apache.org/maven2
等
项目继承 - Project Inheritance
以下的元素会因为继承而合并
- dependencies
- developers and contributors
- plugin lists (including reports)
- plugin executions with matching ids
- plugin configuration
- resources
子 POM 可以继承父 POM 的 GroupID 和 Version
项目聚合 - Project Aggregation
其实就是多模块 Maven 项目
项目聚合类似于项目继承。但是,它不是从模块中指定父POM,而是从父POM中指定模块。通过这样做,父项目现在知道了它的模块,如果对父项目调用Maven命令,那么该Maven命令也将对父项目的模块执行。要进行项目聚合,必须执行以下操作:
- 将父pom包装更改为值“pom”。
- 在父POM中指定其模块(子POM)的目录。
每当Maven命令处理父 POM 时,同样的Maven命令也会针对子 POM 运行。有些命令(特别是目标)对项目聚合的处理方式不同。
依赖机制 - Dependency Mechanism
完整参考查看 这里
依赖关系管理是Maven的核心功能。管理单个项目的依赖关系很容易。管理由数百个模块组成的多模块项目和应用程序的依赖关系是可能的。Maven在定义、创建和维护具有定义良好的类路径和库版本的可复制构建方面有很大帮助。
依赖传递 - Transitive Dependencies
有一个包 C 依赖 了 D 和 E 包,你依赖了 C,则自动依赖了 D 和 E,这就是依赖传递
依赖仲裁 - Dependency mediation
- 就近原则:依赖冲突时,所使用的依赖版本将是依赖关系树中与您的项目最接近的版本(依赖深度最浅),假如你的项目是 A,A>B>C>D:2.0,A>E>D:1.0,此时 D:1.0 离 A 更近,所以根据就近原则,1.0 版本的 D 被选择为生效的版本,如果想使用 2.0 版本的 D,则可以在 A 中直接添加该版本的依赖,或者在 E 中排除对 D 的依赖
- 如果两个冲突依赖的深度相同,则先声明的生效
依赖作用域 - Dependency Scope
依赖作用域用于限制依赖的传递性,并确定依赖何时包含在类路径(compile、test、runtime)中,有 6 种依赖作用域
- compile:默认作用域。该作用域的依赖项在项目的所有类路径中都可用。这些依赖关系会传播到依赖项目
- provided:该作用域的依赖项会被添加到 compile 和 test 类路径中,但不会添加到 runtime 的类路径中。这种作用域的依赖项不会传递。如 JavaEE Web 应用,需要添加 provided 范围的 Servlet 依赖,因为 Web 容器提供了这些类
- runtime:表示编译时不需要这个依赖,但执行时需要。该作用域的依赖项会被添加到 runtime 和 test 类路径中,但不会添加到 compile 的类路径中
- test:表示应用在正常运行时并不会需要这个依赖,它只生效于测试的编译和执行阶段。此作用域不可传递
- system:表示此依赖从指定的目录查找,而不是本地仓库
- import:此作用域只在
pom
的<dependencyManagement>
中生效,
插件 - Plugin
完整文档看 这里
如果没有配置版本号,默认是使用最新的可用版本
相关文章:
Maven 基础
博文目录 文章目录 Maven基础概念生命周期 - Build Lifecycle阶段 - Build Phase目标 - Plugin goals默认目标绑定Clean 生命周期Default 生命周期Site 生命周期 插件 - Plugin POM(Project Object Model)Super POM项目继承 - Project Inheritance项目聚…...
算法刷题-哈希表-两数之和
两数之和 1. 两数之和思路总结其他语言版本 1. 两数之和 力扣题目链接 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中…...
kotlin学习(一)基本概念、数据对象类型、控制流程、空值检验、类与接口
文章目录 认识Kotlin跨平台特性语言类型java的语言类型kotlin的运行原理 hello world 基本概念程序入口数据与对象类型 和 显式数字转换浮点类型位运算AnyUnitNothing 声明变量只读变量 val与可变变量var查看Kotlin字节码 fun(方法 / 函数)函数参数默认值…...
【Linux】Docker部署镜像环境 (持续更新ing)
防火墙 1、查看防火墙状态 sudo systemctl status ufw 2、开启防火墙 sudo systemctl start ufw 3、关闭防火墙 sudo systemctl stop ufw 4、开机禁止开启防火墙 sudo systemctl disabled ufw 5、开启自启防火墙 sudo systemctl enabled ufw Elasticsearch 1、安装指定版本 比…...
Jtti:如何打开云服务器的8082端口
如何打开云服务器的8082端口? 第一步:登录云服务器 首先,我们需要登录到我们的云服务器。可以使用SSH、控制台等方式进行登录。登录成功后,我们可以在终端上看到服务器的控制台。 第二步:编辑防火墙规则 打开终端后,我…...
有关 string 类的练习(下)
目录 一、反转字符串 II 二、反转字符串中的单词 III 三、找出字符串中第一个只出现一次的字符 四、字符串相乘 五、把字符串转换成整数 一、反转字符串 II 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转…...
XuperChain搭建+报错+注意事项
安装依赖 golang 这里安装的是15-17版本 wget -c https://dl.google.com/go/go1.15.2.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local 添加环境变量 这个可以通过添加下面的行到/etc/profile文件(系统范围内安装)或者$HOME/.profile文件(当前用户安装 vim /etc…...
【伏羲八卦图】(PythonMatlab实现)
目录 1 与达尔文对话 2 与老子对话 2.1 Python实现 2.2 Matlab实现 1 与达尔文对话 140年前,1858年7月1日,达尔文在英伦岛发表了自己有关自然选择的杰出论文。他提出,生物的发展规律是物竞天择。经过物竞,自然界选择并存留最具…...
ruoyi数据权限学习
思路 用户关联了角色(用户可以关联多个角色),给角色设置数据权限分类,数据权限分类有如下5种: 全部数据权限 - DATA_SCOPE_ALL自定数据权限 - DATA_SCOPE_CUSTOM部门数据权限 - DATA_SCOPE_DEPT部门及以下数据权限 -…...
WPF中实现动态导航
主页面 <mah:MetroWindowx:Class"Kx.View.MyMainView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/bl…...
day16 | 104.二叉树的最大深度、111.二叉树的最小深度、 222.完全二叉树的节点个数
目录: 链接 题目链接: https://leetcode.cn/problems/maximum-depth-of-binary-tree/ https://leetcode.cn/problems/maximum-depth-of-n-ary-tree/ https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/ 解题及思路学习 104…...
Spring Boot + Vue3前后端分离实战wiki知识库系统<八>--分类管理功能开发二
接着上一次Spring Boot Vue3 前后端分离 实战 wiki 知识库系统<七>--分类管理功能开发的分类功能继续完善。 分类编辑功能优化: 概述: 现在分类编辑时的界面长这样: 很明显目前的父分类的展现形式不太人性…...
Python入门(十八)类(一)
类(一) 1.面向对象概述2.创建和使用类2.1 创建dog类2.2 根据类创建实例2.3 创建多个实例 1.面向对象概述 面向对象编程是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对…...
c# 从零到精通-定义一个结构
c# 从零到精通-定义一个结构 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test01 { class Program { public struct Rect//定义一个矩形结构 { public double width;//矩形的宽 public double height;//矩形的高 /// …...
检信ALLEMOTION非接触式心理情绪测评系统
1 名称:检信ALLEMOTION多维度心理情绪测评系统 2 用途:用于群体性人群心理情绪早期筛查,以及个人心理障碍辅助诊断,同时传统心理量表诞生已经100多年历史,在人工智能及大数据推动下,必然推动心理健康行业的产业变革与…...
20道嵌入式经典面试题(附答案)
1.嵌入式系统中经常要用到无限循环,如何用C编写死循环 答:while(1){} 或者 for(;;) 2.程序的局部变量存在于哪里,全局变量存在于哪里,动态申请数据存在于哪里。 答:程序的局部变量存在于栈区;全局变量存在…...
python学习-代码调试器
目录 为什么学习调试器Pycharm Debugger示例所用代码布局调试工具栏 Debug Bar程序控制工具栏 pdb查看源代码 l list查看当前函数源代码 ll longlist打印变量 p查看调用栈w where向上移动当前帧 u up向上移动当前帧 d down运行当前行代码,在第一个可以停止的位置停下 s step继续…...
第十一章 综合推理
第十一章 综合推理 第一节 综合推理-排序 题-综合推理-分类1-排序 甲、乙、丙、丁四人的国籍分别为英国、俄国、法国、日本。乙比甲高,丙更矮;英国人比俄国人高,法国人最高;日本人比丁高。 这四个人的国籍是: A.甲…...
嵌入式开发之设置寄存器中指定位
0 Preface/Foreword 嵌入式开发,位操作是常用的运算,读写对应寄存器指定位从而设置不同的功能。 1 设置寄存器中的任意位 1.1 清零 举例,假设一个寄存器名字为FUNCCON,地址为0x00008000,该寄存器长度为4个byte。 #define FUNC…...
第十章 数学相关
第十章 数学相关 第一节 集合 真题(2010-53)-数学相关-集合-画饼集能力-朴素逻辑 53.参加某国际学术研讨会的 60 名学者中,亚裔学者 31 人,博士 33 人,非亚裔学者中无博士学位的 4 人。根据上述陈述,参…...
数据结构——串(字符串)
文章目录 **一 串的定义和实现****1 定义****2 串的存储结构****2.1 定长顺序存储表示****2.2 堆分配存储表示****2.3 块链存储表示** **3 串的基本操作** **二 串的模式匹配****1 简单的模式匹配算法****2 串的模式匹配算法——KMP算法****2.1 字符串的前缀,后缀和…...
Seata服务端的启动过程 学习记录
1.ServerRunner ServerRunner类实现了CommandLineRunner与DisposableBean接口,将会在Spring容器启动和关闭的时间,分别执行 run 和 destory 方法。 而seata服务端的启动过程,都藏在run方法中 2.整体流程 io.seata.server.Server#start pu…...
Log4J
引言 为什么要用日志? --> 方便调试代码 什么时候用?什么时候不用? 出错调试代码时候用 生产环境下就不需要,就需要删除 怎么用? --> 输出语句 一、Log4J 1.1 介绍 log4j是Apache的一个开放源代码的项目,通过使用log4j,我们可以控…...
【零基础学机器学习 5】机器学习中的分类:什么是分类以及分类模型
👨💻 作者简介:程序员半夏 , 一名全栈程序员,擅长使用各种编程语言和框架,如JavaScript、React、Node.js、Java、Python、Django、MySQL等.专注于大前端与后端的硬核干货分享,同时是一个随缘更新的UP主. 你可以在各个…...
目标检测算法:Faster-RCNN论文解读
目标检测算法:Faster-RCNN论文解读 前言 其实网上已经有很多很好的解读各种论文的文章了,但是我决定自己也写一写,当然,我的主要目的就是帮助自己梳理、深入理解论文,因为写文章,你必须把你所写的东西表…...
基于Python的接口自动化-Requests模块
目录 引言 一、模块说明 二、Requests模块快速入门 1 发送简单的请求 2 发送带参数的请求 3 定制header头和cookie 4 响应内容 5 发送post请求 6 超时和代理 三、Requests实际应用 引言 在使用Python进行接口自动化测试时,实现接口请求…...
Vue框架中监测数组变化的方法
在 Vue 中,如果直接对数组进行操作,比如使用下标直接修改元素,数组长度不变时, Vue 是无法监测到这种变化的,导致无法触发视图更新。针对该问题,总结如下解决方法: 一、使用 Vue.js 提供的方法…...
PHP isset()函数使用详解,PHP判断变量是否存在
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 isset 一、判断变量是否存在二、判断变量是否为NUL…...
2021~2022 学年第二学期《信息安全》考试试题(A 卷)
北京信息科技大学 2021~2022 学年第二学期《信息安全》考试试题(A 卷) 课程所在学院:计算机学院 适用专业班级:计科1901-06,重修 考试形式:(闭卷) 一、选择题(本题满分10分,共含10道小题,每小题…...
通俗讲解元学习(Meta-Learning)
元学习通俗的来说,就是去学习如何学习(Learning to learn),掌握学习的方法,有时候掌握学习的方法比刻苦学习更重要! 下面我们进行详细讲解 1. 从传统机器学习到元学习 传统的机器学中,我们选择一个算法&…...
合肥全员核酸检测/嘉兴seo计费管理
如何在MyEclipse中给项目重命名 右击项目-重构(artshiftt)-重命名 右击项目-属性(altenter)-Myeclipse-web-Web Context-root-把新名字输入 重新配置web.xml里的内容,我们发现,重命名之后,web.xml里的内容会…...
建德建设局网站/软文推广的好处
我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本实例介绍了透明位图的制作知识,并将透明位图在一个对话框…...
wordpress.en/精准营销理论
目录 Numpy 加载图像到内存映射区 准备工作 具体步骤 小结 Numpy 合并图像 准备工作 具体步骤...
订做网站策划/论坛外链代发
CRM的出现,改变了以往客户资料分散、客户管理复杂繁琐的状况,还让企业对客户数据、产品信息、员工数据实现了统一。自20世纪90年代以来,CRM的经营理念和运作体系迅速被企业界所接受并在大企业得到广泛应用。但是,占企业总数90%以上…...
网站建设模块有哪些/百度客服人工服务
解决办法: 1. 选中项目 --> 右键 --> Maven --> Disable Maven Nature 此时,右键菜单中将隐藏【Maven】菜单选项 2. 选中项目 --> 右键 --> Configure --> Convert to Maven project. 3. 选中项目-->右键-->Properties-->Dep…...
微信推广网站建设/游戏推广公司靠谱吗
在信息技术高速发展的时代里,计算机证尤为重要,那么计算机一级考什么呢。以下是由出国留学网编辑为大家整理的“计算机一级考什么内容有哪些”,仅供参考,欢迎大家阅读。计算机一级考什么内容 有哪些1. 采用无纸化考试,上机操作。考…...