Maven 创建项目卡在 Generating project in Batch mode 处问题分析解决

原创 mavenidea

使用 IDEA 创建 Maven 工程,在执行项目创建和依赖分析的过程中,一直卡在 Generating project in Batch mode 处长达好几分钟:

[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

同时,右下方状态栏处,显示创建过程仍在进行。

这里其实就是因为在墙内网速慢的原因,我看网上很多人说跑了一晚上都没有过这一句,我今天遇到的情况还好,大概花了不到 10 分钟的样子。

如果翻墙或者网络情况比较好,也有可能不会遇到这个问题,很快就过去了。归根结底就是网络不给力啊。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:28 min
[INFO] Finished at: 2018-08-16T10:56:41+08:00
[INFO] Final Memory: 13M/152M
[INFO] ------------------------------------------------------------------------
[INFO] Maven execution finished

从最后构建成功的日志里可以看到整个过程花了 11.28 分钟,相比上次在家里也是遇到这个问题,跑了半天都没有成功,算是幸运的。

原因分析

虽说是网络原因,但是具体的原因还是需要分析一下的。

一般情况下,maven 是从远程仓库去获取依赖 jar 包和各种 plugin 插件的,到底是哪一个导致整体构建速度慢的呢?

实验在 mvn archetype:generate 命令后加 -X 参数查看详细的构建信息。

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -X

可以看到,程序停在了下面这一行:

[DEBUG] Searching for remote catalog: http://repo1.maven.org/maven2/archetype-catalog.xml

http://repo1.maven.org/maven2/archetype-catalog.xml 路径下载 archetype-catalog.xml 文件。 http://repo1.maven.org/maven2/archetype-catalog.xml 文件约为 3-4M,下载速度很慢,导致创建过程卡住。

命令行解决方式

如果习惯使用 mvn archetype:generate 命令来创建项目,可以直接手动下载 http://repo1.maven.org/maven2/archetype-catalog.xml 文件,然后把文件 archetype-catalog.xml 复制到用户目录 .m2\repository\org\apache\maven\archetype\archetype-catalog\2.3 下面。 2.3 是它的版本好,从上面的日志中可以找到:[INFO] >>> maven-archetype-plugin:2.3:generate (default-cli)

在上述命令后增加参数 -DarchetypeCatalog=local,变成读取本地文件即可。

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeCatalog=local

也可以使用 -DarchetypeCatalog=internal

IDEA 解决方式

IDEA 根据 maven archetype 的本质,其实是执行 mvn archetype:generate 命令,该命令执行时,需要指定一个 archetype-catalog.xml 文件。

该命令的参数 -DarchetypeCatalog 可选值为:remoteinternallocal 等,用来指定 archetype-catalog.xml 文件从哪里获取。

默认为 remote,即从 http://repo1.maven.org/maven2/archetype-catalog.xml 路径下载 archetype-catalog.xml 文件。

解决办法很简单,指定 -DarchetypeCataloginternal,即可使用 maven 默认的 archetype-catalog.xml,而不用再从 remote 下载。

首先,关闭 IDEA 所有项目,以使后续设置为默认项目设置,否则按照 IDEA 设置的潜规则,很可能只对当前项目生效,以后重新创建项目仍然会有问题。

然后,找到 maven 的 runner 项,在 VM Options 输入框内,加入 -DarchetypeCatalog=internal,保存即可。

注意右上角的灰字:for default project,而不是 for current project,证明此设置是全局有效的。

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论