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
相关产品推荐
相关产品推荐

