如果我们的项目依赖第三方的jar包,例如commons logging,那么问题来了:commons logging发布的jar包在哪下载?

如果我们还希望依赖log4j,那么使用log4j需要哪些jar包?

类似的依赖还包括:JUnit,JavaMail,MySQL驱动等等,一个可行的方法是通过搜索引擎搜索到项目的官网,然后手动下载zip包,解压,放入classpath。但是,这个过程非常繁琐。

Maven解决了依赖管理问题。例如,我们的项目依赖abc这个jar包,而abc又依赖xyz这个jar包:

┌──────────────┐

│Sample Project│

└──────────────┘

┌──────────────┐

│ abc │

└──────────────┘

┌──────────────┐

│ xyz │

└──────────────┘

当我们声明了abc的依赖时,Maven自动把abc和xyz都加入了我们的项目依赖,不需要我们自己去研究abc是否需要依赖xyz。

因此,Maven的第一个作用就是解决依赖管理。我们声明了自己的项目需要abc,Maven会自动导入abc的jar包,再判断出abc需要xyz,又会自动导入xyz的jar包,这样,最终我们的项目会依赖abc和xyz两个jar包。

我们来看一个复杂依赖示例:

org.springframework.boot

spring-boot-starter-web

1.4.2.RELEASE

当我们声明一个spring-boot-starter-web依赖时,Maven会自动解析并判断最终需要大概二三十个其他依赖:

spring-boot-starter-web

spring-boot-starter

spring-boot

sprint-boot-autoconfigure

spring-boot-starter-logging

logback-classic

logback-core

slf4j-api

jcl-over-slf4j

slf4j-api

jul-to-slf4j

slf4j-api

log4j-over-slf4j

slf4j-api

spring-core

snakeyaml

spring-boot-starter-tomcat

tomcat-embed-core

tomcat-embed-el

tomcat-embed-websocket

tomcat-embed-core

jackson-databind

...

如果我们自己去手动管理这些依赖是非常费时费力的,而且出错的概率很大。

依赖关系

Maven定义了几种依赖关系,分别是compile、test、runtime和provided:

scope说明示例

compile编译时需要用到该jar包(默认)commons-logging

test编译Test时需要用到该jar包junit

runtime编译时不需要,但运行时需要用到mysql

provided编译时需要用到,但运行时由JDK或某个服务器提供servlet-api

其中,默认的compile是最常用的,Maven会把这种类型的依赖直接放入classpath。

test依赖表示仅在测试时使用,正常运行时并不需要。最常用的test依赖就是JUnit:

org.junit.jupiter

junit-jupiter-api

5.3.2

test

runtime依赖表示编译时不需要,但运行时需要。最典型的runtime依赖是JDBC驱动,例如MySQL驱动:

mysql

mysql-connector-java

5.1.48

runtime

provided依赖表示编译时需要,但运行时不需要。最典型的provided依赖是Servlet API,编译的时候需要,但是运行时,Servlet服务器内置了相关的jar,所以运行期不需要:

javax.servlet

javax.servlet-api

4.0.0

provided

最后一个问题是,Maven如何知道从何处下载所需的依赖?也就是相关的jar包?答案是Maven维护了一个中央仓库(repo1.maven.org),所有第三方库将自身的jar以及相关信息上传至中央仓库,Maven就可以从中央仓库把所需依赖下载到本地。

Maven并不会每次都从中央仓库下载jar包。一个jar包一旦被下载过,就会被Maven自动缓存在本地目录(用户主目录的.m2目录),所以,除了第一次编译时因为下载需要时间会比较慢,后续过程因为有本地缓存,并不会重复下载相同的jar包。

唯一ID

对于某个依赖,Maven只需要3个变量即可唯一确定某个jar包:

groupId:属于组织的名称,类似Java的包名;

artifactId:该jar包自身的名称,类似Java的类名;

version:该jar包的版本。

通过上述3个变量,即可唯一确定某个jar包。Maven通过对jar包进行PGP签名确保任何一个jar包一经发布就无法修改。修改已发布jar包的唯一方法是发布一个新版本。

因此,某个jar包一旦被Maven下载过,即可永久地安全缓存在本地。

注:只有以-SNAPSHOT结尾的版本号会被Maven视为开发版本,开发版本每次都会重复下载,这种SNAPSHOT版本只能用于内部私有的Maven repo,公开发布的版本不允许出现SNAPSHOT。

Maven镜像

除了可以从Maven的中央仓库下载外,还可以从Maven的镜像仓库下载。如果访问Maven的中央仓库非常慢,我们可以选择一个速度较快的Maven的镜像仓库。Maven镜像仓库定期从中央仓库同步:

slow ┌───────────────────┐

┌─────────────>│Maven Central Repo.│

│ └───────────────────┘

│ │

│ │sync

│ ▼

┌───────┐ fast ┌───────────────────┐

│ User │─────────>│Maven Mirror Repo. │

└───────┘ └───────────────────┘

中国区用户可以使用阿里云提供的Maven镜像仓库。使用Maven镜像仓库需要一个配置,在用户主目录下进入.m2目录,创建一个settings.xml配置文件,内容如下:

aliyun

aliyun

central

http://maven.aliyun.com/nexus/content/groups/public/

配置镜像仓库后,Maven的下载速度就会非常快。

搜索第三方组件

最后一个问题:如果我们要引用一个第三方组件,比如okhttp,如何确切地获得它的groupId、artifactId和version?方法是通过search.maven.org搜索关键字,找到对应的组件后,直接复制:

命令行编译

在命令中,进入到pom.xml所在目录,输入以下命令:

$ mvn clean package

如果一切顺利,即可在target目录下获得编译后自动打包的jar。

在IDE中使用Maven

几乎所有的IDE都内置了对Maven的支持。在Eclipse中,可以直接创建或导入Maven项目。如果导入后的Maven项目有错误,可以尝试选择项目后点击右键,选择Maven - Update Project...更新:

练习

小结

Maven通过解析依赖关系确定项目所需的jar包,常用的4种scope有:compile(默认),test,runtime和provided;

Maven从中央仓库下载所需的jar包并缓存在本地;

可以通过镜像仓库加速下载。

python 依赖包管理_依赖管理相关推荐

  1. maven引入依赖包,import依赖包,编译运行maven项目

    文章目录 IDEA中新建一个maven项目 在pom.xml中添加依赖包,确定依赖包成功导入,在项目中import依赖包 怎么确定maven成功的导入了依赖包 在项目中import导入的依赖包 总结 ...

  2. gradle依赖管理_依赖管理

    gradle依赖管理 Why Bother 何必呢 Writing software is a very expensive process, and most systems we interact ...

  3. Python导出当前环境依赖包及项目依赖包

    Python导出当前环境依赖包信息: 命令行输入: pip freeze > ./requirements.txt 则会在当前命令行目录下生成一个requirements.txt文件,内容为当前 ...

  4. python获取依赖包和安装依赖包

    获取依赖包: 第一种方法:获取环境中所有安装的包 打开命令提示符,在某条路径下输入pip freeze > ./requirements.txt 这时就会生成一个requirements.txt ...

  5. python到包快捷键_如何最简单、通俗地理解Python的包?

    目录: 一.笔记 二.我的自学路线 三.笔记目录 一.笔记 1) 包 ① 包是一种管理Python模块命名空间的形式,采用 "点模块名称" 形式.比如一个模块的名称是A.B,那么他 ...

  6. 漏洞管理_漏洞管理,广阔视野

    漏洞管理 什么是漏洞管理? (What is Vulnerability Management?) We'll start at the beginning. According to ISO 270 ...

  7. python调包师_为“Python调包侠” 画像

    很多从事IT行业的朋友:包括运维.测试.数据分析.网络安全,在北上广每月工资1.5万/月以上,有的甚至到达2万/月,碰到职业瓶颈了,工资碰到天花板.有的朋友认为自己会Python编程,其实还是处在&q ...

  8. maven依赖管理_依赖管理和Maven

    maven依赖管理 Maven伟大而成熟. 几乎所有事物都总有解决方案. 您可能在组织项目上遇到的主要情况是依赖管理. 而不是每个项目都具有自己的依赖关系,您需要一种集中的方式来继承那些依赖关系. 在 ...

  9. maven排除依赖包的子依赖_漫画谈一下Maven依赖

    Maven 依赖排除(Exclusions) 因为 Maven 构建的项目具有依赖可传递的特性,当你在 pom.xml添加某个依赖时,可能也会引入不需要的依赖到你的项目中,这将会会可能引起如下问题: ...

最新文章

  1. mysql 函数rep_Mysql之各种各样的函数啦
  2. MIT黑科技:“不开卷也有益”,计算机不翻书就能读完一本书
  3. diff git 指定时间,git diff日期?
  4. 由「Metaspace容量不足触发CMS GC」从而引发的思考
  5. Java8特性解决空指针问题
  6. [webpack] 如何把代码内联进html中?
  7. ESP32+st7789/ili9341运行LVGL例程,依赖ESP-IDF编译lv_port_esp32官方Demo(1)
  8. 珍稀干货!阿里 Web 音视频开发趟坑指南
  9. 25muduo_net库源码分析(一)
  10. ES6入门之对象的扩展
  11. Qt总结之十四:uint8_t / uint16_t / uint32_t /uint64_t数据类型详解
  12. ASP.NET MVC 教程学习
  13. python属性管理(1):基础
  14. MySQL 8个character_set变量的基本作用
  15. Java常见排序算法之快速排序详解
  16. 华为新系统鸿蒙,爆料|疑似华为新MatePad Pro包装盒曝光:搭载鸿蒙OS
  17. 【学习笔记】matlab进行数字信号处理(三)数字滤波技术
  18. red5流媒体服务器系统,red5 流媒体服务器配置
  19. Vue2基础-el与data的两种写法(HTML版)
  20. css 各种高度和宽度

热门文章

  1. 【Java】Java StreamCorruptedException: invalid stream header: EFBFBDEF
  2. 【Antlr】 Antlr 错误与恢复
  3. 02-eclipse中构建ant项目和编译运行ant
  4. js中数组的操作方法
  5. 华东交通大学ACM-ICPC训练基地简介
  6. 求计算两个时间的差(DateTime类和TimeSpan类)
  7. luogu_1984 [SDOI2008]烧水问题
  8. UVALive 3942 Trie加速dp
  9. 动态规划uva1347
  10. 【神经网络与深度学习】CIFAR-10数据集介绍