我有一个使用Java1.8的现有项目,我的JAVA_HOME被设置为Java1.8,因此maven使用Java1.8,现在我们的项目决定开始使用运行在Java11上的SonarQube 9.x,除了运行我们的代码的任何扫描/分析之外,它还需要Java 11。
所以我需要做的是:
#1使用默认jdk ( 1.8 )编译代码( mvn干净安装)
#2使用jdk 11进行声纳扫描( mvn声纳:声纳)
要执行#2,需要maven使用jdk 11,而执行#1则需要maven使用JDK1.8。
在阅读了有关SO的各种问题后,出现了“工具链”。
因此,将toolchains.xml添加到我的“m2”文件夹中:
<?xml version="1.0" encoding="UTF-8"?>
<toolchains>
<!-- JDK toolchains -->
<toolchain>
<type>jdk</type>
<provides>
<version>1.11</version>
<vendor>sun</vendor>
</provides>
<configuration>
<jdkHome>C:\construction\tools\jdk-11.0.12</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>1.8</version>
<vendor>sun</vendor>
</provides>
<configuration>
<jdkHome>C:\Program Files\Java\jdk1.8.0_191</jdkHome>
</configuration>
</toolchain> 在我的项目pom.xml中添加了工具链插件
<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>现在,当我运行maven干净安装时,可以在日志中看到java 11‘似乎是被使用的:
信息-maven-工具链-插件:1.1:工具链(默认)@ TreeSurveyAPI -信息所需的工具链: jdk供应商=‘sun’版本=‘1.11’找到匹配的工具链类型jdk: JDKC:\construction\tools\jdk-11.0.12 INFO --maven-编译器-插件:3.7.0:编译(默认-编译)@ TreeSurveyAPI --编译器中的信息工具链-编译器-插件: JDKC:\construction\tools\jdk-11.0.12所检测到的更改-重新编译模块!将11个源文件编译到C:\construction\xxx\XYZ-main\target\classes的信息
因此,maven和工具链似乎正在使用Java 11编译代码。但是,在针对已编译的类文件执行javap之后,主要版本显示为52 ( Java 8)
javap -verbose Abc.class | findstr "major"以下是我的问题:
#1在上述情况下,既然工具链指向java 11,那么代码不应该用java 11编译吗?为什么要使用java 8呢?
#2如何有条件地使用java 8 Vs java 11 (使用java 8编译和构建,并使用java 11运行声纳任务)?
谢谢
https://stackoverflow.com/questions/69823845
复制相似问题