【发布时间】:2021-12-31 10:29:43
【问题描述】:
我有一个使用大量反射的项目,还涉及“新”Java 功能,例如记录和密封类。我正在写这样的课程:
public class RecordHelper {
public static boolean isRecord(Class<?> type) {
return type.isRecord();
}
}
当然,这只适用于 Java 16 及更高版本,所以我正在尝试设置一个多版本 JAR 文件,默认实现如下:
public class RecordHelper {
public static boolean isRecord(Class<?> type) {
return false;
}
}
我已经能够使用 Maven 使用 this post on Baeldung 进行设置,而且效果很好。这很好,因为它不依赖于不同版本的单独配置文件,这使我的 pom 文件保持干净。
但现在我需要编写测试。
我希望能够在我想要支持的所有平台上运行测试套件,这意味着从 JDK 8 及更高版本开始的所有平台。 (我不介意在运行测试之前在不同的 JDK 上编译。)当然,在 JDK 16 及更高版本上,我还想测试与记录相关的东西(在 17 及更高版本上,密封类),这意味着我必须编译一些记录,这意味着我不可避免地会有一些在旧版 JDK 上无法运行的类文件。
在我看来,为测试提供类似多版本 JAR 文件之类的东西是有意义的,其中记录测试放置在 META-INF/versions 中的适当位置,但当然测试通常不打包在 JAR 中,所以这不起作用。
有没有办法让这个在单模块 Maven 项目中工作而不需要太多重复?
当然,随着 JDK 版本的上升,它必须“积累”测试类,例如在 JDK 8 上我只有“常规”测试类,在 JDK 16 上我有常规的和 java16 的,在 JDK 17 上我有常规的 java16 和 java17 的。我还没有找到一种方法在 Maven 中以简洁的方式表达这种事情,但我不是 Maven 专家。
还是我看错了方向,是否最好制作一个多模块 Maven 项目,将主要代码放在一个模块中,将测试放在另一个模块中,然后为测试生成一个多模块 jar也?如果是这样,我将如何在不同的 JDK 上运行这个 jar 文件?
【问题讨论】:
-
一个选项可能是有条件地运行 JUnit 测试?也参考 Baeldung :) junit-5-conditional-test-execution , junit-conditional-assume
-
@DirkDeyne 我考虑过,但是我为不同版本编译了类文件,所以如果我在 JDK 8 上运行测试,带有记录的类文件将导致 JVM 失败。 .
-
您可以检查 github.com/khmarbaise/mrelease 也可能是选项...使用单个 JDK 构建(JDK 17)产生多版本 jar...可以在适当的模块中进行测试(相关到 JDK)。这可以使用工具链来增强,以真正使用适当的 JDK 而不是单个 JDK...不,它不是单个模块解决方案,因为我认为应该将这些东西分开。跨度>