讓maven使用國內鏡像和archetypeCatalog

作為一個程序員,每一天都能感受到土嗇的深深惡意。

今天嘗試一個朋友寫的快速創(chuàng)建Java程序的框架ActFramework,結果在寫hello world時,運行mvn命令就被卡了個半死。

就是下面這條用于搭出項目架子的命令:

mvn archetype:generate \
    -DgroupId=com.mycom.helloworld \
    -DartifactId=helloworld \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DinteractiveMode=false

運行之后,卡在下面這一行,長達100年:

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.3:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.3:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.3:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode

它到底在等什么呢?給mvn加上-X參數(shù),顯示調試級別的日志:

[DEBUG]   (f) session = org.apache.maven.execution.MavenSession@66f66866
[DEBUG] -- end configuration --
[INFO] Generating project in Batch mode
[DEBUG] Searching for remote catalog: http://repo.maven.apache.org/maven2/archetype-catalog.xml

原來是在訪問http://repo.maven.apache.org/maven2/archetype-catalog.xml這個地址,遺憾的是,它可能是被土嗇了。

面對這種情況,我的第一反應是找個國內的源吧,讓maven從國內下載依賴庫。

找到了一篇文章說阿里云可用,測試了一下果然可以(感謝阿里以及這位同學)。

添加阿里云的mirror

按照文章的提示,我要把阿里云的地址加到maven的配置文件中,那么應該加到哪里呢?

通常來說,對于*nix系統(tǒng),一般是在~/.m2/settings.xml中,但是最好先確認一下。

輸入命令mvn -X,不用管它后面是否成功,我們的目的是要從日志信息中,看看maven到底用的是哪個配置文件。

仔細檢查,果然在大片輸出中看到了以下信息:

[DEBUG] Reading global settings from /usr/local/Cellar/maven/3.3.9/libexec/conf/settings.xml
[DEBUG] Reading user settings from /Users/twer/.m2/settings.xml

原來它先從自己的安裝目錄里找到全局settings.xml,然后再找~/.m2/settings.xml

那我們就把以下內容添加到后者中的<mirrors>標簽中吧!

<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
</mirror>

這段話是什么意思呢?關鍵點在于<mirrorOf>central</mirrorOf>,它是說,把我提供的這個阿里云的源當作central源的代理吧,以后你需要訪問那個名為central的源時,就把所有的請求轉發(fā)到我阿里云上。

那么central又是什么呢?原來maven自己內置了一個超級POM,里面預先定義了名為central對應的地址:

<repositories>
  <repository>
    <id>central</id>
    <name>Central Repository</name>
    <url>http://repo.maven.apache.org/maven2</url>
    <layout>default</layout>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
</repositories>

可以看到,central這個id對應的是http://repo.maven.apache.org/maven2

配置完以后,再次運行,看到它的確使用了阿里云:

[DEBUG] Using mirror alimaven (http://maven.aliyun.com/nexus/content/groups/public/) for central (https://repo.maven.apache.org/maven2).

還沒來得及開心,再次卡住100年:

[INFO] Generating project in Batch mode
[DEBUG] Searching for remote catalog: http://repo.maven.apache.org/maven2/archetype-catalog.xml

我已經配置好了鏡像,maven為什么還要去訪問 http://repo.maven.apache.org/maven2/archetype-catalog.xml 這個地址呢?

指定archetypeCatalog

經過一翻搜索,發(fā)現(xiàn)原來我的mvn命令是用來創(chuàng)建項目的,它還需要從http://repo.maven.apache.org/maven2/archetype-catalog.xml下載項目原型信息。

對于如何在配置文件中一勞永逸的把它換成國內源,由于時間所限,我還沒有找到辦法,不過至少我們可以在前面的mvn命令中,添加上archetypeCatalog參數(shù),即:

mvn archetype:generate \
    -DgroupId=com.mycom.helloworld \
    -DartifactId=helloworld \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DinteractiveMode=false \
    -DarchetypeCatalog=http://maven.aliyun.com/nexus/content/groups/public/

這樣就行了,分分鐘就下載成功。

如果有同學知道如何在maven的配置文件中配置,不用每次傳參數(shù),請一定要告訴我。

感受

兩點感受

  1. 我的朋友GreenLuo,是曾經那個非常著名的Java中playframework1的一個積極貢獻者,在play1不再開發(fā)之后,自己花了兩年時間寫了這個ActFramework

    由于他人不在國內,所以沒有想到,在土嗇內的同學連最基本的hello world都很難跑完吧!我也是今天試用的時候,才發(fā)現(xiàn)這個問題。

  2. Maven真是一個概念很多、文檔極差的工具(我其實特別不想用它),如果要學習它,我覺得使用“概念關系圖”的是一種極好的方式(實驗室的同學們應該知道)。今天時間有限,改天我自己試一下。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Maven編譯代碼的相關命令 第一、main目錄下的主代碼編寫完畢后,使用Maven進行編譯,在項目根目錄下運行命...
    加油小杜閱讀 1,264評論 0 2
  • 當前,JVM生態(tài)圈主要的三大構建工具: Apache Ant(帶著Ivy) Maven Gradle 對于剛開始接...
    清楓_小天閱讀 5,839評論 1 13
  • 所有項目的構建都是有生命周期的,這個生命周期包括:項目清理、初始化、編譯、測試、打包、集成測試、驗證、部署、站點生...
    zlcook閱讀 2,833評論 0 21
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 兄弟: 挺好的吧?收到我的信了嗎?如果收到了,回沒回信?我真希望你沒回信,因為回信我是收不到了,我現(xiàn)在在千里之外的...
    海風吹笛者閱讀 557評論 0 0