idea中使用maven?archetype新建項(xiàng)目時(shí)卡住問(wèn)題解決方案
背景
作為一個(gè)后端Java打工人,idea就是最重要的打飯工具。創(chuàng)建項(xiàng)目,熟悉吧,但是,這么多年下來(lái),因?yàn)閕dea換了版本,電腦換了等等,我還是時(shí)不時(shí)遇到根據(jù)maven archetype新建maven項(xiàng)目卡住。沒(méi)錯(cuò),我說(shuō)的就是下面這樣的場(chǎng)景:


總之吧,就是停在上面這里,不動(dòng)了:
[INFO] --- maven-archetype-plugin:3.2.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
以前都是網(wǎng)上隨便找個(gè)文章搞一搞,或者有時(shí)候多等一會(huì),解決了也就不管了,直到下次因?yàn)閾Q電腦、重裝idea等等,又不行了。我也奇怪,你拿 Generating project in Batch mode 去網(wǎng)上一搜,出來(lái)的解決辦法還各不相同。
這次我決定好好探究下,了解下內(nèi)部原理,知其然,也要知其所以然,把這個(gè)小問(wèn)題搞清楚。
打開(kāi)debug級(jí)別參數(shù),查看阻塞原因
首先,點(diǎn)這里,可以看到完整命令:

基本就是:
"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
可以看下上面的命令,我已經(jīng)去除了不重要的參數(shù),剩下的分幾個(gè)部分:
- maven home目錄
- 日志級(jí)別,目前是-errors,不會(huì)打印太詳細(xì)的日志
- -DgroupId/-DartifactId/-Dversion 我們要生成的業(yè)務(wù)module的坐標(biāo)
- -DarchetypeGroupId/-DarchetypeArtifactId/-DarchetypeVersion module模版/原型的坐標(biāo)
- -DarchetypeRepository module模版/原型的本地倉(cāng)庫(kù)位置
- org.apache.maven.plugins:maven-archetype-plugin:RELEASE:generate 丟給maven的執(zhí)行參數(shù),表示要執(zhí)行的插件及目標(biāo)
上面這里,日志級(jí)別是比較高的,我們需要調(diào)低,怎么調(diào)呢,通過(guò)idea的settings即可:

打開(kāi)debug級(jí)別后,再次運(yùn)行,命令里就會(huì)多出一個(gè): --debug 參數(shù),而運(yùn)行時(shí)就會(huì)出現(xiàn)如下日志:

日志顯示正在獲取某個(gè)xml文件。
這個(gè)文件的url已經(jīng)給出來(lái)了,網(wǎng)上都是說(shuō),文件特別大,可以自己瀏覽器下載下來(lái),放到某個(gè)位置,然后再改個(gè)參數(shù) -DarchetypeCatalog=local ,后續(xù)讓maven都從這個(gè)位置去讀即可。
我看了下,這個(gè)文件確實(shí)大,14M左右,而且是從maven官方倉(cāng)庫(kù)那小水管下載,確實(shí)要卡很久,文件是干啥的呢,catalog表示目錄,合起來(lái)意思就是項(xiàng)目模版的目錄,比如我們常用的quickstart,只是其中的一個(gè):
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-quickstart
-DarchetypeVersion=1.4
文件內(nèi)容大概如下,整個(gè)文件包含了5w多個(gè)模板,這么多,能不慢嗎:


一個(gè)疑問(wèn)
按照網(wǎng)上的方案,我把文件下載下來(lái)了,但我還不知道把文件放到哪里去。
我想著,我先把參數(shù) -DarchetypeCatalog=local 改了,看看debug日志,在local參數(shù)情況下,是去哪里獲取這個(gè)文件:

然后,注意啊,敲黑板了!rerun的話,這個(gè)參數(shù)是不生效的,必須新建project或module,這個(gè)參數(shù)才會(huì)生效,也就是說(shuō),之前建的都沒(méi)效果,僅對(duì)新project、module生效。

此時(shí),如下,它會(huì)去本地倉(cāng)庫(kù)的根目錄下查找這個(gè)目錄文件:

ok,知道去哪里放這個(gè)目錄文件了,問(wèn)題是,我還沒(méi)放呢,但它這次執(zhí)行為啥就成功了呢?

雖然成功了,但是給我整得有點(diǎn)迷茫,不知道怎么就成功了。我以為是idea有什么緩存,我還重啟了幾次idea,后來(lái)發(fā)現(xiàn)應(yīng)該就是這樣設(shè)計(jì)的:
加了-DarchetypeCatalog=local的情況下,會(huì)在本地的本地倉(cāng)庫(kù)下找 archetype-catalog.xml 。但我們沒(méi)放,所以找不到。找不到的話,它也就放棄了,會(huì)直接去maven中央倉(cāng)庫(kù)拉取這個(gè)指定模版的jar下來(lái)。
[DEBUG] Getting archetypes from catalog: F:\maven\repository\archetype-catalog.xml
// 下面這行,意思是容錯(cuò)處理,去中央倉(cāng)庫(kù)拉取
[WARNING] Archetype not found in any catalog. Falling back to central repository.
拉取下來(lái)的模版/原型的內(nèi)容
我們前面提到,模版的坐標(biāo)為:
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-quickstart
-DarchetypeVersion=1.4
拉取下來(lái)后,我們看看其內(nèi)容:

jar包解壓后,發(fā)現(xiàn)很眼熟,就是我們模板項(xiàng)目的內(nèi)容:

打開(kāi)其中兩個(gè)文件查看,發(fā)現(xiàn)還有不少占位符:


下面這個(gè)App.java的$package占位符,我們?cè)诿罾餂](méi)有顯式傳遞,是maven獲取了 -DgroupId=com.example 的值作為其默認(rèn)值。
所以,解決本問(wèn)題的方法,就是在maven的runner加上參數(shù)-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/

我也是才知道,還可以根據(jù)現(xiàn)在已有的項(xiàng)目來(lái)生成模版,感覺(jué)還是不錯(cuò)的,后面打算研究下,畢竟公司內(nèi)項(xiàng)目一多,在項(xiàng)目間需要復(fù)用的東西就越來(lái)越多,搞個(gè)模版工程還是不錯(cuò)的。
該插件的goal:generate
我們上面使用的就是該插件的generate 目標(biāo):
https://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html
這里就有各個(gè)參數(shù)的解釋?zhuān)@也是為什么網(wǎng)上文章都讓我們這么改參數(shù)的原因:

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級(jí)別日志是一樣的,具體可查看 mvn -h :
-X,--debug Produce execution debug output
另外,注意這里,指定了-Dpackage,即手動(dòng)指定了我們module的包名。
到此這篇關(guān)于idea中使用maven archetype新建項(xiàng)目時(shí)卡住的文章就介紹到這了,更多相關(guān)idea新建項(xiàng)目時(shí)卡住內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- eclipse maven maven-archetype-webapp 創(chuàng)建失敗問(wèn)題解決
- 使用Maven Archetype插件構(gòu)建Maven工程原型模板的實(shí)例
- 使用maven-archetype-plugin現(xiàn)有項(xiàng)目生成腳手架的方法
- 手把手教你寫(xiě)Maven的archetype項(xiàng)目腳手架
- IDEA自定義Maven archetype的方法步驟
- 教你如何在IDEA?中添加?Maven?項(xiàng)目的?Archetype(解決添加不起作用的問(wèn)題)
- maven中自定義MavenArchetype的實(shí)現(xiàn)
相關(guān)文章
Java簡(jiǎn)單實(shí)現(xiàn)session保存到redis的方法示例
這篇文章主要介紹了Java簡(jiǎn)單實(shí)現(xiàn)session保存到redis的方法,結(jié)合實(shí)例形式分析了Java將session存入redis緩存服務(wù)器的相關(guān)設(shè)置、實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2018-05-05
Spring?Boot與graphql-java如何構(gòu)建高效GraphQL服務(wù)
文章介紹如何在SpringBoot中集成graphql-java庫(kù),通過(guò)定義GraphQLSchema、構(gòu)建實(shí)例及注冊(cè)Web端點(diǎn)實(shí)現(xiàn)高效數(shù)據(jù)查詢與突變操作,解決RESTAPI的過(guò)度獲取問(wèn)題,提升開(kāi)發(fā)靈活性與性能,并結(jié)合工具如ApolloClient優(yōu)化前端數(shù)據(jù)管理,感興趣的朋友跟隨小編一起看看吧2025-09-09
簡(jiǎn)單了解JAVA SimpleDateFormat yyyy和YYYY的區(qū)別
這篇文章主要介紹了簡(jiǎn)單了解JAVA SimpleDateFormat yyyy和YYYY的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Java Socket編程簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java Socket編程簡(jiǎn)介的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
Spring Cloud Config對(duì)特殊字符加密處理的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Cloud Config對(duì)特殊字符加密處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-05-05
Rabbitmq延遲隊(duì)列實(shí)現(xiàn)定時(shí)任務(wù)的方法
這篇文章主要介紹了Rabbitmq延遲隊(duì)列實(shí)現(xiàn)定時(shí)任務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
簡(jiǎn)單聊聊RabbitMQ中的隊(duì)頭阻塞問(wèn)題
這篇文章主要為大家詳細(xì)介紹了RabbitMQ中的隊(duì)頭阻塞問(wèn)題以及相關(guān)的解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
SpringCloud入門(mén)實(shí)驗(yàn)環(huán)境搭建
這篇文章主要介紹了SpringCloud入門(mén)實(shí)驗(yàn)環(huán)境搭建的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用SpringCloud,感興趣的朋友可以了解下2021-04-04

