You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven多模块项目如何为依赖模块指定不同编译JDK版本

解决方案

Maven在单次构建流程中,同一GAV(groupId/artifactId/version)坐标的模块默认只能生成一个构件,无法直接同时输出两个不同JDK版本编译的产物,因此可以通过以下几种可行方案实现需求:

方案一:基于Profile+Classifier实现同模块多版本输出(推荐,代码无需拆分)

  • 第一步:在module3的pom.xml中添加两套编译Profile,分别对应JDK8和JDK11,通过classifier区分不同版本的产物,同时配合toolchains指定对应JDK版本
<!-- module3 pom.xml 配置示例 -->
<profiles>
  <profile>
    <id>jdk8</id>
    <activation>
      <activeByDefault>false</activeByDefault>
    </activation>
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
          <configuration>
            <release>8</release>
            <!-- 对接toolchains指定JDK8 -->
            <jdkToolchain>
              <version>1.8</version>
            </jdkToolchain>
          </configuration>
        </plugin>
        <!-- 给JDK8版本产物加专属classifier -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>jdk8</classifier>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>jdk11</id>
    <activation>
      <activeByDefault>false</activeByDefault>
    </activation>
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
          <configuration>
            <release>11</release>
            <!-- 对接toolchains指定JDK11 -->
            <jdkToolchain>
              <version>11</version>
            </jdkToolchain>
          </configuration>
        </plugin>
        <!-- 给JDK11版本产物加专属classifier -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>jdk11</classifier>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>
  • 第二步:在module1、module2的依赖声明中,分别指定对应版本的classifier
<!-- module1 pom.xml 依赖配置 -->
<dependency>
  <groupId>你的项目groupId</groupId>
  <artifactId>module3</artifactId>
  <version>${project.version}</version>
  <classifier>jdk8</classifier>
</dependency>

<!-- module2 pom.xml 依赖配置 -->
<dependency>
  <groupId>你的项目groupId</groupId>
  <artifactId>module3</artifactId>
  <version>${project.version}</version>
  <classifier>jdk11</classifier>
</dependency>
  • 第三步:执行构建时先编译两个版本的module3再构建其他模块,可直接执行命令:mvn install -pl module3 -P jdk8 && mvn install -pl module3 -P jdk11 && mvn install,也可以在父POM中集成maven-invoker-plugin实现一键触发全流程。

方案二:拆分module3为两个独立模块(无配置冲突,维护简单)

新建module3-jdk8和module3-jdk11两个模块,通过<sourceDirectory>标签将两个模块的源码目录指向同一套公共源码路径,分别配置对应的JDK编译参数即可。module1依赖module3-jdk8,module2依赖module3-jdk11,不需要额外的Profile和classifier配置。

方案三:兼容场景下统一编译版本(最省工作量)

如果module3的代码没有用到JDK11及以上版本的专属API、语法特性,可直接统一用JDK8编译module3,生成字节码版本为1.8的产物。Java向下兼容,JDK11运行环境可以正常使用JDK8编译的class文件,无需额外调整配置。

内容的提问来源于stack exchange,提问作者utkarsh jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:21:02