解决Maven下载依赖失败的问题

前言

本文旨在解决Maven下载依赖时出现的错误: Could not resolve dependencies for project <your-project-name>: Could not find artifact org.eclipse.jdt:org.eclipse.jdt.core:jar:3.12.0.v20160516-2131 in sonatype-oss-public (https://oss.sonatype.org/content/groups/public/)html

在这里插入图片描述

1 问题场景描述

系统环境: JDK 1.7Ubuntu系统(16.04)java

当我在Java项目运行mvn clean install的时候,就报错(如上图片):web

[ERROR] Failed to execute goal on project my-app: Could not resolve dependencies for project com.mycompany.app:my-app:jar:1.0-SNAPSHOT: Could not find artifact org.eclipse.jdt:org.eclipse.jdt.core:jar:3.12.0.v20160516-2131 in sonatype-oss-public (https://oss.sonatype.org/content/groups/public/) -> [Help 1]apache

大意就是:Maven在下载依赖(dependency)的时候,找不到这个依赖org.eclipse.jdt:org.eclipse.jdt.core:jar:3.12.0.v20160516-2131app

2 分析缘由:Maven下载依赖为何会失败

2.1 Maven如何下载依赖

首先,咱们要了解Maven是怎么下载依赖的。eclipse

下载依赖的步骤:
1)先看本地仓库有没有对应的依赖;maven

Before Maven attempts to download a particular artifact from a remote repository it checks the local repository. This is usually located at $HOME/.m2/repository. [1]ide

2)若是有,就不用重复下载了;若是没有的话,就从远程仓库地址下载,远程仓库(repositories)被声明在项目的pom.xml文件中。
(注意:有时候项目中没有声明repository,可是maven也能顺利下载依赖,这是由于除了pom.xml文件中声明的远程仓库地址,Maven还有一个默认的远程仓库地址,即:Maven Central ,这个仓库里面也提供了不少可供下载的依赖。 以下图:)svg

在这里插入图片描述

2.2 分析缘由

出现如上描述的错误,说明远程仓库没有这个版本的jar包:org.eclipse.jdt:org.eclipse.jdt.core:jar:3.12.0.v20160516-2131ui

后来去网上一查,发现是这个jar包的groupid错误了,不该该是org.eclipse.jdt,而是org.eclipse.tycho (参考: https://mvnrepository.com/artifact/org.eclipse.tycho/org.eclipse.jdt.core/3.12.0.v20160516-2131 )。

3. 解决问题

3.1 从正确的远程地址中下载jar包

我原本想直接将org.eclipse.jdt替换为org.eclipse.tycho,可是发现项目的pom.xml文件中根本没有关于这个jar的任何描述,天然也无法修改替换。

因此只能本身下载,打开终端输入:

mvn dependency:get -DrepoUrl=http://download.java.net/maven/2/  -Dartifact=org.eclipse.tycho:org.eclipse.jdt.core:3.12.0.v20160516-21314

# 这个就是下载指定jar包的指令 `mvn dependency:get -DrepoUrl=something -Dartifact=group:artifact:version`
# 其中 DrepoUrl参数就是远程仓库地址, Dartifact参数就是group id,artifact id和version id的结合。

3.2 把下载下来的jar包拷贝到指定位置

mkdir -p $HOME/.m2/repository/org/eclipse/jdt/
cp -rf $HOME/.m2/repository/org/eclipse/tycho/* $HOME/.m2/repository/org/eclipse/jdt/

# 这里的 $HOME/.m2/repository/ 是个人本地Maven仓库路径。
# 第一步:先新建文件夹
# 第二步:把 org/eclipse/tycho/ 中的文件(包括咱们须要的jar包也在里面)都拷贝到 org/eclipse/jdt/ 下面

这样的话,再次运行mvn install的时候,maven先检查本地仓库的时候,就会发现: 本地仓库已经有了项目想要的org.eclipse.jdt.core:3.12.0.v20160516-21314 版本的jar包。

到此问题解决。

参考文献

[1] How does a maven repository work? https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/
这里详细解释了Maven 相关的 dependency和repository的概念,仍是很值得一读的。

[2] Maven: Command to update repository after adding dependency to POM https://stackoverflow.com/questions/8563960/maven-command-to-update-repository-after-adding-dependency-to-pom/40020233
这里告诉咱们怎么安装依赖,有些指令还挺有用的,如:mvn dependency:get -Dartifact=groupId:artifactId:version

[3] travis-ci: how to move or rename a file https://stackoverflow.com/questions/48303550/travis-ci-how-to-move-or-rename-a-file
这里是怎么配置travis ci,也能够参考下。

[4] Guide to installing 3rd party JARs https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
这里是怎么把第三方的jar包(能够理解为本地java项目打包成jar后放到Maven repo中,因此必须明确group id,版本号之类的)安装到本地仓库。

[5] A simple command line to download a remote maven2 artifact to the local repository? https://stackoverflow.com/questions/1776496/a-simple-command-line-to-download-a-remote-maven2-artifact-to-the-local-reposito
告诉咱们在怎么用Maven从远程仓库下载依赖,如:mvn dependency:get -DrepoUrl=something -Dartifact=group:artifact:version

[6] How to get the Maven local repo location? https://stackoverflow.com/questions/5916157/how-to-get-the-maven-local-repo-location
这个告诉咱们怎么看maven的本地仓库地址,最直接简单的指令就是mvn -X,就会在输出的信息中看到本地仓库地址。

[7] Maven dependency mechanism, how it works https://www.mkyong.com/maven/how-to-use-maven-dependency-to-download-library-automatically/ 这个也讲了maven下载依赖的机制。比较详细。