本文旨在解决Maven下载依赖时出现的错误: Could not resolve dependencies for project
系统环境: JDK 1.7
,Ubuntu系统(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
。
首先,我们要了解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
,这个仓库里面也提供了很多可供下载的依赖。 如下图:)
出现如上描述的错误,说明远程仓库没有这个版本的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 )。
我本来想直接将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的结合。
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下载依赖的机制。比较详细。