1.前言Maven是Javer日常开发中不可或缺的工具,但很多人只是为了几个功能使用它。前几天在用依赖,一直说找不到依赖,但是构建确实存在于中央仓库。这个问题把我搞糊涂了,突然发现maven这个优秀的构建工具的使用只是表面的。痛定思痛后,我有了这个简短的总结。关于maven依赖顺序的搜索,网上众说纷纭,究竟真相如何呢?2.准备根据我们的开发经验,使用maven可以配置多个仓库。让我们来看看我们最熟悉的那个。打开我们的settings.xml文件,这是一开始最纯粹的配置文件:可以看到,只配置了一个镜像地址和一个本地仓库路径,这也是我们第一次使用maven时大部分教程都会提到的在这一点上-将镜像修改为国内地址。现在我们创建一个maven项目,然后看看它的依赖查找顺序是怎样的?我创建了一个mvn-dep文件夹,并在其中创建了项目所需的文件。为简单起见,我使用mavencli构建了一个简单的项目。使用的命令如下:mvnarchetype:generate-DarchetypeGroupId=org.apache.maven.archetypes-DarchetypeArtifactId=maven-archetype-webapp-DinteractiveMode=true-DgroupId=com.watertreestar-DartifactId=mvn-dep-Dversion=1.0-dpackage=com.watertreestar创建后,我们的项目结构如下:20210826222721918.png">接下来我们看看不同配置下的依赖查找路径3.DependencyLookupExplore使用上一步创建的工程,修改上面的基础settings.xml配置文件,观察依赖查找的优先级。在运行之前,我们在项目的pom.xml中添加了一个依赖是fastjsoncom.alibabafastjson1.2.78我们先确保本地仓库不存在这个版本的junit,使用rm命令删除:rm-rf~/.m2/repository/com/alibaba/fastjson3.1如果我们不修改它,我们使用上面设置的.xml文件,不做任何改动,执行mvn编译命令,输出结果如下:可以看到maven从我们配置的中心镜像-阿里云镜像3.2中心仓库中拉取依赖image没有配置现在我们把settings文件如果删除镜像配置就变成裸配置了:/Users/young/.m2/repository这样的话,从哪里获取依赖呢?可以看到从默认的中央仓库找到并下载了依赖。根据上面的结果,我们可以看到优先级:具体仓库repository的mirrormirror>settingsrepository3.3项目配置仓库repository中配置的仓库现在我们将仓库的配置恢复到原来的状态,如下:/Users/young/.m2/repositorysettings-mirrorhttps://maven.aliyun.com/repository/publiccentral然后在第二节创建的项目pom.xml文件中添加一个repository配置,我们使用当前项目一个sonatypemaven仓库的pom.xml配置如下:com.alibabafastjson1.2.78pom_repository<名称>sonatypehttps://repository.sonatype.org/content/groups/public/truetrue执行mvncompile命令,输出结果如下:可以看到是从项目pom.xml配置的pom-repository仓库中搜索下载依赖的3.4在全局profile中配置repository在maven配置文件settings.xml中添加profile配置使用mavencompile-Psettings-profile可以看到依赖于我们在settings.xml中配置settings-profile的repository下载的settings_profile_repository>pom_repositories3.5配置项目配置文件的repository3.5.1。激活pom中的profile和setting中的profile。缺少全局settings.xml中的配置。在pom.xml中添加profile配置:pom-profilepom-profile-repositorymaven2https://repo.maven.apache.org/maven2/true<快照>true删除本地仓库的fastjson依赖,然后执行mvncompile-Psettings-profile,pom-profile输出:weactivatedsettings-profile和pom-同时配置文件,但是最后的依赖下载是settings-profile中配置的仓库下载的settings-profile>pom-profile3.5.2只激活pom中的profile如果只激活pom中的profile,即使用mvncompile-Ppom-profile输出结果如下:可以看出最终依赖下载的是pom-profile-repository,是在pom-profile-repository>pom-repository3.6localrepository中配置的profile-repository下载的pom-profile-repository由于我们有前面几步把jar下载到本地repository,为了测试最后一步我们不需要执行rm-rf~/.m2/repository/com/alibaba/fastjson删除本地依赖。我这里使用mvncompile-Ppom-profile来做测试,输出结果如下:可以看到,没有从任何远程仓库下载依赖local>allremotewarehouses4.总结从上面一系列的验证,可以得出dependenciessearch的优先级:local-repo>settings-profile-repository>pom-profile-repository>pom-repository>central了解mavensearch的优先级可以帮助我们解决一些工作中找不到依赖的错误和学习。最后推荐几个可以使用的maven仓库:https://repo.maven.apache.org...https://repo1.maven.org/maven2/https://maven.aliyun.com/repo...