首页 > 解决方案 > 强制 maven 使用不同的 java 版本

问题描述

我有使用 Java 1.8 的现有项目 我的 JAVA_HOME 设置为 Java 1.8 结果 maven 使用 Java 1.8 ,这很好 现在我们的项目决定开始使用在 Java 11 上运行的 SonarQube 9.x 除了运行任何扫描/分析我们的代码 - 它也需要 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:

[信息] --- maven-toolchains-plugin:1.1:toolchain (默认) @ TreeSurveyAPI ---

[INFO] 所需工具链:jdk [ vendor='sun' version='1.11' ] [INFO] 找到类型 jdk 的匹配工具链:JDK [C:\construction\tools\jdk-11.0.12]

[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ TreeSurveyAPI --- [INFO] 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"

所以这是我的问题:

#1 在上述情况下,因为工具链指向 java 11 不应该用 java 11 编译代码吗?为什么使用 java 8 ?

#2 如何有条件地使用 java 8 Vs java 11(使用 java 8 编译和构建并使用 java 11 运行声纳任务)?

谢谢

标签: javamavensonarqube

解决方案


您也可以在 java 11 上运行您的项目。对于 99% 的情况,它将运行 java 8 代码没有问题。这就是我会做的。因此,升级项目 java 版本似乎是最简单的解决方案。

如果这不起作用,请查看此答案

此外,如果您需要能够快速更改各种任务和各种文件夹中的 JVM 版本,您可以使用此工具


推荐阅读