关于Maven找不到依赖或者下载慢的问题总结

Posted slankka

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Maven找不到依赖或者下载慢的问题总结相关的知识,希望对你有一定的参考价值。

导语

Maven和gradle是现在JAVA世界中最普遍的两个依赖管理工具。很多人最开始接触的便是maven,而即便是使用gradle的人,也不能保证你即将接触的项目不是基于maven的。
相信作为一个JAVA开发者,一定会遇到不少Maven相关的错误。这里总结一下一些maven的使用经验,能解决几乎所有平时能遇到的棘手问题。

找不到jar,无法在某某仓库找到jar

解决方案:
以commons-collections为例,

  1. 检查是不是网络问题:
    mvn dependency:get -Dartifact=org.apache.commons:commons-collections4:4.4
  2. 如果不能下载,则可能是仓库问题,需要去https://mvnrepository.com/查找该jar所在的仓库,一般来说 central的jar,下载失败,肯定是因为网速问题。如果一些jar不在central,例如:
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.6.0-cdh5.13.2</version>
</dependency>

网站会提示:Note: this artifact it located at Cloudera Rel repository (//repository.cloudera.com/content/repositories/releases/)
那么,要么你的项目pom.xml需要配置 repository要么 在 MAVEN_HOME/conf/settings.xml中的profile中配置全局repository

IDEA中,某一个依赖的import报红,或者某一个方法报 cannot resolve symbol之类的,而其实是可以用mvn package打包的,就是不能在本地运行。

解决方案:

  1. 可能的原因有,本地仓库的jar在网络传输中损坏,删除掉重新下载。
  2. 重新下载的方式有 点击右侧刷新reimport,以及手动下载,执行mvn dependency:get。
  3. 最后一个终极解决办法,无需重新安装IDEA,无需invalid Cache And Restart,直接退出IDEA,删除%USERPROFILE%.IdeaIC2019.3systemMaven,重新打开IDEA,IDEA会update maven indices。
  4. 如果你曾经手动删除过local Repository的某一个文件夹,这个缓存就对不上了,特别容易出现这个问题。

maven下载慢

maven镜像服务器是肯定需要配置的,有华为云,腾讯云,阿里云镜像服务器,又快又稳。注意,每个人所在的公司的网络环境可能有所不同,访问阿里云不一定是最快的,或者访问腾讯云不是最快的,甚至很慢。
可以在构建项目的时候多做测试。

下面给出最快的Maven三个镜像服务器

 <!-- 阿里云仓库 -->
    <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun-maven</name>
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>

    <!-- 中央仓库1 -->
    <mirror>
      <id>repo1</id>
      <mirrorOf>central</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://repo1.maven.org/maven2/</url>
    </mirror>

    <!-- 中央仓库2 -->
    <mirror>
      <id>repo2</id>
      <mirrorOf>central</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://repo2.maven.org/maven2/</url>
    </mirror>

    <!-- 腾讯云 -->
    <mirror>
      <id>nexus-tencentyun</id>
      <name>Nexus tencentyun</name>
      <url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
    </mirror>

    <!--华为云 -->
    <mirror>
      <id>huaweicloud</id>
      <url>https://mirrors.huaweicloud.com/repository/maven/</url>
    </mirror>

常见的误区

注意,99%的JAR都是在中央仓库的,还有一些在公司的私服,也就是nexus repository,还有一些在第三方开源仓库,例如SpringPlugins:

<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty</artifactId>
    <version>6.1.26.cloudera.4</version>
</dependency>

Note: this artifact it located at Spring Plugins repository (//repo.spring.io/plugins-release/)
因此镜像服务器不要上来就配mirrorOf *, 这个表示所有的jar都从这里下载,这肯定是不行的。

<mirror>
   <id>alimaven</id>
   <mirrorOf>*</mirrorOf>
   <name>aliyun-maven</name>
   <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

正确做法是

<mirrorOf>external:*</mirrorOf>

或者是

<mirrorOf>central</mirrorOf>

external表示URL是127.0.0.1或者localhost以外的
参见https://github.com/apache/maven/blob/maven-3.3.9/... external的源码

另外,对于公司自己的私服,肯定是要在mirrorOf里面排除的,假设私服的id是 snaps,不论是在 pom.xml还是在 settings.xml的profiles里面的repository内配置了这个私服,
在mirror中的写法:

 <mirrorOf>external:*,!snaps</mirrorOf>

而且对于某一个找不到jar的依赖,应该养成习惯,第一时间检查这个artifact是不是在maven中央仓库,是不是在某一个第三方仓库。如果在某一个第三方仓库,则把它加入到自己的pom.xml中,或者全局配置。
除此以外,还可以将这个仓库加入自己私服的PROXY代理中。

以上是关于关于Maven找不到依赖或者下载慢的问题总结的主要内容,如果未能解决你的问题,请参考以下文章

解决Maven下载依赖慢的问题(转)

解决Maven下载依赖慢的问题

m2eclipse 找不到 Maven 依赖项,找不到工件

Maven学习总结(59)—— Maven Jar 包冲突最全解决方案总结

Maven学习总结(59)—— Maven Jar 包冲突最全解决方案总结

关于IDEA2020.1版本会出现maven依赖问题