maven详细讲解

学习目标

  • 那什么是maven
  • maven概念以及核心思想
  • maven构建的生命周期、阶段以及目标
  • maven仓库有哪些?
  • maven依赖

那什么是maven?maven概念以及核心思想,maven构建的生命周期、阶段以及目标?

那什么是maven

Maven是一个项目管理和构建自动化工具,它主要用于Java项目的构建、依赖管理和项目生命周期管理。以下是对Maven的详细解释:

一、Maven的核心功能

  1. 项目管理和构建:Maven能够管理项目的构建、报告和文档,提供了一个清晰的项目结构。它使用约定俗成的目录结构,使得所有的项目都有相同的目录布局,有助于开发人员对项目结构有明确的认识,更容易理解和维护代码。
  2. 依赖管理:Maven通过一个文本文件(通常被称为pom.xml)来定义项目的依赖关系。开发人员只需要在pom.xml文件中指定所需的依赖,Maven就能自动下载并导入这些依赖。这样,开发人员不再需要手动管理项目的依赖,大大减少了出错的可能性。
  3. 自动化构建:Maven提供了一些默认的构建生命周期和插件,以帮助开发人员自动化构建和测试过程。通过简单的命令行操作,就可以完成项目的编译、测试、打包和部署等任务。

二、Maven的其他特性

  1. 代码质量保证:Maven可以与一些插件一起使用,生成一些简单的单元测试报告,帮助开发人员了解代码的质量,并提供改进的建议。
  2. 项目文档生成:Maven可以生成项目的文档,包括API文档、项目报告等,帮助开发人员更好地理解项目的结构和实现。
  3. 统一构建环境:Maven能够提供一个统一的构建环境,使得不同的开发人员可以在相同的配置下进行开发和构建。这有助于提高项目的可维护性和可重用性。
  4. 多模块项目管理:Maven支持多模块项目的构建和管理,可以将多个相关的项目组织成一个项目,方便统一管理和构建。
  5. 插件扩展性:Maven有丰富的插件生态系统,开发人员可以通过自定义插件来扩展Maven的功能,满足项目的特定需求。
  6. 跨平台构建:Maven的构建过程是跨平台的,无论是在Windows、Linux还是Mac OS上,都能保证相同的构建结果。
  7. 集成版本控制系统:Maven可以与版本控制系统(如Git)集成,方便管理项目的版本和发布。
  8. 部署和发布:Maven提供了一套完整的部署和发布机制,开发人员可以通过简单的命令将项目发布到本地仓库或者远程仓库。

三、Maven的起源与发展
Maven起源于2002年,由Apache Software Foundation(ASF)发起并维护。它是一个功能全面、易于使用的项目管理工具,适用于各种规模的项目。通过使用Maven,开发人员可以更高效地管理项目、减少错误、提高代码质量和可维护性。

maven概念以及核心思想

Maven是一个项目管理和自动化构建工具,它在Java开发领域有着广泛的应用。以下是对Maven概念及其核心思想的详细解释:

Maven概念
Maven是一个基于项目对象模型(POM,Project Object Model)概念的项目管理工具。它主要用于Java项目的构建、依赖管理和项目生命周期管理。通过Maven,开发者可以以一种高效且统一的方式管理项目的构建、依赖、文档生成、报告等各个环节。Maven提供了一个清晰的项目结构,并使用pom.xml文件来描述项目的配置信息,包括项目的名称、版本、依赖关系、构建步骤等。

Maven核心思想
Maven的核心思想是“约定优于配置”(Convention Over Configuration)。这一思想体现在Maven提供了一套默认的构建和依赖管理规则,使得开发者可以专注于业务逻辑的实现,而无需在项目的构建和配置上花费过多时间。具体来说,Maven的核心思想包括以下几个方面:

  1. 约定的目录结构:Maven规定了项目的标准目录结构,如src/main/java用于存放Java源代码,src/test/java用于存放测试代码等。开发者只需按照这些约定来组织代码,就可以轻松地使用Maven进行构建和管理。
  2. 自动化的依赖管理:Maven通过pom.xml文件来管理项目的依赖关系。开发者只需在pom.xml文件中指定所需的依赖,Maven就能自动从远程仓库下载并导入这些依赖及其传递性依赖。这样,开发者无需手动管理依赖的版本和路径,大大减少了出错的可能性。
  3. 标准化的构建生命周期:Maven定义了一套标准化的构建生命周期,包括编译、测试、打包、部署等阶段。开发者可以通过配置pom.xml文件来定制这些阶段的行为,以满足项目的特定需求。同时,Maven还提供了丰富的插件和扩展点,使得开发者可以根据自己的需求定制和扩展构建过程。
  4. 易于集成的版本控制:Maven可以与版本控制系统(如Git)集成,方便管理项目的版本和发布。通过Maven,开发者可以轻松地创建项目的快照版本和发布版本,并将其发布到本地仓库或远程仓库中。

maven构建的生命周期、阶段以及目标

Maven的构建生命周期定义了一个项目从构建到发布的过程,它分为互相独立的三部分,每个部分包含若干阶段,每个阶段又可以绑定若干插件目标来执行特定的任务。以下是Maven构建生命周期、阶段以及目标的详细解释:

一、Maven构建生命周期
Maven的构建生命周期主要分为以下三部分:

  1. Clean生命周期:用于清理项目。当执行构建之前,通常需要清理上一次构建生成的文件,以确保项目从一个干净的状态开始。Clean生命周期包括pre-clean、clean和post-clean三个阶段。
  2. Default(Build)生命周期:用于构建项目。这是Maven最常用的生命周期,它涵盖了项目构建的主要阶段,从验证项目的正确性到将项目的构建结果部署到远程仓库。Default生命周期包括validate、initialize、generate-sources、process-sources、generate-resources、process-resources、compile、test-compile、test、package、verify、install和deploy等阶段。
  3. Site生命周期:用于建立项目站点。它主要用于生成项目的文档和站点信息,并将生成的站点信息发布到远程服务器。Site生命周期包括pre-site、site、post-site和site-deploy等阶段。

二、Maven构建阶段
每个生命周期包含的阶段是有前后顺序的,并且后面的阶段依赖于前面的阶段。在执行Maven命令时,mvn命令之后使用的参数便是Maven的各个阶段。例如,执行mvn clean命令会执行Clean生命周期的pre-clean和clean两个阶段;执行mvn compile命令会执行Default生命周期的validate到compile这七个阶段。

三、Maven插件目标
Maven的操作是基于不同的插件的不同目标来实现的。一个插件中包括若干目标,而每个目标会执行一个特定的任务。这些目标可能被绑定到多个阶段或者无绑定。不绑定到任何构建阶段的目标可以在构建生命周期之外通过直接调用执行。

例如,在Clean生命周期的clean阶段,通常会绑定maven-clean-plugin插件的clean目标来执行清理文件的操作。而在Default生命周期的compile阶段,则会绑定maven-compiler-plugin插件的compile目标来编译项目的源代码。

四、阶段与插件目标的绑定关系
Maven内部通过配置文件(如META-INF/plexus/components.xml)来定义阶段与插件目标的绑定关系。开发者也可以在项目的pom.xml文件中通过配置插件的executions元素来自定义阶段与插件目标的绑定关系。

maven仓库有哪些?

Maven仓库是用于存储Maven构建的工件(artifacts)的集中式存储库,工件是构建过程中的产物,包括编译后的代码、文档、测试报告等。Maven仓库主要分为以下几种类型:

一、本地仓库

  • 定义:本地仓库是存储在本地磁盘上的仓库,是默认的仓库类型。
  • 作用:当Maven在执行构建时,会首先在本地仓库中查找所需的依赖项和插件。如果本地仓库中不存在所需的依赖项或插件,Maven会从远程仓库下载并将其存储在本地仓库中。
  • 位置:默认情况下,本地仓库位于用户主目录下的.m2/repository目录中,但可以在Maven的配置文件settings.xml中进行配置以更改位置。

二、远程仓库

  • 定义:远程仓库是存储在网络上的仓库,可以由中央仓库、私服仓库和其他公共远程仓库等组成。
  • 作用:当Maven在本地仓库中找不到所需的依赖项或插件时,它会从远程仓库中下载。
  • 分类
    • 中央仓库:由Maven团队维护的远程仓库,包含了世界上大部分流行的开源项目的构件。中央仓库包含了大量的常用依赖项和插件,是最常用的远程仓库之一。
    • 私服仓库:一种特殊的远程仓库,通常由公司内部维护。私服仓库可以作为公司内部构件的共享存储库,也可以作为公用类库的镜像缓存,减少在外部访问和下载的频率。私服仓库还可以减少对中央仓库的访问,提高构建效率,并保证公司内部项目的构件一致性。
    • 其他公共远程仓库:除了中央仓库和私服仓库之外,还有一些其他的公共远程仓库,如JFrog、Nexus等。这些仓库提供了更丰富的构件选择,包括一些非开源的商业构件。

三、详细解释特定仓库

  • 私服仓库:在企业内部使用的仓库,用于存储公司内部的依赖和插件。建立私服仓库的好处包括节省外网带宽、加速Maven构建、部署无法在远程仓库部署的第三方构件或项目输出供内部项目使用、提高Maven构建的稳定性以及减少中央仓库的高访问负荷。
  • 镜像仓库:有时为了加速依赖的下载或解决网络访问问题,会使用镜像仓库来代替原始的中央仓库或其他远程仓库。例如,国内用户通常会使用阿里云Maven仓库、华为云Maven仓库、腾讯云Maven仓库等国内镜像仓库来加速依赖的下载。

maven依赖

Maven依赖是指Maven项目在编译、构建和执行过程中所依赖的外部对象或库。这些依赖通常是Java归档(jar)文件,包含编译代码或其他项目所需资源。以下是对Maven依赖的详细解释:

一、依赖的声明
在Maven中,依赖是在项目的pom.xml文件中声明的。pom.xml文件是Maven项目的核心配置文件,用于定义项目的构建、依赖、插件等。依赖的声明通常位于pom.xml文件的<dependencies>标签内,每个<dependency>标签代表一个依赖。

依赖的声明包含以下关键元素:

  1. groupId:依赖所属的组或组织。
  2. artifactId:依赖的唯一标识符。
  3. version:要使用的依赖版本。

这三个元素共同构成了依赖的坐标,Maven根据这些坐标来查找和下载所需的依赖。

二、依赖的范围(scope)
依赖的范围定义了依赖在项目的不同阶段(编译、测试、运行)中的可用性。Maven支持以下几种依赖范围:

  1. compile:默认范围,适用于所有类路径。在编译、测试和运行阶段都需要该依赖。
  2. provided:编译时可用,但不会包含在最终的包中。这种范围的依赖在运行时由JDK或容器提供。例如,servlet-api在编译和测试时需要,但在运行时由Servlet容器提供。
  3. runtime:运行时可用,但编译时不可用。这种范围的依赖在编译时不需要,但在测试和运行时需要。例如,JDBC驱动在编译时只需要JDK提供的JDBC接口,但在运行时需要具体的JDBC驱动实现。
  4. test:仅在测试期间可用。这种范围的依赖仅用于测试阶段,在编译和运行项目时无法使用。例如,JUnit测试框架。
  5. system:类似于provided,但需要显式提供依赖文件的路径。这种范围的依赖不依赖Maven仓库解析,因此可能会造成构建的不可移植性。通常不推荐使用。

三、传递性依赖
传递性依赖是指项目的直接依赖所依赖的其他库。Maven会自动解析这些传递性依赖,并将其包含在项目的构建路径中。这确保了所有必需的库都被包含在构建中。

四、依赖的排除
有时,项目可能需要排除特定的传递性依赖。这可以通过在<dependency>标签内添加<exclusions>子标签来实现。每个<exclusion>标签指定要排除的依赖的groupId和artifactId。

五、依赖的冲突与解决
当项目中存在多个版本的同一依赖时,Maven使用最近定义策略来解决冲突。最近的POM文件(最接近项目的POM文件)中指定的版本优先。为了显式控制依赖的版本,可以使用<dependencyManagement>部分来统一管理依赖版本。

六、依赖的仓库
Maven使用仓库来下载依赖。仓库可以是本地仓库(位于开发者的机器上,Maven将下载的依赖缓存于此)或远程仓库(如Maven Central、公司自定义仓库等)。远程仓库可以在POM文件或Maven设置文件(settings.xml)中配置。

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

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

相关文章

DeepSeek 提示词之角色扮演的使用技巧

老六哥的小提示&#xff1a;我们可能不会被AI轻易淘汰&#xff0c;但是会被“会使用AI的人”淘汰。 在DeepSeek的官方提示库中&#xff0c;有“角色扮演&#xff08;自定义人设&#xff09;”的提示词案例。截图如下&#xff1a; 在“角色扮演”的提示词案例中&#xff0c;其实…

第二个Qt开发实例:在Qt中利用GPIO子系统和sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口(效果为LED2灯的灭和亮)

引言 本文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145420998 里的代码&#xff0c;在那里面代码的基础上添加上利用sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口的代码&#xff0c;进而实现LED2灯的灭和亮。 最终的效果是点击下面的LED按钮实现LED…

登山第十七梯:矩形拟合——无惧噪声

文章目录 一 摘要 二 资源 三 内容 (文章末尾提供源代码) 一 摘要 目前,获取点集的矩形拟合结果的主要方法是计算其最小外包直立矩形或者旋转矩形。这些方法简单、易用,在数据质量良好的情况下能够较好的贴合矩形形状。然而,在数据缺失时,最小外包围盒方法将会…

57. Uboot图形化界面配置

一、Uboot图形化配置方法 1、通过终端配置。 2、进入到uboot的源码根目录下。 3、首先默认配置 make mx6ull_alientek_emmc_defconfig //默认配置 4、输入make menuconfig。打开图形化配置界面。 5、注意&#xff0c;新电脑需要安装ncurses库。sudo apt-get install libncurs…

Java面试场景题分享

假设你在做电商秒杀活动&#xff0c;秒杀开始时&#xff0c;成千上万的用户同时请求抢购商品。你会如何设计系统来处理这些请求&#xff0c;确保库存不超卖 你如何保证库存的准确性&#xff1f; 这个问题引导你思考如何在高并发下确保库存更新的原子性&#xff0c;最直接的方式…

kalman滤波器C++设计仿真实例第三篇

1. 仿真场景 水面上有条船在做匀速直线航行&#xff0c;航行过程中由于风和浪的影响&#xff0c;会有些随机的干扰&#xff0c;也就是会有些随机的加速度作用在船身上&#xff0c;这个随机加速度的均方差大约是0.1&#xff0c;也就是说方差是0.01。船上搭载GPS设备&#xff0c;…

(2025|ICLR,音频 LLM,蒸馏/ALLD,跨模态学习,语音质量评估,MOS)音频 LLM 可作为描述性语音质量评估器

Audio Large Language Models Can Be Descriptive Speech Quality Evaluators 目录 1. 概述 2. 研究背景与动机 3. 方法 3.1 语音质量评估数据集 3.2 ALLD 对齐策略 4. 实验结果分析 4.1 MOS 评分预测&#xff08;数值评估&#xff09; 4.2 迁移能力&#xff08;在不同…

stm32生成hex文件详解

1.产生的map文件干啥的&#xff1f; 2.组成情况&#xff1f;&#xff1f;&#xff1f; 废话少说&#xff0c;直接上代码具体内容况&#xff1a; Component: ARM Compiler 5.06 update 7 (build 960) Tool: armlink [4d3601]Section Cross Referencesstartup_stm32f103xe.o(S…

百度热力图数据获取,原理,处理及论文应用6

目录 0、数据简介0、示例数据1、百度热力图数据日期如何选择1.1、其他实验数据的时间1.2、看日历1.3、看天气 2、百度热力图几天够研究&#xff1f;部分文章统计3、数据原理3.1.1 ** 这个比较重要&#xff0c;后面还会再次出现。核密度的值怎么理解&#xff1f;**3.1.2 Csv->…

汽车自动驾驶AI

汽车自动驾驶AI是当前汽车技术领域的前沿方向&#xff0c;以下是关于汽车自动驾驶AI的详细介绍&#xff1a; 技术原理 感知系统&#xff1a;自动驾驶汽车通过多种传感器&#xff08;如激光雷达、摄像头、雷达、超声波传感器等&#xff09;收集周围环境的信息。AI算法对这些传感…

[转]Java面试近一个月的面试总结

本文是在学习中的总结&#xff0c;欢迎转载但请注明出处&#xff1a;http://blog.csdn.net/pistolove/article/details/46753275 前言 打算换个工作&#xff0c;近一个月面试了不少的公司&#xff0c;下面将一些面试经验和思考分享给大家。另外校招也快要开始了&#xff0c;为…

出租车特殊计费表算法解析与实现

目录 引言算法核心概念 特殊计费规则解析数据类型与输入输出算法数学原理 数字位判断与处理逻辑数值转换与累加计算算法框架图Python 实现 代码展示代码解析Python 实现的优势与局限C 语言实现 代码展示代码解析C 语言实现的性能特点性能分析与优化 性能分析 时间复杂度空间复杂…

学习threejs,tga格式图片文件贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️TGA图片1.2 ☘️THREE.Mesh…

MSPFN 代码复现

1、环境配置 conda create -n MSPFN python3.9 conda activate MSPFN pip install opencv-python pip install tensorflow pip install tqdm pip install matplotlib2、train 2.1 创建数据集 2.1.1 数据集格式 |--rainysamples |--file1&#xff1a; |--file2:|--fi…

【创建模式-单例模式(Singleton Pattern)】

赐萧瑀 实现方案饿汉模式懒汉式&#xff08;非线程安全&#xff09;懒汉模式&#xff08;线程安全&#xff09;双重检查锁定静态内部类 攻击方式序列化攻击反射攻击 枚举(最佳实践)枚举是一种类 唐 李世民 疾风知劲草&#xff0c;板荡识诚臣。 勇夫安识义&#xff0c;智者必怀仁…

2025职业发展规划

2025职业发展规划 我是一名大公司的高级移动应用开发技术专家&#xff0c;目前参与了鸿蒙App开发&#xff0c;对鸿蒙的TS语言也有所了解。现在需要制定2025年的职业发展规划&#xff0c;包括学习内容和方向&#xff0c;并以思维导图的形式呈现。我需要梳理出合适的发展路径。首…

如何查看linux机器有几个cpu

在 Linux 机器上&#xff0c;你可以使用以下几种方法来查看 CPU 的数量&#xff08;物理 CPU 和逻辑 CPU&#xff09;&#xff1a; 方法 1&#xff1a;使用 lscpu 命令 lscpu输出示例&#xff1a; CPU(s): 8 Thread(s) per core: 2 Core(s) per socket: 4 Soc…

fputs的概念和使用案例

fputs 是 C 语言中用于向文件写入字符串的标准库函数。它与 puts 类似&#xff0c;但不会自动添加换行符&#xff0c;且支持向任意文件流&#xff08;如磁盘文件、标准输出等&#xff09;写入数据。 概念解析 函数原型&#xff1a;int fputs(const char *str, FILE *stream); …

宏观经济:信贷紧缩与信贷宽松、通货膨胀与通货紧缩以及经济循环的四个周期

目录 信贷紧缩与信贷宽松信贷紧缩信贷宽松信贷政策对经济影响当前政策环境 通货膨胀与通货紧缩通货膨胀通货紧缩通货膨胀与通货紧缩对比 经济循环的四个周期繁荣阶段衰退阶段萧条阶段复苏阶段经济周期理论解释经济周期类型 信贷紧缩与信贷宽松 信贷紧缩 定义&#xff1a;金融…

20240206 adb 连不上手机解决办法

Step 1: lsusb 确认电脑 usb 端口能识别设备 lsusb不知道设备有没有连上&#xff0c;就插拔一下&#xff0c;对比观察多了/少了哪个设备。 Step 2: 重启 adb server sudo adb kill-serversudo adb start-serveradb devices基本上就可以了&#xff5e; Reference https://b…