解決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下載依賴的機制。比較詳細。