如何在Maven pom文件中设置JDK编译与目标版本?两种配置对比
Maven Compiler Plugin两种配置方式的对比
先明确两种常见的等价配置形式
你的当前配置(插件内显式指定)
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.12.1</version> <configuration> <source>11</source> <target>11</target> </configuration> </plugin> </plugins> </build>
常见的另一种配置(通过Maven全局属性)
<properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.12.1</version> </plugin> </plugins> </build>
另外还有一种JDK 9+支持的简洁配置,效果和上述两种一致:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.12.1</version> <configuration> <release>11</release> </configuration> </plugin> </plugins> </build>
效果是否一致?
这几种配置的编译效果完全相同:
- 前两种都是明确指定用JDK 11的语法规则编译代码,生成兼容JDK 11的字节码;
release参数是JDK 9引入的新参数,会同时统一source、target和bootclasspath,避免出现语法版本和字节码版本不匹配的问题,当source和target都设为同一版本时,和release参数的效果完全等价。
哪种方式更优?
- 优先推荐用Maven全局属性的方式:
- 配置更简洁,不需要在插件节点内重复编写配置块;
- 可以在父POM中统一定义版本属性,子模块直接继承,非常适合多模块项目统一管理JDK版本;
- 符合Maven“约定优于配置”的设计原则,减少冗余代码。
- 插件内直接配置的方式适合特殊场景:比如某个模块需要使用和全局不同的JDK版本编译,这时单独给该模块的插件配置
source/target就能覆盖全局属性。 release参数配置是JDK 9+的更优写法,它能自动处理source、target和bootclasspath的一致性,避免潜在的版本兼容问题,如果你确定项目只针对JDK 9及以上版本,推荐用这种写法。
内容的提问来源于stack exchange,提问作者user3780373
相关产品推荐
相关产品推荐

