1. 前言

maven是作为Javer日常开发中必不可少的工具,但是很多人对于它的使用也只是仅限于的几个功能。

前几天在使用一个依赖总是说找不到该依赖,但是在中央仓库中的确存在该构建。这个问题让我很困惑,突然发现对于maven这个优秀构建工具的使用也只是浮于表面。痛定思痛,于是就有了这篇简短的总结。

对于maven依赖顺序的搜索,网上众说纷纭,那么真相到底是怎么样的呢?

2. 准备

根据我们的开发经验,使用maven可以配置多个仓库,先来看看我们最熟悉的一个。

打开我们的settings.xml文件,一开始是一个最纯洁的配置文件:

可以看到,只是配置了一个镜像地址和一个本地仓库的路径,这也是我们第一次使用maven时大多数教程中会提到的一点-修改mirror为国内的一个地址。

现在我们创建一个maven的工程,然后看看它的依赖查找顺序是怎样的?

我创建了一个mvn-dep文件夹,在这里面创建项目所需要的文件,为了简单,我就使用maven cli来搭建一个简单的项目,使用的命令如下:

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp  -DinteractiveMode=true -DgroupId=com.watertreestar -DartifactId=mvn-dep -Dversion=1.0 -Dpackage=com.watertreestar

创建好以后我们的项目结构如下:

接下来看一下不同的配置下依赖查找的路径

3. 依赖查找探索

使用上一步创建的项目,并在上面的基础settings.xml配置文件上做修改,观察依赖查找的优先级。

在操作之前,我们在项目的pom.xml中已经包含了一个依赖就是fastjson

 <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>

我们先确保本地仓库中该版本的junit不存在,使用rm命令来删除它:

rm -rf ~/.m2/repository/com/alibaba/fastjson

3.1 不修改的情况

我们使用上面的setings.xml文件,不做任何修改,执行mvn compile命令,输出如下:

可以看出,maven是从我们配置的central镜像-阿里云镜像中拉取依赖

3.2 没有配置中央仓库镜像

现在我们把settings文件中的mirror配置删除,就成了一个光秃秃的配置:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <pluginGroups></pluginGroups> <proxies></proxies> <localRepository>/Users/young/.m2/repository</localRepository> </settings>

这种情况下,依赖会从哪儿获取呢

可以看到,是从默认的中央仓库中查找和下载依赖。

根据上面的结果可以看到优先级:

特定仓库reporitory的镜像mirror > settings中配置的仓库repository

3.3 项目配置仓库repository

  1. 现在我们把仓库的配置还原到最初的状态,如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <pluginGroups></pluginGroups> <proxies></proxies> <localRepository>/Users/young/.m2/repository</localRepository> <mirrors>
<mirror>
<id>settings-mirror</id>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
  1. 然后在第二节中创建的项目pom.xml文件中添加一个repository配置,我们使用了一个sonatype的maven仓库

    当前的项目pom.xml配置如下:

<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
</dependencies> <repositories>
<repository>
<id>pom_repository</id>
<name>sonatype</name>
<url>https://repository.sonatype.org/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

执行mvn compile命令,输出如下:

可以看出依赖从项目pom.xml配置的pom-repository仓库中查找并下载。

3.4 配置全局profile中的repository

在maven配置文件settings.xml中增加profile配置

使用maven compile -Psettings-profile

可以看出,依赖从settings.xml中我们配置settings-profile的repository中下载的

settings_profile_repository > pom_repositories

3.5 配置项目profile的repository

3.5.1 激活pom中的profile和setting中的profile

全局settings.xml中的配置不见,在pom.xml中增加profile配置:

<profiles>
<profile>
<id>pom-profile</id>
<repositories>
<repository>
<id>pom-profile-repository</id>
<name>maven2</name>
<url>https://repo.maven.apache.org/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>

删除本地仓库的fastjson依赖,然后执行mvn compile -Psettings-profile,pom-profile

输出:

我们同时激活了settings-profile和pom-profile,但是最终依赖的下载是从settings-profile中配置的仓库下载的。

settings-profile > pom-profile

3.5.2 只是激活pom中的profile

假如只是激活pom中的profile,也就是使用mvn compile -Ppom-profile,输出结果如下:

可以看出,最终依赖的下载是从pom中配置的profile-repository中下载的

pom-profile-repository > pom-repository

3.6 local repository

由于之前的步骤中我们已经下载jar到了local仓库,为了测试最后一步,我们就不用在执行rm -rf ~/.m2/repository/com/alibaba/fastjson来删除本地的依赖了。

我这里使用了 mvn compile -Ppom-profile来做测试,输出的结果如下:

可以看到,没有从任何远程仓库中下载依赖

local > 所有远程仓库

4. 总结

从上面一系列的验证中可以总结出依赖查找的优先级:

local-repo > settings-profile-repository > pom-profile-repository > pom-repository > central

理解maven查找的优先级,可以帮助我们在工作和学习中解决一些依赖找不到的错误。

最后,推荐几个可以使用的maven仓库:

Maven依赖,去哪儿找的更多相关文章

  1. maven问题解决:提示maven依赖包缺失,但是去文件夹下找确实有这个包

    出现问题:提示maven依赖包缺失,但是去文件夹下找确实有这个包. (我的操作就是:删除文件夹中的jar.重新update,) 搞了好多遍,工具总是提示错误信息,没办法,请求大神 操作大概过程: 1  ...

  2. IDEA Maven项目 pom.xml 找不到 Dependency 依赖

    转载: IDEA Maven项目 pom.xml 找不到 Dependency 依赖 如果你的pom.xml中使用了dependencyManagement管理依赖并且添加了你本地仓库中不存在的依赖可 ...

  3. 解决maven项目找不到maven依赖的解决办法

    不同的IDE对应的.classpath中的maven声明也不一样,这样就会导致项目找不到maven依赖. 即Java Build Path--->Libraries中找不到Maven Depen ...

  4. maven依赖管理

    maven依赖管理 1.依赖范围   (依赖相当于java中的import  是否需要导入别的jar包) 使用控制依赖与三种classpath(编译期,测试时期,运行时期)的关系 complie    ...

  5. Maven依赖的JAR包下载慢?赶紧看过来

    相信许多JAVA开发者在日常工作中时常会碰到这种情况,那就是编译Maven工程时,工程所依赖的jar包文件下载非常慢,甚至经常出现下载不成功的问题,今天,小编就给大家讲讲如何提升Maven依赖包的下载 ...

  6. Java-Maven-Runoob:Maven 依赖管理

    ylbtech-Java-Maven-Runoob:Maven 依赖管理 1.返回顶部 1. Maven 依赖管理 Maven 一个核心的特性就是依赖管理.当我们处理多模块的项目(包含成百上千个模块或 ...

  7. 急~为啥我指定的的maven依赖版本没有生效?不是最短路径原则吗?

    女朋友他们项目用了 spring-boot,以 spring-boot-parent 作为 parent: <parent> <groupId>org.springframew ...

  8. 【第十五篇】- Maven 依赖管理之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven 依赖管理 Maven 一个核心的特性就是依赖管理.当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难.针对此种情形,Maven 提供了 ...

  9. Maven依赖版本冲突的分析及解决小结

    1:前言 做软件开发这几年遇到了许多的问题,也总结了一些问题的解决之道,之后慢慢的再遇到的都是一些重复性的问题了,当然,还有一些自己没有完全弄明白的问题.如果做的事情是重复的,遇到重复性问题的概率也就 ...

随机推荐

  1. Tool_Fiddler安装和使用

    一.简介 Fiddler(中文名称:小提琴)是一个HTTP的调试代理,以代理服务器的方式,监听系统的Http网络数据流动, Fiddler可以也可以让你检查所有的HTTP通讯,设置断点,以及Fiddl ...

  2. 在quasar 注册全局filter

    A common use case for Quasar applications is to run code before the root Vue app instance is instant ...

  3. 读取 properties 配置文件含有中文的value内容 导致中文乱码 的解决办法

    1.前言 因为装系统的时候把中文写在了系统路径,现在我想把这个路径写在properties里面来读取,可是 发现java 读取会导致中文乱码成 问号????的乱码  ,百度找了好多博客,基本都是一摸一 ...

  4. Python常用功能函数系列总结(二)

     本节目录 常用函数一:sel文件转换 常用函数二:refwork文件转换 常用函数三:xml文档解析 常用函数四:文本分词 常用函数一:sel文件转换 sel是种特殊的文件格式,具体应用场景的话可以 ...

  5. k8s 理解Service工作原理

    什么是service? Service是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法. 简单来说K8s提供了service对象来访问pod.我们在<k8s网络模型与集群通信> ...

  6. 深度分析 [go的HttpClient读取Body超时]

    故障现场 本人负责的主备集群,发出的 HttpClient 请求有 30%概率超时, 报context deadline exceeded (Client.Timeout or context can ...

  7. Solon Web 开发,十一、国际化

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  8. [开发笔记usbTOcan]用树莓派搭建私有Git服务器

    0 | 思路 在开始编程前,先创建一个版本管理库,以前一直用SVN,但目前用Git的还是比较,正好利用这个机会学习GIt. 想过使用Github提供的免费服务器,但项目目前还没有做开源的准备,于是就有 ...

  9. 【刷题-LeetCode】215. Kth Largest Element in an Array

    Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...

  10. Anchor CMS 0.12.7 跨站请求伪造漏洞(CVE-2020-23342)

    这个漏洞复现相对来说很简单,而且这个Anchor CMS也十分适合新手训练代码审计能力.里面是一个php框架的轻量级设计,通过路由实现的传递参数. 0x00 漏洞介绍 Anchor(CMS)是一款优秀 ...