强制maven使用不同的java版本

slsn1g29  于 2023-11-17  发布在  Maven
关注(0)|答案(2)|浏览(201)

我现有的项目使用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任务)?

谢谢

ikfrs5lh

ikfrs5lh1#

你也可以在java 11上运行你的项目。它将在99%的情况下运行java 8代码没有问题。这是我会做的。因此,升级项目的java版本似乎是最简单的解决方案。
如果这不起作用,请查看此answer
此外,如果您需要能够快速更改各种任务和各种文件夹中的JVM版本,则可以使用此tool

wnvonmuf

wnvonmuf2#

有两个主要方面需要了解:

  1. Maven工具链插件使我们能够分离用于项目构建Maven插件执行运行时的JDK/JRE版本和用于编译和运行运行JUnit测试的surefire插件的JDK版本。
  2. Maven编译插件配置<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

...
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
  </configuration>
...

字符串
=>2.3.满足您的问题#1

不单独配置工具链存在风险

如果您使用JDK 11运行构建,而没有通过工具链定义单独的JDK 8,那么您编译的类将符合JDK 8,如果您将maven-compiler-plugin目标配置为1.8,
但是

  • 你编译你的代码与JDK 11 API(JDK的rt.jar)-这样你的代码甚至会被编译,如果它使用JAVA 11 API的,而这些API在JAVA 8上是不可用的,或者与JAVA 8相比已经被修改过。
    **=>**您的项目在JAVA 8运行时后期有失败的风险,未找到意外和可疑的类或方法缺失异常。
  • JUnit测试可能会以不同的方式结束,就好像它们在JAVA 8运行时中运行一样。

相关问题