Maven依赖,去哪儿找
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
- 现在我们把仓库的配置还原到最初的状态,如下:
<?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>
然后在第二节中创建的项目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仓库:
- https://repo.maven.apache.org/maven2/
- https://repo1.maven.org/maven2/
- https://maven.aliyun.com/repository/public
Maven依赖,去哪儿找的更多相关文章
- maven问题解决:提示maven依赖包缺失,但是去文件夹下找确实有这个包
出现问题:提示maven依赖包缺失,但是去文件夹下找确实有这个包. (我的操作就是:删除文件夹中的jar.重新update,) 搞了好多遍,工具总是提示错误信息,没办法,请求大神 操作大概过程: 1 ...
- IDEA Maven项目 pom.xml 找不到 Dependency 依赖
转载: IDEA Maven项目 pom.xml 找不到 Dependency 依赖 如果你的pom.xml中使用了dependencyManagement管理依赖并且添加了你本地仓库中不存在的依赖可 ...
- 解决maven项目找不到maven依赖的解决办法
不同的IDE对应的.classpath中的maven声明也不一样,这样就会导致项目找不到maven依赖. 即Java Build Path--->Libraries中找不到Maven Depen ...
- maven依赖管理
maven依赖管理 1.依赖范围 (依赖相当于java中的import 是否需要导入别的jar包) 使用控制依赖与三种classpath(编译期,测试时期,运行时期)的关系 complie ...
- Maven依赖的JAR包下载慢?赶紧看过来
相信许多JAVA开发者在日常工作中时常会碰到这种情况,那就是编译Maven工程时,工程所依赖的jar包文件下载非常慢,甚至经常出现下载不成功的问题,今天,小编就给大家讲讲如何提升Maven依赖包的下载 ...
- Java-Maven-Runoob:Maven 依赖管理
ylbtech-Java-Maven-Runoob:Maven 依赖管理 1.返回顶部 1. Maven 依赖管理 Maven 一个核心的特性就是依赖管理.当我们处理多模块的项目(包含成百上千个模块或 ...
- 急~为啥我指定的的maven依赖版本没有生效?不是最短路径原则吗?
女朋友他们项目用了 spring-boot,以 spring-boot-parent 作为 parent: <parent> <groupId>org.springframew ...
- 【第十五篇】- Maven 依赖管理之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven 依赖管理 Maven 一个核心的特性就是依赖管理.当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难.针对此种情形,Maven 提供了 ...
- Maven依赖版本冲突的分析及解决小结
1:前言 做软件开发这几年遇到了许多的问题,也总结了一些问题的解决之道,之后慢慢的再遇到的都是一些重复性的问题了,当然,还有一些自己没有完全弄明白的问题.如果做的事情是重复的,遇到重复性问题的概率也就 ...
随机推荐
- BrowserSync 本地服务器的起用
最简单粗暴的方法:进入项目根目录,执行命令browser-sync start --server --files "**" 监听所有
- Kubernetes三大落地姿势,你pick谁?
Kubernetes是面向企业的开源容器编排工具的事实标准,它提供了应用部署.扩展.容器管理等功能.经过几年的发展,Kubernetes已成为云计算和现代IT基础架构的通用平台,得到广泛应用进入产业落 ...
- Java库中的LocalDate类
Java库中的LocalDate类 类库设计者决定将保存时间与给时间点命名分开.所以标准Java类库分别包含了两个类:一个用来表示时间点的Date类:另一个是用来表示大家熟悉的日历表示法的LocalD ...
- Android官方文档翻译 三 1.1Creating an Android Project
Creating an Android Project 创建一个Android项目 An Android project contains all the files that comprise th ...
- 【刷题-LeetCode】151 Reverse Words in a String
Reverse Words in a String Given an input string, reverse the string word by word. Example 1: Input: ...
- Book of the Dead 死者之书Demo工程回顾与学习
1.前言 一转眼离Book of the Dead Environment Demo开放下载已过去多年,当时因为技术力有限,以及对HDRP理解尚浅, 所以这篇文章一直搁浅到了现在.如今工作重心已转向U ...
- 配置vscode的C++环境Unexpected GDB output from command "-environment-cd
原因 中文字符 换成D盘目录下以后.
- C# Reflection反射机制
一.反射 什么是反射 .Net的应用程序由几个部分:'程序集(Assembly)'.'模块(Module)'.'类型(class)'组成: 反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组 ...
- Java安全之C3P0利用与分析
Java安全之C3P0利用与分析 目录 Java安全之C3P0利用与分析 写在前面 C3P0 Gadget http base C3P0.getObject() 序列化 反序列化 Class.forN ...
- 拒绝编译等待 - 动态研发模式 ARK
作者:字节跳动终端技术--徐纪光 背景 iOS 业界研发模式多为 CocoaPods + Xcode + Git 的多仓组件化开发模型.为追求极致的研发体验.提升研发效率,对该研发模式进行了大量优化, ...