Skip to content

多版本JDK

更新: 1/23/2026 字数: 0 字

1、用户目录下创建文件:

shell
~/.m2/toolchains.xml

2、内容示例:

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>