我现有的项目使用Java 1.8我的JAVA_HOME设置为Java 1.8因此maven使用Java 1.8,这很好现在我们的项目已经决定开始使用SonarQube 9.x,它运行在Java 11上,除了对我们的代码进行任何扫描/分析之外-它还需要Java 11
所以我需要做的是:
1使用默认的jdk(1.8)编译代码(mvn clean install)
2使用jdk 11运行声纳扫描(mvn sonar:sonar)
执行#2需要maven使用jdk 11,而执行#1需要maven使用jdk 1.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 clean install时,可以在日志中看到java 11“似乎”被使用:
[INFO] - maven-toolchains-plugin:1.1:toolchain(default)@ TreeSurveyAPI -
[INFO] Required toolchain:jdk [ vendor='sun' version='1.11' ] [INFO] Found matching toolchain for type jdk:JDK[C:\construction\tools\jdk-11.0.12]
[INFO] - maven-compiler-plugin:3.7.0:compile(default-compile)@ TreeSurveyAPI - [INFO] Toolchain in maven-compiler-plugin:JDK[C:\construction\tools\jdk-11.0.12] [INFO]检测到更改-重新编译模块![INFO]将11个源文件编译为C:\construction\xxx\XYZ-main\target\classes
因此,“看起来"maven沿着工具链使用Java 11编译代码。然而,在对编译的类文件执行javap后,主版本显示为52(Java 8)
javap -verbose Abc.class | findstr "major"
型
所以我的问题是:
在上面的例子中,由于工具链指向Java 11,代码不应该用Java 11编译吗?为什么它使用Java 8?
2如何有条件地使用java 8和java 11(使用java 8编译和构建,使用java 11运行sonar任务)?
谢谢
2条答案
按热度按时间ikfrs5lh1#
你也可以在java 11上运行你的项目。它将在99%的情况下运行java 8代码没有问题。这是我会做的。因此,升级项目的java版本似乎是最简单的解决方案。
如果这不起作用,请查看此answer
此外,如果您需要能够快速更改各种任务和各种文件夹中的JVM版本,则可以使用此tool
wnvonmuf2#
有两个主要方面需要了解:
<target>
(用户属性maven.compiler.target
)JAVA版本定义了编译器将创建的代码和类JAVA版本-但这并不能保证您的代码将在该目标版本的实际JAVA运行时上100%**运行(在下面的风险标题下)。这两个主题都必须从风险和预先防范的Angular 得到很好的理解。
最常见的需求场景是这样的:
执行Maven build需要JAVA版本A
编译的目标类需要JAVA版本B
在你的问题中,你必须满足:
1.使用JAVA 11进行Maven构建执行以满足SonarQube插件要求
1.使用JAVA 1.8进行编译和JUnit测试代码
满足此要求的正确配置是:
1.定义您的**
JAVA_HOME
用于运行到JDK 11主目录的Maven构建过程=>满足您的问题#2**
1.配置您的toolchains插件以使用JDK 1.8主页
1.配置maven-compiler-plugin
字符串
=>2.和3.满足您的问题#1
不单独配置工具链存在风险
如果您使用JDK 11运行构建,而没有通过工具链定义单独的JDK 8,那么您编译的类将符合JDK 8,如果您将maven-compiler-plugin目标配置为1.8,
但是
**=>**您的项目在JAVA 8运行时后期有失败的风险,未找到意外和可疑的类或方法缺失异常。