深浅模式
多版本JDK
更新: 1/23/2026 字数: 0 字
1、用户目录下创建文件:
shell
~/.m2/toolchains.xml2、内容示例:
xml
hejinyo@HejinYos-MacBook-M3-Pro% cat ~/.m2/toolchains.xml
<?xml version="1.0" encoding="UTF-8"?>
<toolchains>
<toolchain>
<type>jdk</type>
<provides>
<version>8</version>
<vendor>oracle</vendor>
</provides>
<configuration>
<jdkHome>/Users/hejinyo/workspace/tools/jdk8</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>25</version>
<vendor>oracle</vendor>
</provides>
<configuration>
<jdkHome>/Users/hejinyo/workspace/tools/jdk25</jdkHome>
</configuration>
</toolchain>
</toolchains>2、然后在各项目的 pom.xml 中声明使用哪个版本:
xml
<properties>
<java.version>25</java.version>
</properties>
<build>
<plugins>
<!-- 1️⃣ 让 Maven 自动选择正确的 JDK -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<goals>
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<version>${java.version}</version>
<vendor>oracle</vendor>
</jdk>
</toolchains>
</configuration>
</plugin>
<!-- 2️⃣ 实际编译项目的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
运行原理简单说:
Toolchains 插件先执行:
它读取 ~/.m2/toolchains.xml 文件,找到满足 <version>25</version> 和 <vendor>oracle</vendor> 的 JDK。
Maven 就会在后续阶段都用这个 JDK 来执行插件(包括 compiler)。
Compiler 插件后执行:
它不管 JVM 从哪来,只用 ${java.version} 告诉编译器编译参数(-source 25 -target 25)。
这样即使你机器默认的 JAVA_HOME 指向 JDK8,
项目也能自动找到 JDK25 去编译,
整个流程既自动又可控。实际例子
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.hejinyo</groupId>
<artifactId>jdk25</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jdk25</name>
<description>jdk25</description>
<properties>
<java.version>25</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 构建配置部分,用于控制Maven如何编译、打包项目 -->
<build>
<plugins>
<!-- 1️⃣ Maven工具链插件:确保在不同环境中使用正确版本的JDK -->
<!-- 当团队成员使用不同JDK版本或CI/CD环境需要特定JDK时非常有用 -->
<!-- 它会根据toolchains.xml文件中的配置自动选择匹配的JDK版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<goals>
<!-- 执行toolchain目标来激活工具链 -->
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<!-- 指定所需的JDK版本,引用属性中的配置 -->
<version>${java.version}</version>
<!-- 指定JDK厂商,确保兼容性 -->
<vendor>oracle</vendor>
</jdk>
</toolchains>
</configuration>
</plugin>
<!-- 2️⃣ Maven编译器插件:配置Java源代码编译选项 -->
<!-- 控制源代码和目标字节码的版本,确保兼容性 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- 指定编译器插件版本,确保稳定性和功能 -->
<version>3.11.0</version>
<configuration>
<!-- 设置源代码版本与项目使用的Java版本一致 -->
<source>${java.version}</source>
<!-- 设置生成的字节码版本,确保与目标运行环境兼容 -->
<target>${java.version}</target>
<!-- 配置注解处理器路径 -->
<!-- 显式指定Lombok作为注解处理器,确保在所有环境中正确处理Lombok注解 -->
<!-- 避免因环境差异导致的编译问题 -->
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<!-- Lombok注解处理器,用于生成getter/setter等代码 -->
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<!-- Spring Boot Maven插件:提供Spring Boot项目特定的构建功能 -->
<!-- 负责创建可执行JAR文件,包含内嵌Tomcat等Web容器 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 排除不必要的依赖 -->
<!-- Lombok仅在编译时需要,运行时不需要包含在最终JAR中 -->
<!-- 这样可以减小最终JAR包的体积 -->
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>