如何在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-55和hibernate-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-5 、hibernate-types-43 、hibernate-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/java 和src/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 配置选项。