背景

作为一个后端Java打工人,idea就是最重要的打饭工具。创建项目,熟悉吧,但是,这么多年下来,因为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 我们要生成的业务module的坐标
  • -DarchetypeGroupId/-DarchetypeArtifactId/-DarchetypeVersion module模版/原型的坐标
  • -DarchetypeRepository module模版/原型的本地仓库位置
  • org.apache.maven.plugins:maven-archetype-plugin:RELEASE:generate 丢给maven的执行参数,表示要执行的插件及目标

上面这里,日志级别是比较高的,我们需要调低,怎么调呢,通过idea的settings即可:

打开debug级别后,再次运行,命令里就会多出一个:--debug参数,而运行时就会出现如下日志:

	![image-20230818221704629](https://dump-1252523945.cos.ap-shanghai.myqcloud.com/img/202308182217713.png)

日志显示正在获取某个xml文件。

这个文件的url已经给出来了,网上都是说,文件特别大,可以自己浏览器下载下来,放到某个位置,然后再改个参数-DarchetypeCatalog=local,后续让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,知道去哪里放这个目录文件了,问题是,我还没放呢,但它这次执行为啥就成功了呢?

虽然成功了,但是给我整得有点迷茫,不知道怎么就成功了。我以为是idea有什么缓存,我还重启了几次idea,后来发现应该就是这样设计的:

加了-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包解压后,发现很眼熟,就是我们模板项目的内容:

打开其中两个文件查看,发现还有不少占位符:

下面这个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命令如何执行该插件

 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新建项目时卡住的更多相关文章

  1. 在IntelliJ IDEA中创建Maven多模块项目

    在IntelliJ IDEA中创建Maven多模块项目 1,创建多模块项目选择File>New>Project 出现New Project窗口左侧导航选择Maven,勾选右侧的Create ...

  2. Maven学习总结(七)——eclipse中使用Maven创建Web项目

    一.创建Web项目 1.1 选择建立Maven Project 选择File -> New ->Project,如下图所示:

  3. Maven——eclipse中使用Maven创建Web项目

    原文:http://www.cnblogs.com/xdp-gacl/p/4054814.html 一.创建Web项目 1.1 选择建立Maven Project 选择File -> New - ...

  4. 转】Maven学习总结(七)——eclipse中使用Maven创建Web项目

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4054814.html 感谢! 一.创建Web项目 1.1 选择建立Maven Project 选择File -& ...

  5. 利用Eclipse中的Maven构建Web项目(三)

    利用Eclipse中的Maven构建Web项目 1.将Maven Project转换成动态Web项目,鼠标右键项目,输入"Project Facets" 2.依据Dynamic W ...

  6. 利用Eclipse中的Maven构建Web项目报错(二)

    利用Eclipse中的Maven构建Web项目 1.错误描述 [INFO] Scanning for projects... [INFO] [INFO] Using the builder org.a ...

  7. 利用Eclipse中的Maven构建Web项目报错(一)

    利用Eclipse中的Maven构建Web项目 1.在进行上述操作时,pom.xml一直报错 <project xmlns="http://maven.apache.org/POM/4 ...

  8. 利用Eclipse中的Maven构建Web项目(二)

    利用Eclipse中的Maven构建Web项目 1.新建源文件夹,Java Resources鼠标右键,"New-->Source Folder" 2.新建src/main/ ...

  9. 利用Eclipse中的Maven构建Web项目(一)

    利用Eclipse中的Maven构建Web项目 1.新建一个Maven Project,"New-->Other..." 2.选择"Maven Project&qu ...

  10. (转)Maven学习总结(七)——eclipse中使用Maven创建Web项目

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(七)——eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Project 选择File -&g ...

随机推荐

  1. 2022-05-01:golang里,结构体B里包含一个结构体A和一个整型成员变量。现在要给结构体A实现一个方法,让它能访问到B的整型变量,这个方法应该怎么写? 如果还有结构体C,D,E,F...都和

    2022-05-01:golang里,结构体B里包含一个结构体A和一个整型成员变量.现在要给结构体A实现一个方法,让它能访问到B的整型变量,这个方法应该怎么写? 如果还有结构体C,D,E,F-都和B一 ...

  2. 2021-02-18:给定一个字符串str,给定一个字符串类型的数组arr,出现的字符都是小写英文。arr每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来。返回需要至少多少张贴纸可以完成这个任务。例子:str= "babac",arr = {"ba","c","abcd"}。a + ba + c 3 abcd + abcd 2 abcd+ba 2。所以返回2。

    2021-02-18:给定一个字符串str,给定一个字符串类型的数组arr,出现的字符都是小写英文.arr每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来.返回需要至少多少张贴 ...

  3. IBM小型机 - 检测码:B150B10C,设备卡住不运行

    检测码:B150B10C 问题 开机后,出现检测码:B150B10C,然后就卡在这里不动,无法进行下一步: 这里的错误码表示--机器的内存控制模块被deconfig(取消配置): 解决方法 登录cel ...

  4. Python pip 修改镜像源为豆瓣源

    配置文件 编辑配置文件 ~/.pip/pip.conf,添加内容如下: [global] index-url = https://pypi.doubanio.com/simple trusted-ho ...

  5. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-1-环境准备与搭建

    1.简介 有很多人私信留言宏哥问能不能介绍一下Playwright这款自动化神器的相关知识,现在网上的资料太少了.其实在各大博客和公众号也看到过其相关的介绍和讲解.要不就是不全面.不系统,要不就是系统 ...

  6. 天翼云SD-WAN解决方案直播

    2023年6月16日14点,天翼云SD-WAN解决方案直播火热来袭啦!参与直播即可领取优惠好礼,实惠多多! 点击链接注册参与:https://ctyun.d1meeting.cn/0616/ 直播时间 ...

  7. 【技术积累】Java中的集合框架【一】

    什么是Java集合框架? Java集合框架是Java编程语言中提供的一组接口.实现和算法,用于存储和操作数据集合.集合框架可以让程序员更加高效地组织和操作数据,而无需手动实现底层数据结构. Java集 ...

  8. 22.04.1 wine8.10 完美安装同花顺最新版THS_9.20.40_20230613

    Linux luma 5.19.0-45-generic #46~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 7 15:06:04 UTC 20 x86_64 ...

  9. Unity UGUI的Text(文本)组件的介绍及使用

    UGUI的Text(文本)组件的介绍及使用 什么是UGUI的Text(文本)组件? UGUI(Unity Graphic User Interface)是Unity引擎的一套用户界面系统,而Text( ...

  10. Tomcat启动时出现乱码的解决方式

    在网上下载了一个版本号为apache-tomcat-8.5.38的Tomcat,因为这个Tomcat一直没有用过,所以今天启动时出现了如下乱码: 解决方案: 找到Tomcat目录下conf文件夹中的l ...