作為一個程序員,每一天都能感受到土嗇的深深惡意。
今天嘗試一個朋友寫的快速創(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ù),請一定要告訴我。
感受
兩點感受
-
我的朋友GreenLuo,是曾經那個非常著名的Java中playframework1的一個積極貢獻者,在play1不再開發(fā)之后,自己花了兩年時間寫了這個ActFramework。
由于他人不在國內,所以沒有想到,在土嗇內的同學連最基本的hello world都很難跑完吧!我也是今天試用的時候,才發(fā)現(xiàn)這個問題。
Maven真是一個概念很多、文檔極差的工具(我其實特別不想用它),如果要學習它,我覺得使用“概念關系圖”的是一種極好的方式(實驗室的同學們應該知道)。今天時間有限,改天我自己試一下。