• 老问题了:idea中使用maven archetype新建项目时卡住


    背景#

    作为一个后端Java打工人,idea就是最重要的打饭工具。创建项目,熟悉吧,但是,这么多年下来,因为idea换了版本,电脑换了等等,我还是时不时遇到根据maven archetype新建maven项目卡住。没错,我说的就是下面这样的场景:

    image-20230818220009447

    image-20230818220115722

    总之吧,就是停在上面这里,不动了:

    Copy
    [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级别参数,查看阻塞原因#

    首先,点这里,可以看到完整命令:

    image-20230818220715248

    基本就是:

    Copy
    "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即可:image-20230818221451851

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

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

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

    这个文件的url已经给出来了,网上都是说,文件特别大,可以自己浏览器下载下来,放到某个位置,然后再改个参数-DarchetypeCatalog=local,后续让maven都从这个位置去读即可。

    我看了下,这个文件确实大,14M左右,而且是从maven官方仓库那小水管下载,确实要卡很久,文件是干啥的呢,catalog表示目录,合起来意思就是项目模版的目录,比如我们常用的quickstart,只是其中的一个:

    Copy
    -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

    文件内容大概如下,整个文件包含了5w多个模板,这么多,能不慢吗:

    image-20230818223322663

    image-20230818223432985

    一个疑问#

    按照网上的方案,我把文件下载下来了,但我还不知道把文件放到哪里去。

    我想着,我先把参数-DarchetypeCatalog=local改了,看看debug日志,在local参数情况下,是去哪里获取这个文件:

    image-20230818223623549

    然后,注意啊,敲黑板了!rerun的话,这个参数是不生效的,必须新建project或module,这个参数才会生效,也就是说,之前建的都没效果,仅对新project、module生效。

    image-20230818223920206

    此时,如下,它会去本地仓库的根目录下查找这个目录文件:

    image-20230818224159385

    ok,知道去哪里放这个目录文件了,问题是,我还没放呢,但它这次执行为啥就成功了呢?

    image-20230818224430566

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

    加了-DarchetypeCatalog=local的情况下,会在本地的本地仓库下找archetype-catalog.xml。但我们没放,所以找不到。找不到的话,它也就放弃了,会直接去maven中央仓库拉取这个指定模版的jar下来。

    Copy
    [DEBUG] Getting archetypes from catalog: F:\maven\repository\archetype-catalog.xml // 下面这行,意思是容错处理,去中央仓库拉取 [WARNING] Archetype not found in any catalog. Falling back to central repository.

    拉取下来的模版/原型的内容#

    我们前面提到,模版的坐标为:

    Copy
    -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

    拉取下来后,我们看看其内容:

    image-20230818225230149

    jar包解压后,发现很眼熟,就是我们模板项目的内容:

    image-20230818225400014

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

    image-20230818225611178

    image-20230818225619818

    下面这个App.java的$package占位符,我们在命令里没有显式传递,是maven获取了-DgroupId=com.example的值作为其默认值。

    所以,解决本问题的方法,就是在maven的runner加上参数-DarchetypeCatalog=local就可以了,不需要下载xml文件再放到指定目录。

    如果我们放置的话呢,看看日志是啥样:

    Copy
    [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/

    image-20230818230444710

    我也是才知道,还可以根据现在已有的项目来生成模版,感觉还是不错的,后面打算研究下,毕竟公司内项目一多,在项目间需要复用的东西就越来越多,搞个模版工程还是不错的。

    该插件的goal:generate

    我们上面使用的就是该插件的generate 目标:

    https://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html

    这里就有各个参数的解释,这也是为什么网上文章都让我们这么改参数的原因:

    image-20230818230727608

    mvn命令如何执行该插件#

    Copy
    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:

    Copy
    -X,--debug Produce execution debug output

    另外,注意这里,指定了-Dpackage,即手动指定了我们module的包名。

    总结#

    魔鬼藏于细节,但我们不要放过细节。




  • 相关阅读:
    Oracle/PLSQL: Rank Function
    QT基础功能,信号、槽
    Hive中的map类型及其操作
    Flink 1.13 源码解析——JobManager启动流程 WebMonitorEndpoint启动
    excel怎么设置密码?加密文件这么做!
    Git的版本控制(查看文件内容和文件的变化状态、版本日志、版本回退以及找回覆盖的版本等)
    【智能优化算法-飞蛾扑火优化算法】基于水循环混合飞蛾扑火优化算法求解约束的工程优化问题附matlab代码WCMFO
    【XTDrone Ubuntu20.04】XTDrone+ Ubuntu20.04 + PX4安装
    jvm类加载机制,双亲委派机制,juc
    【数智化人物展】同方有云联合创始人兼总经理江琦:云计算,引领数智化升级的动能...
  • 原文地址:https://www.cnblogs.com/grey-wolf/p/17641808.html