当前位置: 首页 > news >正文

【JavaEE】Maven配置

一、Maven简介

什么是Maven?

Maven是一个基于项目对象模型(POM)构建的自动化工具,主要用于Java项目构建、依赖管理和项目信息管理

我理解的Maven:自动下载和管理“代码零件”(比如别人写好的工具包)。其实就是把别人写好的工具包拿过来自己使用,会比较方便

核心优势

·标准化构建:通过pox.xml定义项目结构、依赖和构建流程

·依赖管理:自动下载和管理项目依赖(JAR包)

·多模块支持:轻松管理多模块项目

·插件机制:通过插件扩展功能(如编译、打包、测试)

二、创建Maven项目

社区版创建

我们这里以IDEA2021.3.2版本为例

1.新建项目

File->New->Project->Maven,勾选Create from archetype(可选),然后点击Next

注意:前提是项目SDK已正确配置(如JDK17或更高版本)

2.配置坐标

填写GroupId(组织标识)、ArtifactId(项目名)、Version(版本号)、Name(项目名)、Location(项目路径)

然后点击Finish即可创建成功

专业版创建

我们这里以IDEA2021.1版本为例

专业版与社区版在Maven项目创建上流程一致,但专业版支持更多框架集成(如Spring Boot),可直接选择框架模板生成项目。(我们后续在讲解Spring Boot时,就是使用的专业版)

三、Maven核心功能

接下来,我们结合项目,介绍Maven在项目开发中的作用

项目构建

Maven提供了标准的,跨平台(Linux、Windows、MacOS等)的自动化项目构建方式

当我们开发了一个项目之后,代码需要经过编译、测试、打包、发布等流程。每次代码的修改,都需要经过这些流程,如果代码反复调试修改,这个流程就需要反复进行,就显得特别麻烦,而Maven给我们提供了一套简单的命令来完成项目的构建

Maven通过生命周期阶段(Lifecycle Phases)构建项目,常用命令:

·clean :清除target目录

·compile:编译源码

·test:运行单元测试

·package:打包项目(如JAR/WAR)

·install:安装到本地仓库

比如,点击package,就可以完成项目的打包操作

我们之前学习过一个java代码要经过以下过程,才能保证“Write once,Run anywhere”

打包就是把所有的class文件,全部放在一起,打成jar包或者war包

jar包和war包都是一种压缩文件

jar包就是把开发人员已经写好的一些代码进行打包。打好的jar包就可以引入到其他项目中,也可以直接使用这些jar包中的类和属性。另外也可以打成可执行jar包,这样的包就可以通过java -jar命令来执行

war包可以理解为是一个web项目,里面是项目的所有东西,通常用于网站

依赖管理

上面说到,Maven是一个项目管理工具,通过pom.xml文件的配置获取jar包,而不用手动去添加jar包

获取的jar包,其实就是依赖

pom.xml就是maven的配置文件,用以描述项目的各种信息

依赖配置

依赖:指当前项目运行所需要的jar包

比如前面学习JDBC时,我们需要手动下载mysql-connector-java的包,并且添加到项目中

如果使用Maven,我们只需要在pom.xml中引入mysql-connector-java的依赖就可以了

<dependencies><!--里面放置项目的依赖坐标,可以为多个-->
</dependencies>

1.在pom文件<dependencies>标签内,添加依赖坐标

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>4   <version>8.0.30</version>
</dependency>

2.点击刷新按钮,引入新加入的依赖jar包

后续有添加新的jar包,或者修改jar包版本,都需要通过该方式在项目中添加依赖

3.刷新完之后,就可以在项目中看到新加入的jar包了

依赖传递

定义:Maven会自动解析依赖的依赖(传递性依赖)。例如,引入spring-boot-starter-web会自动引入其依赖的Tomcat、Spring MVC等

早期我们没有使用maven时,向项目中添加依赖的jar包,需要把所有的jar包都复制到项目工程下。比如A依赖B,B依赖C,那么A项目引入B的同时,也需要引入C,如果我们手动管理这个依赖,这个过程就会比较麻烦,我们需要知道每个库都依赖哪些库,以及这些依赖之间的版本是如何关联的

比如我们要吃火锅,需要有锅,有调料,有食材,以及确认什么样的锅,什么样的食材

比如去医院看病,需要带上以往的病历,检查结果,处方等,并且要确认带的资料是正确的,如果日期错了,或者患者错了,带少了,就需要回去重新拿

但使用maven的话,就可以避免管理所需依赖的关系。我们只需要在pox文件中,定义直接依赖就可以了,由于maven的依赖具有传递性,所以会自动把所依赖的其他jar包也一起导入

比如吃火锅,现在我们可以点一个海底捞外卖,直接就把所有食材都送过来了,包括什么锅,配什么菜。

比如去医院看病,借助“互联网”,实现了信息共享,只需要带上身份证,以往的病历和检查结果就可以都看到了

如上图,项目A通过Maven引入JarA时,会自动引入Jar B和Jar C

Jar A和项目B就是项目A的直接依赖

Jar B和Jar C是项目A的间接依赖

直接依赖:在当前项目中通过依赖配置建立的依赖关系

间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

依赖排除

定义:指主动断开依赖的资源(被排除的资源无需指定版本)

比如,我下了一个快递单子,默认会有一个服务,就是快递小哥会上门取件,但是我刚好要出门,而且顺路经过站点,也可以选择自己送过去

当前阶段我们需要依赖的库并不多,但随着项目越来越复杂,库之间的依赖关系也会变得越来越复杂

如上图中,如果项目A不需要JarB,也可以通过排除依赖的方式来实现

通过<exclusions>排除特定传递性依赖:

xml
<dependency><groupId>com.example</groupId><artifactId>example-lib</artifactId><version>1.0</version><!--排除依赖--><exclusions><exclusion><groupId>unwanted-group</groupId><artifactId>unwanted-artifact</artifactId></exclusion></exclusions>
</dependency>

maven还有一些功能是依赖调解,可选依赖等

依赖调解:

当项目中的依赖存在依赖冲突时,例如:存在这样的依赖:

A->B->C->X(1.0)

A->D->X(2.0)

Maven会采用最短路径优先的原则去选择依赖,这里2的依赖路径更短,所以会选择X(2.0),当然我们也可以选择指定某个依赖的版本

四、Maven Help插件

当项目比较复杂时,我们就有jar包冲突的问题,这时候就需要去解决依赖冲突。解决冲突之前,需要先找到冲突,我们可以使用Maven Help插件来观察包和包之间的依赖关系

理解“插件”(plugin)

像IDEA这样的程序虽然功能强大,但是也无法做到面面俱到。对于一些特定场景的功能,开发者就可以开发一些“插件”。如果需要这个插件,就单独安装

插件就是对程序的一些特定场景,做出一些特定的功能的扩展

安装插件

File->Settings->Plugins->搜索“Maven Help”->找到对应插件,点击 Install安装即可,安装后需要重启下 idea,才能生效

安装之后,打开pom文件,就可以看到Jar包之间的依赖关系

也可以右键排除掉一些依赖。右键后选择Exclude即可

五、Maven仓库

我们通过短短几行代码,就把依赖jar包放在了项目里,具体是如何做的呢?

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>4   <version>8.0.30</version>
</dependency>

这个代码,我们称之为“坐标”,也就是唯一的

在Maven中,根据groupId(组织标识)、artifactId(项目名)、version(版本)的配置,来唯一识别一个jar包,缺一不可。

还记得不:我们在创建Maven项目时,就是用这三个参数配置坐标的

当我们在pom文件中配置完依赖之后,点击刷新,Maven会根据坐标(<dependency>)的配置,去仓库里寻找Jar包,并把她下载下来,添加到项目中。这个Jar包下载的地方就成为仓库

仓库:用于存储资源,管理各种Jar包

Maven仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖(jar包、插件等)

Maven仓库分为两大类:本地仓库和远程仓库。其中远程仓库又分为中央仓库,私服和其他公共库

本地仓库

定义:自己计算机上的一个目录(用来存储jar包)

当项目中引入对应依赖的jar包后,首先会查找本地仓库中是否有对应的jar包

·如果有,则在项目中直接引用

·如果没有,则去中央仓库中下载对应的jar包到本地仓库

本地仓库地址可以通过Maven配置查看:

File->Settings->搜索maven->Local reposi的地址即为本地仓库

查看该仓库目录,可以看到该目录下有很多的jar(最开始是空的,随着Maven的使用,该仓库下文件会越来越多)

中央仓库

定义:Maven软件中内置一个远程仓库地址,就是中央仓库,服务于整个互联网。由Maven团队维护,全球唯一

仓库地址https://repo1.maven.org/maven2/

我们可以看到仓库里的jar包,但是并不方便使用。

我们可以通过https://mvnrepository.com 这个网站来查询并下载

我们可以把自己写好的Jar包上传到中央仓库(具备一定的要求),也可以从中央仓库下载Jar包

查找Jar的坐标

1.访问https://mvnrepository.com

2.进行查找,比如mysql

3.选择要添加的Jar包版本

4.查看Jar包对应坐标

我们只需要复制后,到pom文件下,粘贴即可

私有服务器(私服)

私服:一般由公司团队搭建的私有仓库

私服属于某个公司,或者某个部门,往往需要一定权限

有了私服之后,Maven依赖下载的顺序又发生了变化

当Maven需要下载资源的时候

1.先从本地仓库获取,本地仓库存在,则直接返回

2.如果本地仓库没有,就从私服请求,私服存在该资源,就直接返回

3.如果私服上不存在该资源,则从中央仓库下载,中央仓库不存在,就报错了

4.如果中央仓库中存在,就先缓存在私服上之后,再缓存到本地仓库里,再为Maven的下载请求提供服务

私服是很多人在使用的,所以只需要第一个使用者下载一次就可以了

Maven设置国内源

因为中央仓库在国外,所以下载起来会比较慢,所以咱们选择借助国内一些公开的远程仓库来下载资源

接下来介绍,如何设置国内源

配置当前项目Settings

File->Settings->搜索maven->找到User setting file

1.查看配置文件的地址,如上图所示,Maven配置文件地址为:D:\Maven\.m2\settings.xml

不同电脑设置的Maven路径不同

User settings file和Local repository可以修改设置为其他路径,但两个路径中不要有中文

2.配置国内源

Maven仓库默认在国外 https://mvnrepository.com/  ,国内使用时会比较慢,我们可以更换为阿里云的仓库,当然也可以选择别的仓库,我们这里参考:Maven 镜像地址大全 - 知乎

打开settings.xml(上述配置文件的地址),在mirrors节点上,添加内容如下:

settings.xml内的字符很多,我们下滑找到<!--mirrors  ,然后把从 Maven 镜像地址大全 - 知乎 中复制的阿里云镜像地址添加到<!--mirrors 中即可

设置新项目的setting

上述配置的内容,只对当前项目生效,为了让后续新建的项目也生效,需要重新设置一下新项目的Settings

只需要保证:当前项目和新项目共用一个settings文件即可,所以新项目的设置,只需要确认一下settings文件的路径即可

步骤:File->New Projects Setup->Settings for New Projects

只需要新项目的User settings file和Local repository如下即可:

相关文章:

  • (leetcode算法题)309. 买卖股票的最佳时机含冷冻期
  • 【音视频】音视频FLV合成实战
  • 界面开发框架DevExpress XAF实践:如何在Blazor项目中集成.NET Aspire?(一)
  • 拖拉拽效果加点击事件
  • 智慧交通内容及发展趋势概述
  • 第五章 SQLite数据库:6、SQLite 常用语法1
  • 【数据结构】AVL树
  • 主数据管理:企业数字化转型的 “数据基石“ 如何为 AI 筑基?
  • Google Mock(GMock):C++单元测试的高效模拟框架详解
  • D4707同步整流器:提升Flyback转换器效率的关键元件
  • 本地Ubuntu轻松部署高效性能监控平台SigNoz与远程使用教程
  • Django 实现物联网管理系统的详细方案
  • Unity3D 测试驱动开发(TDD)框架设计
  • Immich图库本地部署与远程管理:打造你的专属照片云服务
  • Intel(R) Wi-Fi 6 AX201 160MHz
  • Linux信号三部曲:产生机制、处理方式与内核接口
  • vscode+keil嵌入式软件开发全流程
  • 数码管LED显示屏矩阵驱动技术详解
  • Django REST Framework (DRF)
  • 神经网络优化 - 高维变量的非凸优化
  • 济南一医院救护车未执行紧急任务时违规鸣笛
  • 美俄亥俄州北部发生火车撞人事故,致2人死亡、至少1人失踪
  • 北京韩美林艺术馆党支部书记郭莹病逝,终年40岁
  • 101岁陕西省军区原司令员冀廷璧逝世,曾参加百团大战
  • 证监会:2024年依法从严查办证券期货违法案件739件,作出处罚决定592件、同比增10%
  • 新闻1+1丨城市,如何对青年更友好?