Maven配置toolchains切换Java版本编译及Sonar扫描问题咨询
问题1解答
你观察到的现象是JDK向下兼容特性 + Maven编译插件配置共同作用的正常结果:
- Toolchain的作用仅为指定执行Maven插件的JDK运行环境,你此前配置了全局toolchain默认使用JDK11,因此maven-compiler-plugin会调用JDK11自带的javac程序执行编译操作。
- 但编译输出的字节码版本由
maven-compiler-plugin的<source>、<target>(或)参数决定,你原有项目默认配置的编译目标版本为JDK1.8,而JDK11的javac原生支持向下编译为低版本字节码,所以最终生成的class文件主版本号为52,对应JDK1.8版本。
问题2解答
推荐使用Maven Profile + Toolchain组合方案实现按需切换JDK版本,具体操作如下:
第一步:保留你已配置的~/.m2/toolchains.xml内容不变
第二步:修改项目pom.xml配置
- 先固定编译插件的输出版本为JDK1.8,避免不同JDK编译出现字节码版本不一致问题:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin>
- 新增两个Profile分别对应普通编译和Sonar扫描场景,将toolchain插件的配置分别放到对应Profile中:
<profiles> <!-- 默认激活的Profile,普通编译场景用JDK8 --> <profile> <id>default-compile</id> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-toolchains-plugin</artifactId> <version>1.1</version> <executions> <execution> <goals> <goal>toolchain</goal> </goals> </execution> </executions> <configuration> <toolchains> <jdk> <version>1.8</version> <vendor>sun</vendor> </jdk> </toolchains> </configuration> </plugin> </plugins> </build> </profile> <!-- Sonar扫描专用Profile,用JDK11 --> <profile> <id>sonar-scan</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-toolchains-plugin</artifactId> <version>1.1</version> <executions> <execution> <goals> <goal>toolchain</goal> </goals> </execution> </executions> <configuration> <toolchains> <jdk> <version>1.11</version> <vendor>sun</vendor> </jdk> </toolchains> </configuration> </plugin> </plugins> </build> </profile> </profiles>
第三步:执行命令的方式
- 普通编译打包:直接执行原有命令即可,默认会激活JDK8的Profile:
mvn clean install - 执行Sonar扫描:指定激活sonar-scan Profile即可使用JDK11运行扫描任务:
mvn sonar:sonar -Psonar-scan
如果想要进一步简化操作,还可以给sonar-scan Profile配置自动激活规则,当检测到执行sonar扫描任务时自动激活,无需手动加-P参数,也可以直接通过命令行临时指定toolchain版本,无需配置多Profile:mvn sonar:sonar -Dmaven.toolchains.jdk.version=1.11
内容的提问来源于stack exchange,提问作者satish marathe
相关产品推荐
相关产品推荐

