idea中使用maven?archetype新建項目時卡住問題解決方案
背景
作為一個后端Java打工人,idea就是最重要的打飯工具。創(chuàng)建項目,熟悉吧,但是,這么多年下來,因為idea換了版本,電腦換了等等,我還是時不時遇到根據maven archetype新建maven項目卡住。沒錯,我說的就是下面這樣的場景:
總之吧,就是停在上面這里,不動了:
[INFO] --- maven-archetype-plugin:3.2.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
以前都是網上隨便找個文章搞一搞,或者有時候多等一會,解決了也就不管了,直到下次因為換電腦、重裝idea等等,又不行了。我也奇怪,你拿 Generating project in Batch mode
去網上一搜,出來的解決辦法還各不相同。
這次我決定好好探究下,了解下內部原理,知其然,也要知其所以然,把這個小問題搞清楚。
打開debug級別參數,查看阻塞原因
首先,點這里,可以看到完整命令:
基本就是:
"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe"
-Dmaven.home=F:\tools\apache-maven-3.8.1-bin\apache-maven-3.8.1
--errors
-DgroupId=org.example
-DartifactId=test8
-Dversion=1.0-SNAPSHOT-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-quickstart
-DarchetypeVersion=1.4-DarchetypeRepository=F:/maven/repository
org.apache.maven.plugins:maven-archetype-plugin:RELEASE:generate
可以看下上面的命令,我已經去除了不重要的參數,剩下的分幾個部分:
- maven home目錄
- 日志級別,目前是-errors,不會打印太詳細的日志
- -DgroupId/-DartifactId/-Dversion 我們要生成的業(yè)務module的坐標
- -DarchetypeGroupId/-DarchetypeArtifactId/-DarchetypeVersion module模版/原型的坐標
- -DarchetypeRepository module模版/原型的本地倉庫位置
- org.apache.maven.plugins:maven-archetype-plugin:RELEASE:generate 丟給maven的執(zhí)行參數,表示要執(zhí)行的插件及目標
上面這里,日志級別是比較高的,我們需要調低,怎么調呢,通過idea的settings即可:
打開debug級別后,再次運行,命令里就會多出一個: --debug
參數,而運行時就會出現如下日志:

日志顯示正在獲取某個xml文件。
這個文件的url已經給出來了,網上都是說,文件特別大,可以自己瀏覽器下載下來,放到某個位置,然后再改個參數 -DarchetypeCatalog=local
,后續(xù)讓maven都從這個位置去讀即可。
我看了下,這個文件確實大,14M左右,而且是從maven官方倉庫那小水管下載,確實要卡很久,文件是干啥的呢,catalog表示目錄,合起來意思就是項目模版的目錄,比如我們常用的quickstart,只是其中的一個:
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-quickstart
-DarchetypeVersion=1.4
文件內容大概如下,整個文件包含了5w多個模板,這么多,能不慢嗎:
一個疑問
按照網上的方案,我把文件下載下來了,但我還不知道把文件放到哪里去。
我想著,我先把參數 -DarchetypeCatalog=local
改了,看看debug日志,在local參數情況下,是去哪里獲取這個文件:
然后,注意啊,敲黑板了!rerun的話,這個參數是不生效的,必須新建project或module,這個參數才會生效,也就是說,之前建的都沒效果,僅對新project、module生效。
此時,如下,它會去本地倉庫的根目錄下查找這個目錄文件:
ok,知道去哪里放這個目錄文件了,問題是,我還沒放呢,但它這次執(zhí)行為啥就成功了呢?
雖然成功了,但是給我整得有點迷茫,不知道怎么就成功了。我以為是idea有什么緩存,我還重啟了幾次idea,后來發(fā)現應該就是這樣設計的:
加了-DarchetypeCatalog=local的情況下,會在本地的本地倉庫下找 archetype-catalog.xml
。但我們沒放,所以找不到。找不到的話,它也就放棄了,會直接去maven中央倉庫拉取這個指定模版的jar下來。
[DEBUG] Getting archetypes from catalog: F:\maven\repository\archetype-catalog.xml
// 下面這行,意思是容錯處理,去中央倉庫拉取
[WARNING] Archetype not found in any catalog. Falling back to central repository.
拉取下來的模版/原型的內容
我們前面提到,模版的坐標為:
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-quickstart
-DarchetypeVersion=1.4
拉取下來后,我們看看其內容:
jar包解壓后,發(fā)現很眼熟,就是我們模板項目的內容:
打開其中兩個文件查看,發(fā)現還有不少占位符:
下面這個App.java的$package占位符,我們在命令里沒有顯式傳遞,是maven獲取了 -DgroupId=com.example
的值作為其默認值。
所以,解決本問題的方法,就是在maven的runner加上參數-DarchetypeCatalog=local就可以了,不需要下載xml文件再放到指定目錄。
如果我們放置的話呢,看看日志是啥樣:
[INFO] Generating project in Batch mode
[DEBUG] Getting archetypes from catalog: F:\maven\repository\archetype-catalog.xml
[INFO] Archetype repository not defined. Using the one from [org.apache.maven.archetypes:maven-archetype-quickstart:1.4] found in catalog local
了解該插件
https://maven.apache.org/archetype/maven-archetype-plugin/
我也是才知道,還可以根據現在已有的項目來生成模版,感覺還是不錯的,后面打算研究下,畢竟公司內項目一多,在項目間需要復用的東西就越來越多,搞個模版工程還是不錯的。
該插件的goal:generate
我們上面使用的就是該插件的generate 目標:
https://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html
這里就有各個參數的解釋,這也是為什么網上文章都讓我們這么改參數的原因:
mvn命令如何執(zhí)行該插件
mvn archetype:generate ? ?-DarchetypeGroupId=org.apache.maven.archetypes ?-DarchetypeArtifactId=maven-archetype-quickstart ?-DarchetypeVersion=1.1? ?-DgroupId=com.company ?-DartifactId=project ?-Dversion=1.0-SNAPSHOT ?-Dpackage=com.company.project ?-X --errors -DarchetypeCatalog=local
這里-X,就和表示前面idea中的debug級別日志是一樣的,具體可查看 mvn -h
:
-X,--debug Produce execution debug output
另外,注意這里,指定了-Dpackage,即手動指定了我們module的包名。
到此這篇關于idea中使用maven archetype新建項目時卡住的文章就介紹到這了,更多相關idea新建項目時卡住內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
源碼分析Spring?中?@Qualifier?注解基本用法
這篇文章主要介紹了源碼分析Spring?中?@Qualifier?注解基本用法,在源碼分析的過程中,也?GET?到?Spring?許多新的玩法,感興趣的小伙伴趕緊去試試吧2023-08-08Java中的異常處理(try,catch,finally,throw,throws)
本文主要介紹了Java中的異常處理,文章主要介紹的異常處理包括5個關鍵字try,catch,finally,throw,throws,更多詳細內容需要的朋友可以參考一下2022-06-06Mybatis Generator最完美配置文件詳解(完整版)
今天小編給大家整理了一篇關于Mybatis Generator最完美配置文件詳解教程,非常不錯具有參考借鑒價值,感興趣的朋友一起學習吧2016-11-11Java中弱引用和軟引用的區(qū)別以及虛引用和強引用介紹
很早Java API就添加了弱引用(WeakReference)和軟引用(SoftReference),但并不是所有的程序員都熟悉這兩個概念2014-04-04servlet之ServletContext簡介_動力節(jié)點Java學院整理
這篇文章主要介紹了servlet之ServletContext簡介,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07