如何在Maven中为main和test使用不同的Java版本

546 阅读3分钟

如何在Maven中为main和test使用不同的Java版本

想象一下,有一种工具可以自动检测JPA和Hibernate的性能问题。这不是很好吗?

好吧,Hypersistence Optimizer就是这样的工具!而且它可以与Spring Boot、Spring Framework、Jakarta EE、Java EE、Quarkus或Play Framework一起使用。

因此,请享受将你的时间花在你喜欢的事情上,而不是在周六晚上修复你的生产系统的性能问题

简介

本文将介绍如何在Maven的主文件夹和测试文件夹中使用不同的Java版本,以便在较新版本的Java上运行测试。

为什么要在Maven项目中使用不同的Java版本?

如果您开发的是一个最终用户项目,那么您很可能只需要一个版本的Java。然而,对于框架和库来说,情况就大不相同了。

例如,Hibernate Types项目模块是使用相关Hibernate版本所要求的最低可能的Java版本构建的。

  • hibernate-types-60 模块的目标是 Hibernate 6,因此需要使用 Java 11 进行编译。
  • hibernate-types-55hibernate-types-52 模块的目标是 Hibernate 5.2 到 5.6 版本,这些模块使用 Java 8。
  • hibernate-types-5,hibernate-types-43, 和hibernate-types-4 模块是使用Java 6构建的,就像相关的Hibernate版本比5.1老。

而这还不是全部。

hibernate-types-60 ,提供了惊人的 HibernateRepository它修复了默认的Spring DataJpaRepository 所提供的反模式,因此需要用Spring 6进行测试。

然而,Spring 6是使用Java 17构建的,所以测试需要使用Java 17,而不是Java 11,否则,测试类甚至无法编译。

而且这个问题不仅限于hibernate-types-60 模块。因为旧的JDBC驱动不再适用于现在Docker上使用Testcontainers的较新的数据库,即使是hibernate-types-5hibernate-types-43hibernate-types-4 等模块也需要使用Java 8进行测试,而它们是使用Java 6构建的。

这就是从事针对各种Hibernate版本的OSS库的好处。

使用Maven工具链支持多个Java版本

第一步是设置Maven工具链。

Maven工具链允许你在操作系统上安装多个版本的Java,并配置Maven项目以挑选特定的Java版本。

为此,你需要在pom.xml 文件中添加maven-toolchains-plugin ,像这样。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-toolchains-plugin</artifactId>
    <version>${maven-toolchains-plugin.version}</version>
    <executions>
        <execution>
            <goals>
                <goal>toolchain</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <toolchains>
            <jdk>
                <version>${jdk-test.version}</version>
            </jdk>
        </toolchains>
    </configuration>
</plugin>

jdk-test.version 引用了我们要用来测试的Java版本。

关于使用Maven工具链的更多细节。

在Hibernate 6的主文件夹和测试Maven文件夹中使用不同的Java版本

现在,对于hibernate-types-60 模块,我们要使用maven-compiler-plugin ,以区分用于编译src/main/javasrc/test/java 文件夹中的类的Java版本。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${maven-compiler-plugin.version}</version>
    <configuration>
        <release>${jdk.version}</release>
        <testRelease>${jdk-test.version}</testRelease>
    </configuration>
</plugin>

而对于Hibernate 6模块,我们使用以下JDK版本。

<jdk.version>11</jdk.version>
<jdk-test.version>17</jdk-test.version>

Java 11用于编译src/main/java 中的类,而src/test/java 中的测试类则使用Java 17编译和运行。

在Hibernate 4的主文件夹和测试Maven文件夹中使用不同的Java版本

hibernate-types-5,hibernate-types-43, 和hibernate-types-4 使用Java 6构建,但使用Java 8测试。

因此,maven-compiler-plugin 中的老模块看起来是这样的。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${maven-compiler-plugin.version}</version>
    <configuration>
        <source>${jdk.version}</source>
        <target>${jdk.version}</target>
        <testSource>${jdk-test.version}</testSource>
        <testTarget>${jdk-test.version}</testTarget>
        <showDeprecation>true</showDeprecation>
        <showWarnings>true</showWarnings>
    </configuration>
</plugin>

而这些是我们为这些模块使用的JDK版本。

<jdk.version>6</jdk.version>
<jdk-test.version>8</jdk-test.version>

总结

我从2008年开始使用Maven,你可以很容易地定制各种非标准的配置选项,这很令人惊讶。

在Maven中为主文件夹和测试文件夹使用不同的Java版本其实很容易,这要感谢Toolchains和maven-compiler-plugin 配置选项。