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

版权声明:如需转载或引用,请注明出处。 https://blog.csdn.net/weixin_39278265/article/details/87709669

前言

本文旨在解决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/)

在这里插入图片描述

1 问题场景描述

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

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

[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]

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

2 分析原因:Maven下载依赖为什么会失败

2.1 Maven如何下载依赖

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

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

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]

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

在这里插入图片描述

2.2 分析原因

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

后来去网上一查,发现是这个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下载依赖的机制。比较详细。

猜你喜欢

转载自blog.csdn.net/weixin_39278265/article/details/87709669