【工具】Maven编译任务解析

Maven编译任务解析

请解析mvn compile执行日志:

shell 复制代码
/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/bin/java -Dmaven.multiModuleProjectDirectory=/Users/lishuang/devcodesNew/helloworldmavenide -Dmaven.home=/Users/lishuang/devtools/apache-maven-3.6.0 -Dclassworlds.conf=/Users/lishuang/devtools/apache-maven-3.6.0/bin/m2.conf -Didea.launcher.port=52103 "-Didea.launcher.bin.path=/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Users/lishuang/devtools/apache-maven-3.6.0/boot/plexus-classworlds-2.5.2.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMainV2 org.codehaus.classworlds.Launcher -Didea.version2019.1 --errors --update-snapshots -s /Users/lishuang/devtools/apache-maven-3.6.0/conf/settings_aliyun.xml -Dmaven.repo.local=/Users/lishuang/.m2/repository compile
[INFO] Error stacktraces are turned on.
[WARNING] 
[WARNING] Some problems were encountered while building the effective settings
[WARNING] Unrecognised tag: 'repository' (position: START_TAG seen ...</profile>\n    -->\n    <repository>... @254:17)  @ /Users/lishuang/devtools/apache-maven-3.6.0/conf/settings_aliyun.xml, line 254, column 17
[WARNING] 
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------< com.example:hello-world-maven-ide >------------------
[INFO] Building hello-world-maven-ide 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello-world-maven-ide ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello-world-maven-ide ---
[INFO] Nothing to compile - all classes are up to date
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.576 s
[INFO] Finished at: 2026-06-24T16:59:01+08:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

解析:

这段输出其实就是:IDEA 发起了一次 Maven 编译任务,Maven 成功执行了 compile 生命周期,但过程中发现你的 settings_aliyun.xml 配置文件有格式问题。虽然有警告,但不影响这次编译。

我按执行链拆一下。


第一层:是谁启动了谁?

命令最前面:

bash 复制代码
/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/bin/java

说明:

用 JDK17 的 java 程序启动一个 Java 进程

也就是说:

plain 复制代码
IDEA
 ↓
启动 java
 ↓
java 启动 Maven
 ↓
Maven 编译项目

不是 IDEA 自己编译。


第二层:启动参数(-D)

这些:

bash 复制代码
-Dxxx=yyy

叫:

JVM 系统属性(System Property)

程序运行时读取。


① 项目根目录

bash 复制代码
-Dmaven.multiModuleProjectDirectory=
/Users/lishuang/devcodesNew/helloworldmavenide

意思:

latex 复制代码
当前 Maven 项目的根目录

即:

plain 复制代码
helloworldmavenide/
├── pom.xml
└── src/

Maven 会从这里找 pom.xml


② Maven 安装目录

bash 复制代码
-Dmaven.home=
/Users/lishuang/devtools/apache-maven-3.6.0

说明:

使用的是:

latex 复制代码
Maven 3.6.0

不是 IDEA 内置 Maven。


③ Maven 启动配置

bash 复制代码
-Dclassworlds.conf=
.../bin/m2.conf

这个很多人第一次看会懵。

实际上:

Maven 本身也是 Java 程序。

启动链:

latex 复制代码
java
 ↓
plexus-classworlds
 ↓
读取 m2.conf
 ↓
加载 Maven
 ↓
执行 compile

m2.conf 决定:

  • 加载哪些 jar
  • 主类是谁

类似:

latex 复制代码
启动脚本配置

④ IDEA 调试连接

bash 复制代码
-Didea.launcher.port=52103

表示:

IDEA 开了一个端口。

用于:

  • 接收运行日志
  • 中断任务
  • 控制运行状态

⑤ 编码

bash 复制代码
-Dfile.encoding=UTF-8

表示:

全部按 UTF-8 编码。

避免:

latex 复制代码
中文乱码

第三层:classpath

这一段:

bash 复制代码
-classpath
"...plexus-classworlds...jar:
idea_rt.jar"

classpath:

latex 复制代码
程序运行时去哪找类

这里两个核心包:


Maven启动器

latex 复制代码
plexus-classworlds-2.5.2.jar

负责:

  • 类加载
  • 找 Maven

IDEA运行支持

latex 复制代码
idea_rt.jar

负责:

  • IDEA 控制运行
  • 停止按钮
  • 输出日志

第四层:真正执行的主程序

这里:

bash 复制代码
com.intellij.rt.execution.application.AppMainV2

这是:

latex 复制代码
IDEA启动器

然后启动:

bash 复制代码
org.codehaus.classworlds.Launcher

真正进入:

latex 复制代码
Maven Launcher

类似:

plain 复制代码
IDEA
→ AppMainV2
→ Maven Launcher
→ compile

第五层:真正执行的 Maven 命令

最后这一段最关键:

bash 复制代码
--errors
--update-snapshots
-s settings_aliyun.xml
-Dmaven.repo.local=...
compile

相当于命令行:

bash 复制代码
mvn -e -U \
-s settings_aliyun.xml \
-Dmaven.repo.local=~/.m2/repository \
compile

解释:


--errors

等价:

bash 复制代码
-e

显示异常堆栈。

所以:

latex 复制代码
Error stacktraces are turned on.

--update-snapshots

等价:

bash 复制代码
-U

强制检查:

latex 复制代码
SNAPSHOT依赖是否更新

-s

指定:

latex 复制代码
settings.xml

这里:

latex 复制代码
settings_aliyun.xml

本地仓库

bash 复制代码
-Dmaven.repo.local=
~/.m2/repository

说明:

jar 下载到:

latex 复制代码
/Users/lishuang/.m2/repository

compile

执行生命周期:

latex 复制代码
validate
↓
compile

不会:

  • package
  • install

第六层:真正的问题(警告)

这里:

latex 复制代码
Unrecognised tag: 'repository'
settings_aliyun.xml
line 254

意思:

第254行:

xml 复制代码
<repository>

放错地方了。

常见错误:

xml 复制代码
<settings>

<repository>
...
</repository>
</settings>

正确:

xml 复制代码
<settings>

<profiles>
    <profile>

        <repositories>
            <repository>
            </repository>
        </repositories>
    </profile>
</profiles>
</settings>

注意:

latex 复制代码
repository
必须在
repositories
里面

并且通常在:

latex 复制代码
profile

内部。


第七层:最终结果

这里:

latex 复制代码
Nothing to compile

意思:

latex 复制代码
源码没变化

所以:

没重新编译。


最后:

latex 复制代码
BUILD SUCCESS
exit code 0

表示:

✅ Maven 成功

✅ 编译成功

⚠ settings 文件有警告

⚠ 但没影响编译


你这个日志里最值得处理的,不是编译,而是:

打开 settings_aliyun.xml 第 254 行,看 <repository> 放的位置。

这个警告以后可能导致仓库配置失效。

总结

从这个解析过程,学到了三点:

  1. mvn compile命令,在idea中执行的起始是 idea启动了一个java进程,启动Maven项目,再让Maven项目执行compile命令。实际上Maven项目是调用javac去执行编译指令。且是javac在执行编译指令的同时,生成调试信息,调试信息用来辅助进行idea内的断点调试。
  2. 看日志能看出来问题所在,定位问题,多靠日志,找报错信息,找蛛丝马迹,追寻报错真相。
  3. 以前忽略的控制台的日志打印,以后可不能忽略了,能发现程序运行原理呢。