Maven从浅入深(理解篇)

news/2024/11/15 0:42:50 标签: maven, java

前言 

在软件开发领域,包管理器是不可或缺的工具,它们帮助开发者管理和维护项目中的依赖库。通过对比.NET的NuGet包、Python的pip包以及Java的Maven,我们可以从原理上更深刻地理解这些工具的作用和差异。

1. NuGet(.NET)


原理与功能

  • 定义:NuGet是微软为.NET平台(包括.NET Framework和.NET Core)提供的程序集共享包管理工具。它允许开发者创建、共享和使用.NET包。
  • 工作方式:NuGet包通常以.nupkg文件形式存在,这是一个ZIP包,包含编译后的代码(.dll文件)、其他相关文件以及包的描述信息(如版本号)。开发者可以通过NuGet客户端(如Visual Studio中的NuGet包管理器)或命令行工具来安装包、更新包或卸载包。
  • 依赖管理:NuGet自动处理包与包之间的依赖关系,确保项目依赖的所有包都被正确安装和版本控制。

2. pip(Python)


原理与功能

  • 定义:pip是Python的包安装器,用于安装和管理Python包。它允许用户从Python包索引(PyPI)安装和管理包。
  • 工作方式:pip通过命令行界面与PyPI交互,下载并安装用户指定的包及其依赖项。pip还支持包的版本管理,允许用户指定安装特定版本的包。
  • 依赖管理:pip会自动解决并安装包的依赖项,确保项目的依赖环境是完整和一致的。

3. Maven(Java)


原理与功能

  • 定义:Maven是一个项目管理工具,它主要用于Java项目的构建、依赖管理和项目信息管理。Maven通过其项目对象模型(POM)和约定的目录结构来管理项目。
  • 工作方式:Maven使用pom.xml文件作为项目的配置文件,其中定义了项目的依赖关系、构建过程、插件等。Maven根据pom.xml中的配置自动下载和管理项目所需的依赖库,并执行构建过程(如编译、测试、打包等)。
  • 依赖管理:Maven通过中央仓库(如Maven Central)和本地仓库来管理项目的依赖库。它会自动解析项目依赖,并下载和安装所有必要的依赖库及其传递性依赖。

4. 对比


NuGetpipMaven
平台.NETPythonJava
配置文件无特定文件(通过NuGet包管理器或命令行操作)无特定文件(通过pip命令操作)pom.xml
包格式.nupkg(ZIP包)多种格式,但通常以.whl.tar.gz为主JAR包、WAR包等
仓库NuGet官方仓库、私有仓库PyPI、私有仓库Maven Central、私有仓库
功能包管理、依赖管理包安装、依赖管理项目构建、依赖管理、项目信息管理
自动化程度高(自动处理依赖)高(自动处理依赖)非常高(不仅管理依赖,还管理项目构建)

Part1:Maven概念 

蓝色区域代表maven的核心。蓝色虚线下面的是maven本身的东西,而上面的就是项目中需要处理的模块。

Maven是基于java开发的

1.1. 概念


Maven的本质是一个项目管理工具将项目开发和管理过程抽象成一个项目对象模型(POM)

POM(Project OBject Model):对项目对象模型

Maven使用pom.xml配置文件获取项目信息

【Maven如何实现帮我们管理资源?】

依赖管理的包都是基于中央仓库拿到的。

使用本地,私服,中央仓库。

使用场景:

基础模块依赖;

Jar包版本冲突(mybatis如果进行版本升级,他依赖的的版本也需要升级,那么需要同步进行)

1.2. maven的作用


项目构建:提供标准的、跨平台的自动化项目构建方式。

依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题。

开发结构的统一:提供标准的、统一的项目结构

Park2:Maven下载安装

2.1. 下载


官网:Maven – Welcome to Apache Maven

直接下载,绿色版软件解压即可。

2.2. 目录结构


  • 核心运行文件
    类加载器
    配置
    文件依赖包

2.3. 配置环境变量


(1) java环境变量(一般都有,不知道的自行搜索吧)

没有的会报错哟:

The JAVA_HOME environment variable is not defined correctly,
// JAVA_HOME环境变量未正确定义,
this environment variable is needed to run this program.
// 运行此程序需要此环境变量。

(2)配置maven

【第 1 步】增加MAVEN_HOME路径

【第  2 步】追加PATH

【第 3 步】验证 

如何确认maven安装成功呢,直接输入在cmd窗口输入maven命令即可。 

C:\Users\username>mvn
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.078 s
[INFO] Finished at: 2024-09-15T07:13:43+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: pre-clean, clean, post-clean, validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-site, site, post-site, site-deploy. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoGoalSpecifiedException

     

Park3:Maven基础配置

3.1 仓库 


 3.1.1. 概念

仓库:用于存储资源,包含各种jar包.

 3.1.2. 分类

中央仓库

在云服务器上,maven团队自己管理.这里存放这所有用到的公共jar包.

本地仓库(子集)

从中央仓库下载的jar会存储到开发者自己本机

私服

全世界的开发者都从中央仓库拉取jar,首先maven官网可能是承受不了的,他必要进行限流吧。

对于开发者来说,也会消耗带宽去下载,也会浪费资源。

公司为了让开发者快速下载依赖,提高效率,那么私服就出现了。

那么开发者在拉jar包是,不再去中央仓库,而是先去私服去找,如果没有再去中央仓库去寻找.

扩展理解:

就好比DNS镜像服务服务器一样,所有的域名都走13个根节点服务器,那还不得把根服务器类累死,所以就有了这种镜像的东西。

私服的其他作用:

一定范围内共享资源,仅对内部开放,不对外共享.

3.2 Maven-坐标


maven中央仓库存储这大量的资源,资源在查找的时候如何查询?

Maven就是通过坐标去管理的。

 3.2.1. 坐标概念


Maven中的坐标用于描述仓库中资源的位置。

https://repo1.maven.org/maven2/

3.2.2. 坐标组成


组织名、项目名、版本号、打包方式

  <groupId>com.alibaba.fastjson2</groupId>
   <artifactId>fastjson2</artifactId>
   <version>2.0.52</version>
  • 组织:groupid 定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
  • 项目名:artifactid  定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
  • 版本号:version  定义当前相关目的版本号
  • 打包方式:packaging:定义该项目的打包方式。

如何查看你要导入项目的坐标呢?

通过下面的地址进行搜索、进入后选择版本号就可以看到下面第二幅图了里面的xml坐标了。 

https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2/2.0.52

 

3.2.3. Maven坐标作用


使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

3.3 仓库配置


3.3.1. 配置仓库 

  <!--修改计算机缓存仓库地址-->
<localRepository>F:\99-wxd\99-mavenData\repository</localRepository>  
  <!--修改镜像地址-->
  <mirrors>	
     <mirror>
     <!-- id 镜像唯一标识符,用来区分不同的镜像对象-->
      <id>aliyunmaven</id>
     <!-- 对哪种仓库进行镜像,简单的说就是替代哪个仓库-->
	  <mirrorOf>central</mirrorOf>
     <!-- 镜像名称,可以自定义-->
	  <name>阿里云公共仓库</name>
     <!-- 镜像Url-->
	  <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
	</mirror>
  </mirrors>

添加好了之后,注意把你的idea也要修改下,maven使用你安装的maven,配置使用上面配置好的配置,然后刷新下maven依赖。

如果看到配置地址里 “F:\99-wxd\99-mavenData\repository”里面缓存了文件那么就是ok了。

3.3.2. 全局setting、用户setting


这俩配置要保持一致。 

  • 全局settting:(maven包里面的setting)定义了当前计算器中Maven的公共配置
  • 用户settting:(仓库文件的setting)定义了当前用户的配置

Park4: Maven项目里使用 

4.1 相关目里配置


4.2 Maven构建命令 


mvn compile            # 编译

mvn clean              # 清理

mvn test               # 测试

mvn package            # 打包

mvn install            # 安装到本地仓库


在草稿箱好久了,先发出来,后面再追加完善…… 


http://www.niftyadmin.cn/n/5752507.html

相关文章

关于离散模型优化的一份介绍

离散模型优化是运筹学和计算机科学领域中的一个重要分支&#xff0c;它主要研究如何在有限的、通常是计数的决策变量空间中寻找最优解。这类问题通常出现在资源分配、生产计划、物流管理、网络设计等实际应用场景中。在这篇文章中就将介绍离散模型优化中关于线性规划等部分内容…

LeetCode 力扣 热题 100道(三)无重复字符的最长子串(C++)

无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 &#xff08;子字符串 是字符串中连续的 非空 字符序列&#xff09; class Solution { public:int lengthOfLongestSubstring(string s) {unordered_set<char> char…

小皮PHP连接数据库提示could not find driver

最近遇到一个奇怪的问题&#xff0c;我的小皮上安装的8.0.2版本的php连接数据库正常。下载使用8.2.9时&#xff0c;没有php.ini,把php-development.ini改成 php.ini后&#xff0c;就提示could not find driver。 网上查了说把php.ini里的这几个配置打开&#xff0c;我也打开了&…

Java入门16——接口

我们今天来学习接口&#xff0c;和继承有点像&#xff0c;话不多说&#xff0c;开始正题~ 一、接口 1.为什么要用接口 接口其实和继承很像&#xff0c;但是继承是 is-a 的关系&#xff0c;接口是 has-a 的关系&#xff0c;而且继承只能是一对一的关系&#xff0c;但是接口可以…

高分辨率定时器 HRTIIM

1初学者重要提示 高分辨率定时器可以产生多达 10 路高分辨率信号。它主要用数字电源、照明,电源耗材,太阳能逆 变器和无线充电等应用场合,当然,也可以作为通用目的。 ◆ HRTIM 模块化的架构允许产生独立或者叠加波形。通过带的时序控制单元和各种外部事件的配合, 可以产…

【话题讨论】AI赋能电商:创新应用与销售效率的双轮驱动

目录 引言 一、AI技术在电商中的创新应用 1.1 购物推荐 1.2 会员分类 1.3 商品定价 1.4 用户体验 总结 二、AI技术提高电商平台销售效率 2.1 订单处理 2.2 物流配送 2.3 产品流转效率 2.4 库存管理和订单管理效率 2.5 实际案例分析 三、挑战和未来发展趋势 3.1…

Linux服务器下oracle自动rman备份的实现

一、概述 为确保oracle数据库数据的安全和一致性&#xff0c;一般我们都需要利用备份手段进行数据库的备份。在oracle数据库中&#xff0c;rman因其强大的功能和完善的手段&#xff0c;成为数据库备份的首选。Linux服务器中&#xff0c;要实现自动脚本备份&#xff0c;一般都是…

vue3中使用swiper的方法及版本兼容问题

Swiper官方文档 https://swiper.com.cn/ 前言 如果使用vue3开发尽量避免swiper6及以下版本(踩的坑很多)&#xff0c;我使用的swiper7.4.1 开发中vue总是会遇到版本兼容性问题&#xff0c;每次都要调半天&#xff0c;很头疼....废话不多说&#xff0c;直接上方法及代码。 1.首先…