Java Gradle:对构建和测试使用不同的jre

Java Gradle:对构建和测试使用不同的jre,java,gradle,Java,Gradle,这是我的情况,我有一个java项目和一些单元测试 我的单元测试请求Java1.8,因为它们使用Stream和Arguments.of 我的java源代码需要使用java 1.7构建,因为它们要在Matlab中导入,不幸的是,Matlab不理解java 1.8 我是否有一个解决方案可以让这两个功能协同工作?您应该能够使用JDK 8构建项目并设置不同的兼容性级别。根据,您可以尝试将以下内容添加到build.gradle: plugins { id 'java' } compileJava {

这是我的情况,我有一个java项目和一些单元测试

我的单元测试请求Java1.8,因为它们使用Stream和Arguments.of

我的java源代码需要使用java 1.7构建,因为它们要在Matlab中导入,不幸的是,Matlab不理解java 1.8


我是否有一个解决方案可以让这两个功能协同工作?

您应该能够使用JDK 8构建项目并设置不同的兼容性级别。根据,您可以尝试将以下内容添加到
build.gradle

plugins {
  id 'java'
}

compileJava {
  sourceCompatibility = JavaVersion.VERSION_1_7
  targetCompatibility = JavaVersion.VERSION_1_7
}

compileTestJava {
  sourceCompatibility = JavaVersion.VERSION_1_8
  targetCompatibility = JavaVersion.VERSION_1_8
}     

Java努力保持向后兼容性。只要您不会遇到JDK 8中已修复但JDK 7中仍存在的错误,您就应该没事。

编译时需要指定
目标兼容性。这通常是在Gradle构建文件的根级别指定的,但由于您希望测试代码是不同的版本,因此需要为
compileJava
任务显式指定它

您还应该指定Java 7运行时库,因此假设您使用Java 8运行Gradle,您的构建文件如下所示:

apply plugin: 'java'

// options used by all compile tasks unless overridden, e.g. used by compileTestJava
sourceCompatibility = 1.8
targetCompatibility = 1.8

compileJava {
    // override global options just for this task
    sourceCompatibility = 1.7
    targetCompatibility = 1.7
    options.bootClasspath = 'path/to/java7/lib/rt.jar'
}

// and all your other stuff

由于Gradle 6.7,有可能使用java工具链设置java版本-

我不确定这是否可行?如果您使用的是Java8特性,那么就不能用Java7Java构建它。Java8特性只在单元测试中使用。这基本上是使用@methodsource使用各种参数多次调用同一测试。该产品本身与1.7完全兼容。一个解决方案是将我的测试放在一个单独的项目中,但这很糟糕。另一个解决方案是在单元测试中不使用Java8功能。这将使参数集更加复杂和笨拙。