maven学习总结

众所周知,maven的两大作用是项目构建和依赖管理,除此之外,基于多模块项目,maven常用的功能还有模块化管理。

项目构建

Maven是一个构建工具,可以根据项目中的配置文件(pom.xml)来自动执行项目的构建过程。它可以将源代码编译、运行单元测试、生成可执行的JAR或WAR文件等。

Maven定义了一组标准的构建生命周期,如clean、validate、compile、test、package、install、deploy等。这些生命周期阶段分别对应不同的构建任务,使得构建过程更加规范化和可管理。

当使用Maven构建项目时,项目的构建过程被划分为不同的阶段,每个阶段执行特定的任务。以下是Maven构建生命周期中几个常用阶段的解释:

clean: 该阶段的目标是清除之前构建生成的输出。它会删除先前构建生成的目录,例如target目录,以便从头开始执行构建。命令:mvn clean

validate: 在该阶段,Maven会验证项目是否正确,包括项目结构、POM文件格式和基本配置。这可以帮助在构建过程的早期发现潜在的问题。命令:mvn validate

compile: 在这个阶段,Maven会编译项目的源代码(通常位于src/main/java目录下)。它将Java源文件编译成字节码文件(.class文件)。命令:mvn compile

test: 在该阶段,Maven会执行项目的单元测试。它会搜索并执行位于src/test/java目录下的测试代码,然后生成测试报告。如果测试失败,构建过程可能会中止。命令:mvn test

package: 在这个阶段,Maven会将编译后的代码打包。对于Java项目,它通常会创建一个包含编译后字节码、资源文件等的JAR(Java Archive)或WAR(Web Archive)文件。命令:mvn package

install: 在这个阶段,Maven会将打包后的文件安装到本地仓库,以供其他项目引用。这对于多模块项目或模块之间的依赖非常有用。命令:mvn install

deploy: 最后一个阶段是部署阶段。在这个阶段,Maven会将构建好的包上传到远程仓库,以便其他团队成员或项目可以访问和使用这些构建产物。命令:mvn deploy

依赖管理

Maven通过管理 pom.xml 文件中的依赖配置,自动下载、安装和管理项目所需的外部库和框架,使得依赖管理变得更加简单和规范化。这有助于减少版本冲突、依赖错误等问题,同时提高了项目的可维护性和稳定性。总的来说,依赖管理包含下面这些方面

POM文件: 项目的依赖管理主要在项目根目录下的 pom.xml 文件中完成。POM(Project Object Model)是Maven项目的核心配置文件,其中包含了项目的元信息、依赖配置、插件配置等。

依赖坐标: 在 pom.xml 中,你可以通过定义依赖项的坐标来指定你需要使用的外部库或框架。依赖坐标通常包括组织(Group)、名称(Artifact)和版本号(Version)等信息,这些信息唯一标识了一个依赖项。

依赖范围: Maven支持不同的依赖范围,如compile、test、provided等。每个依赖范围定义了依赖项在不同上下文中的使用情况。例如,compile 范围表示该依赖在编译、运行和测试阶段都可用,而 test 范围表示该依赖仅在测试阶段可用。

传递性依赖: 当一个依赖项本身还依赖于其他库时,Maven会自动处理这些传递性依赖。它会从远程仓库下载所需的所有依赖项,并确保它们按正确的顺序添加到项目的类路径中。

依赖解析: 当你在 pom.xml 中定义依赖后,Maven会根据依赖坐标从远程仓库中解析并下载相应的依赖文件。这些文件通常以JAR(Java Archive)格式存在。

本地仓库: Maven会将下载的依赖文件保存在本地仓库中,以避免重复下载。默认情况下,本地仓库位于用户主目录下的 .m2 文件夹。

快照和稳定版本: 依赖的版本号可以是稳定版本(如 1.0.0)或快照版本(如 1.0.0-SNAPSHOT)。稳定版本是已发布的正式版本,而快照版本是开发中的版本。快照版本可以通过频繁的构建来更新。

上面提到的依赖范围用于定义依赖项在不同上下文中的使用情况。不同的依赖范围决定了在哪些构建阶段以及哪些上下文中可以使用该依赖项。以下是常见的依赖范围以及它们的解释:

compile: 这是默认的依赖范围。在 compile 范围内定义的依赖项将会在项目的编译、运行和测试阶段都可用。这些依赖项会被包含在生成的JAR或WAR文件中,以便在运行时使用。

provided: 在 provided 范围内定义的依赖项表示它们在编译和测试阶段可用,但在运行时由容器(例如Servlet容器)或其他环境提供。这意味着你不需要在项目中包含这些依赖的JAR文件,因为它们将在运行时环境中可用。

runtime: 在 runtime 范围内定义的依赖项将在运行时和测试阶段可用,但不会在编译阶段包含在生成的JAR或WAR文件中。这对于在运行时需要,但不需要在编译时使用的依赖项很有用。

test: test 范围内定义的依赖项仅在测试代码中可用。它们不会被包含在生成的JAR或WAR文件中,也不会在项目的运行时类路径中。

system: 在 system 范围内定义的依赖项类似于 provided 范围,但你需要通过 systemPath 指定依赖项的路径。这在某些情况下可以用于引入本地系统上不存在于Maven仓库中的库。

import: import 范围主要用于在多模块项目中,用于从父模块中继承依赖。它本身不会影响依赖的传递,仅用于继承。

maven如何解决依赖冲突

版本决议: 当项目中存在多个依赖项,并且这些依赖项具有不同的版本,Maven会尝试选择一个合适的版本来解决冲突。通常情况下,Maven会选择最近的版本,但也会考虑其他因素,如依赖的传递性等。

最短路径优先: 当存在多条依赖路径时,Maven会优先选择最短的路径来解决冲突。这有助于减少依赖层次,提高构建性能和可维护性。

依赖范围: 不同的依赖范围在解决依赖冲突时也起着重要作用。Maven会根据依赖范围的不同,选择合适的依赖版本。例如,compile范围的依赖在编译、运行和测试阶段都会被包含,而test范围的依赖只在测试阶段可用。

Exclusion(排除依赖项): 通过在 pom.xml 中明确地排除某个依赖的版本,可以防止其被引入到项目中,从而避免冲突。这在某些情况下可能是必要的,但应谨慎使用,以免导致其他问题。

Dependency Management(依赖管理): 在父模块中定义的依赖管理部分可以统一指定依赖项的版本,确保所有子模块使用相同的版本。这有助于减少冲突。

插件冲突解决: 有时候项目中的插件可能产生冲突。Maven会根据插件的优先级和版本来解决这些冲突,确保插件能够正确执行。

模块化管理

spring Boot项目可能会被拆分为多个模块,每个模块有其自己的代码和依赖。Maven可以通过多模块项目来管理这些子模块,使得项目结构更加清晰,并能够在模块之间进行依赖管理。

Maven中的子父依赖关系是一种组织项目结构并管理依赖的方式,用于管理多模块项目的依赖和共享配置。这种关系通过创建一个或多个模块作为子模块,其中一个模块作为父模块来实现。

父模块: 父模块是一个包含子模块的项目模块,它的主要作用是提供共享的配置信息,如插件配置、依赖管理和属性。通常父模块本身没有实际的代码或资源。

子模块: 子模块是父模块下的实际项目模块,它可以是一个独立的Java项目、Web应用程序等。每个子模块都有自己的源代码、资源和依赖。

继承和覆盖: 子模块继承父模块的配置信息,这包括插件版本、属性、依赖管理等。子模块可以选择性地覆盖父模块的配置,以满足自己的需求。

依赖管理: 父模块通常会定义一个统一的依赖管理部分,子模块可以从中继承依赖配置。这样可以确保项目中使用相同版本的依赖,减少冲突和混乱。

模块之间的依赖: 子模块之间可以建立依赖关系,这些依赖关系会在构建时自动解析。这样可以将大型项目拆分成更小的模块,使得项目结构更清晰。

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

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

相关文章

2023年Java核心技术第十一篇(篇篇万字精讲)

目录 二十一 . Java并发包提供了哪些并发工具类 21.1 典型回答 21.1 .1 CountDownLatch 21.1 .2 CyclicBarrier 21.1 .2.1 例子: 21.1 .2.2 输出结果: 21.1.2.3 详细解释:屏障点 21.1.3 Semaphore 21.1.3.1 使用 Semaphore例子&#xff1…

ros::NodeHandle用途用法

在ROS(Robot Operating System)中,ros::NodeHandle 是一个核心类,用于与ROS系统进行交互。几乎所有的ROS节点功能,例如发布或订阅主题、调用或提供服务,都需要使用到 ros::NodeHandle。 用途: 与ROS系统交互:ros::NodeHandle 是节点与ROS计算图系统进行通讯的主要接口…

GCC和G++的区别

GCC和G是我们在学习C/C并且进行编译的过程中,必会的知识点,今天小雷雷针对这个聊几句,嗯哼哼~ 👉👉👉gcc和g都是C/C的编译器,但是它们之间存在一些区别 GCC和G的渊源 GCC(GNU Comp…

【C语言进阶(10)】通讯录管理系统

文章目录 Ⅰ 系统功能介绍Ⅱ 系统前期准备⒈菜单功能⒉结构体设计⒊通讯录初始化 Ⅲ 系统功能实现⒈添加联系人⒉删除联系人⒊查找联系人⒋修改联系人⒌显示联系人⒍排序联系人⒎清空联系人 Ⅳ 完整代码展示⒈test.c⒉contact.h⒊contact.c Ⅰ 系统功能介绍 系统中需要实现的功…

matlab 计算点云协方差矩阵

目录 一、概述1、算法概述2、主要函数二、代码示例三、结果展示四、参数解析输入参数输出参数五、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述

java 可变参数

基本语法 可变参数的语法很简单&#xff0c;基本格式如下&#xff1a; 方法名(参数类型 ...)举例 public void printName(String... names) {int count names.length;for (int i 0; i < names.length; i) {System.out.println(names[i]);} }

气传导蓝牙耳机好不好?推荐几款不错的气传导耳机

​在众多的气传导耳机中&#xff0c;如何选择一款适合自己的气传导耳机呢&#xff1f;这需要考虑到自己的需求和预算&#xff0c;同时也需要了解不同品牌和型号的产品特点和优缺点。下面我来推荐几款非常不错的气传导耳机给大家参考&#xff0c;希望大家都能寻找到心仪那款。 …

【线性代数】矩阵求导的本质与分子布局、分母布局的本质(矩阵求导——本质篇)

矩阵求导的本质与分子布局、分母布局的本质&#xff08;矩阵求导——本质篇&#xff09; 说在前面一. 函数与标量、向量、矩阵二. 矩阵求导的本质三. 矩阵求导结果的布局四. 分子布局、分母布局的本质五. 向量变元的实值标量函数 说在前面 我将严谨地说明矩阵求导的本质与分子布…

centos下配置SFTP且限制用户访问目录

一、SFTP使用场景 ftp是大多数网站的文件传输选择工具,但ftp并不是非常安全,并且在centos上搭建的vsftpd也非常的不稳定,偶尔会出现权限问题,例如500、或是账号密码不正确等等。 而SFTP是基于默认的22端口,是ssh内含的协议,只要启动了sshd就可以使用。 建议:更高的效率…

[ES]mac安装es、kibana、ik分词器

一、安装es和kibana 1、创建一个网络&#xff0c;网络内的框架(eskibana)互联 docker network create es-net 2、下载es和kibana docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1 3、运行docker命令部署单点eskibana&#xff08;用来操作es&#xff09; doc…

leetcode分类刷题:字符串及单词翻转

1、本文此次总结的题型“leetcode分类刷题&#xff1a;字符串及单词翻转”较为简单&#xff0c;是双指针法在字符串及单词翻转类题型中的应用 2、如果单词翻转类题型加了O(1)空间复杂度的要求&#xff0c;算法思路会变得稍微复杂一点 344. 反转字符串 该题为字符串翻转的基础题…

ConsoleApplication17_2项目免杀(Fiber+VEH Hook Load)

加载方式FiberVEH Hook Load Fiber是纤程免杀&#xff0c;VEH是异常报错&#xff0c;hook使用detours来hook VirtualAlloc和sleep&#xff0c;通过异常报错调用实现主动hook 纤程Fiber的概念&#xff1a;纤程是比线程的更小的一个运行单位。可以把一个线程拆分成多个纤程&#…

InVEST模型+SolVES模型教程

详情点击公众号链接&#xff1a;基于当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析 前言 生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xf…

基于Ubuntu坏境下的Suricata坏境搭建

目录 Suricata环境安装 第一步、在 Ubuntu 端点安装 Suricata 1、加入Suricata源 2、更新安装包 3、下载SuricataSuricata 第二步、下载并提取新兴威胁 Suricata 规则集 1、在tmp文件夹下载 Suricata 规则集 如果发现未安装curl&#xff0c;使用apt安装即可&#xff1a…

打造高权重店铺的秘密,详解Shopee平台权重评估机制(测评补单)

很多虾皮卖家经常提到的"权重"是指商品或店铺在Shopee平台上的重要性程度。权重评估了商品或店铺是否符合用户需求&#xff0c;并且能否促进订单转化率&#xff0c;为平台带来收益。说白了权重就是给商品和店铺打分的机制&#xff0c;得分越高&#xff0c;权重越高&a…

简单shell脚本的编写

文章目录 简单使用shell脚本参数判断整数的比较运算符字符串的比较运算shell脚本流程控制shell脚本循环for循环批量添加用户批量ping IP地址检测同一局域网&#xff0c;多台主机存活情况检测同一局域网&#xff0c;多台主机存活情况多线程检测主机存活情况 while循环case选择语…

Python中处理Excel文件的常见问题与技巧

在数据分析和办公自动化领域&#xff0c;Excel是一种广泛使用的工具。本文将介绍如何利用Python来处理Excel文件时可能遇到的常见问题&#xff0c;并分享一些实用技巧。 1. 安装必要库 - 使用pip或conda安装openpyxl、pandas等第三方库&#xff1b; – 确保所选版本兼容性以及…

Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】

一、Sentinel整合openfeign 1、复制一下order-openfeign项目&#xff08;创建order-openfeign-sentinel&#xff09; 然后在stock-nacos当中编写对应的接口 RequestMapping("/reduct2")public String reduct2(){int a 1/0;System.out.println("扣减库存"…

单片机学习-什么是Flash?什么是RAM?什么是ROM?

什么是Flash&#xff1f; Flash 存储器&#xff08;FLASH EEPROM&#xff09;又称闪存&#xff0c;快闪。 它是EEPROM的一种。它结合了ROM和RAM的长处。不仅具备电子可擦除可编辑&#xff08;EEPROM&#xff09;的性能&#xff0c;还不会断电丢失数据同时可以快速读取数据。它于…

说说Lambda架构

分析&回答 Lambda架构是由Storm的作者Nathan Marz提出的一个实时大数据处理框架。Marz在Twitter工作期间开发了著名的实时大数据处理框架Storm&#xff0c;Lambda架构是其根据多年进行分布式大数据系统的经验总结提炼而成。Lambda架构的目标是设计出一个能满足实时大数据系…