maven一点通

1.maven简介

Maven是一个基于Java的工程构建工具,用于管理和构建项目的依赖关系。它提供了一种标准的项目结构和一组约定,使得项目的开发、构建、部署和文档化更加容易和可靠。

Maven的主要功能包括:

  • 依赖管理:Maven可以自动下载和管理项目所需的依赖库。通过声明项目的依赖关系,Maven可以自动解决依赖冲突,并下载和安装所需的库。

  • 构建管理:Maven可以自动执行项目的构建过程,包括编译、测试、打包、部署等操作。Maven使用插件来执行这些操作,可以根据项目的需要灵活配置和扩展。

  • 团队协作:Maven支持多人协作开发,可以通过中央仓库和本地仓库共享项目的依赖库。同时,Maven提供了一些插件,可以用于集成和持续集成等开发实践。

2.生命周期

Maven生命周期是指Maven构建过程中的一系列阶段,每个阶段执行不同的任务。Maven生命周期分为三个主要阶段:Clean(清理)、Build(构建)和Site(站点)。

  1. Clean阶段:在这个阶段,Maven会清理项目中的所有生成的文件,以确保从一个干净的状态开始构建。主要包括清理输出目录和临时文件等。clean阶段只有一个目标:clean。

  2. Build阶段:这个阶段是Maven构建的核心阶段。它包括了项目的编译、测试、打包等操作。

    • validate:验证项目是否正确且是否可以构建。
    • compile:编译项目的源代码。
    • test:运行项目的单元测试。
    • package:将编译后的源代码打包成可分发的格式,如JAR、WAR等。
    • install:将打包好的文件安装到本地仓库,供其他项目使用。
    • deploy:将打包好的文件部署到远程仓库,供其他开发人员使用。
  3. Site阶段(冷门功能):这个阶段用于生成项目的站点文档,包括项目的API文档、用户手册等。它可以生成静态HTML或者部署到web服务器上。

    • site:生成项目的站点文档。
    • site-deploy:将站点文档部署到web服务器上。

每个阶段都由一个或多个插件来执行,这些插件在Maven的POM文件中配置。

Maven的生命周期是顺序执行的,你可以选择在某个生命周期中定义特定的插件执行某个任务。例如,在Build阶段的compile阶段可以配置编译插件,test阶段可以配置测试插件来运行单元测试。

3.下载与安装

3.1官网下载

大部分Java IDE都有一个嵌入式maven,例如IDEA。如果不需要命令行操作,则无需额外下载。

maven本身是java开发的,必须先安装jdk环境。

官网下载 -->  maven

下载之后,解压缩到指定目录即可。

3.2配置环境变量

如果需要在命令行操作,则需要配置环境变量(以win10系统做演示)。

3.2.1.前往系统属性,我的电脑->计算机->系统属性

3.2.2.搜索环境变量 

3.2.3.配置环境变量

新增环境变量,命名为MAVEN_HOE,指向maven的安装目录 (不包含bin目录

 Path环境变量添加一项,“%MAVEN_HOME%\bin

3.2.4.验证环境变量,命令行输入 "mvn -version"

3.2.5修改本地仓库地址

maven默认本地仓库地址为:usr/.m2/repository。由于本地仓库的默认位置是在用户的家目录下,一般在C盘。随着时间推移,仓库体积越来越庞大,影响系统性能。所以强烈建议将 Maven 的本地仓库放在其他驱动盘。maven安装目录config下的settings.xml文件,修改<localRepository>标签,指向新目录。

3.2.6修改远程仓库镜像地址

Maven中央仓库在境外,而国外网站速度很慢。可改成阿里云(或腾讯云等)提供的镜像仓库,提高下载速度。配置的方式也在settings.xml文件里。

    <mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>

4.maven核心概念

4.1项目对象模型(POM)

POM是Maven项目的核心文件,以XML格式编写。它定义了项目的基本信息、依赖关系、构建配置等。POM文件必须位于项目根目录下,并且命名为pom.xml。

4.2坐标(Coordinate)

坐标用于唯一标识一个Maven项目或者项目的依赖关系。坐标包括groupId、artifactId和version三个元素。groupId用于标识项目所属的组织或者团队,artifactId用于标识项目的名称,version用于标识项目的版本号。

4.3插件(Plugins)

Maven插件是用于执行项目构建过程中的具体任务的工具。Maven有很多内置插件,也可以自定义插件。插件的执行由Maven生命周期的不同阶段触发。

4.4构建目录结构

Maven推荐的项目目录结构有一定的约定,包括src/main/java用于存放项目的源代码,src/test/java用于存放单元测试代码,以及其他一些目录用于存放配置文件、资源文件等。

4.5依赖范围

  • compile(默认): 该依赖项在编译、测试和运行时都可用。

  • test: 该依赖项只在测试阶段可用,不会被打包到生成的项目中。

  • provided: 该依赖项在编译和测试阶段可用,但在运行时由JDK或某个服务器提供。比如servlet-api可以由服务器提供。

  • runtime: 该依赖项在运行时可用,但不参与编译和测试阶段。

  • system: 该依赖项类似于provided,但需要手动提供jar文件的路径。不推荐使用该范围。

  • import: 该依赖项只用于父项目的dependencyManagement部分。它引入了一个外部项目的依赖管理。

4.6依赖传递

Maven依赖传递是指当一个项目依赖于其他项目时,它将自动获取所依赖项目的依赖项。Maven使用依赖传递来管理项目依赖关系并确保所有需要的依赖项都被正确地获取和使用。

依赖传递有以下几个特点:

  1. 传递性:如果项目A依赖于项目B,而项目B又依赖于项目C,则项目A将间接依赖于项目C。Maven会自动解析和获取项目C的依赖项。

  2. 依赖冲突解决:当多个依赖项具有相同的groupId和artifactId,但版本不同时,Maven将根据一定的冲突解决策略选择一个版本。默认情况下,它选择最近的版本。

  3. 排除依赖项:有时候,可能需要排除某个依赖项的传递性依赖,在pom.xml文件中使用<exclusions>标签可以指定需要排除的依赖项。

4.7依赖冲突

4.7.1依赖冲突选择策略

由于依赖的传递性,导致不同依赖的子依赖会出现版本问题,有可能你以为依赖了版本2.1,但因为出现冲突,实际生效的版本是1.2。

Maven有一套依赖冲突解决策略来处理这种情况,它根据以下几个原则选择一个版本:

  1. 最短路径优先原则:Maven会选择离项目最近的依赖项路径中的版本。也就是说,如果项目直接依赖于一个版本,而间接依赖于另一个版本,那么直接依赖的版本将被选择。

  2. 第一声明优先原则:如果两个依赖项具有相同的路径长度,那么首次声明的版本将被选择(按照pom的依赖申明顺序)。

  3. 显式声明优先原则:如果两个依赖项具有相同的路径长度和首次声明顺序,那么Maven会选择在项目pom.xml文件中显式声明的版本。

4.7.2IDEA自带依赖分析工具

IDEA可以通过依赖分析工具,查询指定依赖的上级以及下级依赖,如此可以排除一些版本冲突。

4.7.2IDEA插件市场搜索分析插件

IDEA还可以从插件市场下载分析插件,点击Files->Settings->plugins,搜索“maven helper”

5.多模块继承与聚合

5.1多模块继承

在Maven中,继承指的是使用父项目定义的配置信息来为子项目提供默认的配置。这种继承关系可以帮助开发者减少重复的配置,并确保子项目与父项目保持一致的构建方式。maven子模块可以继承的有以下内容。

  • 配置
  • 依赖声明
  • 插件声明

5.2多模块聚合

在Maven中,聚合(aggregation)是一种将多个相关的项目组合在一起管理的方式。通过聚合,可以将多个项目作为一个整体来构建、测试和部署,简化了多项目管理的复杂度。

要实现项目的聚合,需要创建一个父项目(也称为聚合项目),并在父项目的pom.xml中声明子项目。父项目可以是一个普通的Maven项目,其packaging类型可以是pom,jar,war或其他类型。

例如jforgame的配置。在根目录下执行mvn package install命令的时候,会递归把所有子模块都打包安装到本地maven仓库,非常方便。例如jforgame的parent模块。

    <modules><module>jforgame-hotswap</module><module>jforgame-commons</module><module>jforgame-orm</module><module>jforgame-demo</module><module>jforgame-codec-parent</module><module>jforgame-socket-parent</module></modules>

详情可参考-->   Maven模块化最佳实践

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

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

相关文章

课设系统篇

《古代六扇门人员管理系统》 数据库 sixdoor 编码 utf8mb4 视图 查询官员等级 存储过程 CREATE DEFINERrootlocalhost PROCEDURE levelname(IN g_name VARCHAR(20)) BEGINSELECT name,level FROM servingofficials INNER JOIN jobtitle onservingofficials.role jobtitl…

Android性能自测

目录 一、应用启动耗时自测 二、帧率查看 三、Top命令查看系统资源占用 3.1 第一行&#xff1a;任务(进程) 3.2 第二行&#xff1a;mem状态 3.3 第三行&#xff1a;swap交换分区 3.4 第四行&#xff1a;cpu状态 3.5 第五行&#xff1a;标题 四、抓取trace.html文件分析…

基于tcp协议的网络通信(基础echo版.多进程版,多线程版,线程池版),telnet命令

目录 基础版 思路 辅助函数 服务端 代码 运行情况 -- telnet ip 端口号 传输的数据为什么没有转换格式 客户端 思路 代码 多进程版 引入 问题 解决 注意点 服务端 代码 运行情况 进程池版(简单介绍) 多线程版 引入 问题解决 注意点 服务端 代码 …

嵌入式Linux 内核的内存管理方法

内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。 虚拟地址的作用 如果用户进程直接操作物理地址会有以下的坏处: 1、 用户进程可以直接操作内核对应的内存,破坏内核运行。 2、 用户进程也会破坏其他进程的运行 …

连号区间数c++

题目 输入样例1&#xff1a; 4 3 2 4 1输出样例1&#xff1a; 7输入样例2&#xff1a; 5 3 4 2 5 1输出样例2&#xff1a; 9样例解释 第一个用例中&#xff0c;有 77 个连号区间分别是&#xff1a;[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4][1,1],[1,2],[1,3],[1,4],[2,2…

详细讲解c语言结构体、联合体、枚举

目录 1、结构体类型声明 1.1结构体的定义 1.2 结构体变量的声明 1.3 结构体变量的创建和初始化 2、如何使创建的结构体所占内存最小 2.1 结构体内存对齐-存储 2.2 通过宏offsetof计算结构体内变量的偏移量 2.3 如何通过宏offsetof计算数组的偏移量 2.4 为什么存在内存对…

吴恩达机器学习笔记 二十四 决策树模型 学习过程 什么时候停止分裂 如何选择结点特征

案例&#xff1a;识别小猫&#xff0c;上面这个分类的特征 x 采用分类值&#xff08;几个离散的值&#xff09; 决策树最顶端的结点称根结点(root node)&#xff0c;除了根结点和叶子结点之外的叫决策结点(decision node)&#xff0c;最底层的叫叶子结点(leaf node)&#xff0c…

华为openEuler系统卸载jdk

华为openEuler系统卸载jdk 1.查看openEuler上已安装的 Java 版本&#xff1a; 在终端中运行以下命令&#xff0c;查看系统中已经安装的 Java 版本。 sudo alternatives --config java这将列出已安装的 Java 版本&#xff0c;你可以看到当前使用的是哪个版本 2.卸载 Java&am…

Python函数学习

Python函数学习 1.函数定义 在函数定义阶段只检查函数的语法问题 2.实参形参 ​​​​总结&#xff1a; &#xff08;1&#xff09;位置参数就是经常用的按照位置顺序给出实参的值&#xff1b; &#xff08;2&#xff09;关键字实参形式&#xff1a;key123&#xff1b;放在…

轻松打造完美原型:9款在线工具推荐

早年&#xff0c;UI设计师选择的工具有限&#xff0c;功能相对单一&#xff0c;大多数在线原型设计工具都是国外的&#xff0c;语言和网络都增加了设计工作的负担。如今&#xff0c;国内外有许多在线原型设计工具&#xff0c;不仅可以在浏览器上使用&#xff0c;而且还具有团队…

基于SpringBoot的后勤管理系统【附源码】

后勤管理系统开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myecli…

面试算法-51-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {dfs(root);re…

Hybrid第二次雪梨作业

作业要求: 利用ReactNative和Axios完成以下效果。 注意: 1、RN不能直接引用svg图片,需使用第三方库,可将logo图片换成百度logo 2、搜索框可不要搜索图标 3、“全部”“精华”等前5项类型切换功能要实现(“客户端测试可不写”,接口没给出参数值),调用 https://cnodejs…

arcgis数据导出到excel

将arcgis属性数据导出到excel&#xff1a; 1&#xff09; 工具箱\系统工具箱\Conversion Tools.tbx\Excel\Excel 转表 2&#xff09;用excel打开导出的图层文件中后缀为.dbf的数据&#xff08;方便快捷&#xff0c;但是中文易乱码&#xff09;

phpstudy自定义安装mysql8.3并启动

phpstudy自定义安装mysql8.3并启动 先去官网:https://dev.mysql.com/downloads/下载压缩包文件 然后按下面的图片一步一步操作 选择版本&#xff0c;选择第一个压缩包文件&#xff0c;下载 下载完成后&#xff0c;解压到phpstudy环境目录下&#xff0c;如下图 然后进入mysq…

MySQL | CRUD

目录 1. Create 2. Retrieve 2.1. SELECT列 2.1.1. 全列查询 2.1.2. 指定列查询 2.1.3. 查询字段为表达式 2.1.4. 为查询结果指定别名 2.1.5. 结果去重 2.2. WHERE条件 2.2.1. 年龄小于19的同学 2.2.2. id在2~3的同学 2.2.3. id为1和4的同学 2.2.4. 姓张的同学及张…

集成学习 | 集成学习思想:Bagging思想

目录 一. Bagging思想1. Bagging 算法2. 随机森林(Random Forest)算法 在正文开始之前&#xff0c;我们先来聊一聊什么是集成学习&#xff1f; 集成学习是一种算法思想&#xff1a;将若干个弱学习器分组之后&#xff0c;产生一个新的学习器 弱学习器指预测误差在50%以下的学习器…

VS Code安装Live Server插件搭建web网页结合内网穿透实现公网访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

性能测试-Jmeter常用元件基础使用

一、Jmeter元件 #线程组 添加HTTP请求 #配置元件 配置元件内的元件都是用于进行初始化的东西 #监听器 监听器主要是用来获取我们使用取样器发送请求后的响应数据相关信息 #定时器 定时器主要用来控制我们多久后执行该取样器&#xff08;发送请求&#xff09; #前置处理器 前置处…

【Python循环3/5】条件循环语句

目录 导入 条件循环 边界条件 while循环 死循环 while循环与for循环的区别 总结 知识图谱 导入 我们已经学习了如何利用for语句实现代码重复执行的循环结构。通过遍历列表&#xff0c;输出其中的每一个元素。 for循环就像是排队办事&#xff0c;一个个进入&#xff0c;轮…