在上一篇文章中,我们探讨了管理Maven多模块项目使用不同JDK版本的一种方法。本文将分享另一种更优雅的方案:Maven Toolchains。
那么,什么是Maven Toolchains?其官方定义如下:
Maven Toolchains provide a way for a project to specify the JDK (or other tools) used to build the project, without needing to configure this in each plugin or in every pom.xml.
简单来说,Toolchains机制允许你在一个地方集中定义项目构建所需的JDK(或其他工具链),然后由各个模块或插件引用,避免了在每个插件或POM文件中重复配置。这为实现大型项目中JDK版本管理提供了便利。需要注意的是,并非所有插件都支持此特性,具体可参考文末的官方文档。
使用Maven Toolchains主要需要两个步骤:
- 在项目的
pom.xml中配置maven-toolchains-plugin插件。
- 在开发者机器或构建服务器上创建
toolchains.xml配置文件,默认路径为${user.home}/.m2/。

提示:从Maven 3.3.1开始,toolchains.xml可以放在任意位置,并通过--global-toolchains file参数指定。但通常建议使用默认位置。
示例环境
- Ubuntu 24.04.2 LTS
- JDK 1.8.0_401
- JDK 21.0.2
- Apache Maven 3.9.8
- IntelliJ IDEA 2025.1.3 (Community Edition)
示例代码
在${user.home}/.m2/目录下创建toolchains.xml文件,内容如下:
<toolchains>
<!-- JDK toolchains -->
<toolchain>
<type>jdk</type>
<provides>
<version>1.8</version>
<vendor>oracle</vendor>
</provides>
<configuration>
<jdkHome>/usr/local/soft/jdk/jdk1.8.0_401</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>21</version>
<vendor>openjdk</vendor>
</provides>
<configuration>
<jdkHome>/usr/local/soft/jdk/jdk-21.0.2</jdkHome>
</configuration>
</toolchain>
</toolchains>
配置说明:
type="jdk" 为固定值,也可用于定义其他工具链。
version和vendor是自定义的标识符,建议与实际JDK信息保持一致,后续在插件配置中会引用它们。
jdkHome为JDK的实际安装路径。
2. 创建Maven多模块项目并配置插件
父模块 POM (pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.projdk.example</groupId>
<artifactId>maven-toolchains-example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>maven-toolchains-m1</module>
<module>maven-toolchains-m2</module>
</modules>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
子模块 M1 POM (maven-toolchains-m1/pom.xml) - 使用 JDK 8
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.projdk.example</groupId>
<artifactId>maven-toolchains-example</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>maven-toolchains-m1</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<version>1.8</version>
<vendor>oracle</vendor>
</jdk>
</toolchains>
</configuration>
</plugin>
</plugins>
</build>
</project>
子模块 M2 POM (maven-toolchains-m2/pom.xml) - 使用 JDK 21
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.projdk.example</groupId>
<artifactId>maven-toolchains-example</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>maven-toolchains-m2</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<version>21</version>
<vendor>openjdk</vendor>
</jdk>
</toolchains>
</configuration>
</plugin>
</plugins>
</build>
</project>
3. 执行构建命令
在项目根目录下执行Maven命令(以编译打包为例):
mvn package
执行日志截图如下:


从日志中可以清晰地看到,两个子模块maven-toolchains-m1和maven-toolchains-m2分别使用了在toolchains.xml中定义的JDK 1.8和JDK 21进行构建,并且模块内的所有依赖插件也统一使用了指定的JDK版本。