找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1709

积分

1

好友

242

主题
发表于 5 小时前 | 查看: 3| 回复: 0

上一篇文章中,我们探讨了管理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主要需要两个步骤:

  1. 在项目的pom.xml中配置maven-toolchains-plugin插件。
  2. 在开发者机器或构建服务器上创建toolchains.xml配置文件,默认路径为${user.home}/.m2/

Toolchains原理示意图

提示:从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)

示例代码

1. 配置 toolchains.xml

${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" 为固定值,也可用于定义其他工具链。
  • versionvendor是自定义的标识符,建议与实际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构建日志,显示模块m1使用JDK1.8
Maven构建日志,显示模块m2使用JDK21

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




上一篇:云原生微服务分布式锁实现方案:基于Redis/ZooKeeper/etcd的选型指南
下一篇:技术思维如何影响职场沟通:拆解成因与高效协作指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 19:00 , Processed in 0.279538 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表