【问题标题】:Code for different Java versions in same Gradle Project同一 Gradle 项目中不同 Java 版本的代码
【发布时间】:2022-07-25 21:42:44
【问题描述】:

是否可以以某种方式创建 Gradle 项目,以便主要部分可以与一个 Java 版本(例如 Java 11)一起使用,而某些部分依赖于更高的 Java 版本(例如 Java 17)并且只能使用使用 Java 17 的客户端?

应该可以在 Java-17-parts 中使用为 Java 17 编译的依赖项。 为 Java 11 编译的项目部分也应该可以从 Java 17 代码中使用。

也应该可以以完全相同的方式将项目导入其他项目,并仅在他们自己使用 Java 17 时才使用项目的 Java 17 部分。

【问题讨论】:

  • 关于自我回答的注意事项:最近有人问我这个问题,我认为如果我把它放在这里可能会对其他人有所帮助。

标签: java gradle gradle-kotlin-dsl multi-release-jar


【解决方案1】:

Multi-Release JARs 可以用于此。 Multi-Release JAR 允许创建仅在特定 Java 版本中加载的类。

您可以通过为 Java 17 指定一个源集并为 Java 11 保留主要源集来做到这一点。 您使 Java 17 源集使用能够访问 Java 11 代码。

此外,您指定一个任务来编译具有自定义源和目标兼容性以及 Java 17 源集的 Java 17 代码。

普通(Java 11)源代码转到src/main/java,Java 17 源代码转到src/java17/java

创建 JAR 时,Java 17 构建输出被移动到 META-INF/versions/16,使其仅适用于 Java 16+。

使用 Kotlin DSL,您的 build.gradle.kts 可能如下所示:

plugins {
    id("java")
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    //Java 11 dependencies here (available for all code)
}
tasks {
    jar {//configure JAR creation
        dependsOn("compileJava17")//requires Java 17 code to be built
        into("META-INF/versions/17") {//move Java 17 code into META-INF/versions/17
            from(sourceSets["java17"].output)//take it from Java 17 output folder
        }
        manifest {
            attributes("Multi-Release" to "true")//configure it to be recognized as a Multi-Release JAR
        }
    }

}
sourceSets.create("java17") {//create Java 17 source set
    this.java.srcDir("src/java17/java")//where to put sources
    dependencies {
        //Java 17 dependencies here (only available for Java 17 code)
    }
    //include Java 11 source code (make it accessible from Java 17)
    compileClasspath += sourceSets["main"].output
    runtimeClasspath += sourceSets["main"].output
}
java {
    //configure project to use Java 11
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
    sourceSets["main"]//use main source set
}
task<JavaCompile>("compileJava17") {//create task for Java 17
    dependsOn("compileJava")//requires normal Java compilation to be finished
    //set source and target compatibility
    sourceCompatibility = JavaVersion.VERSION_17.name
    targetCompatibility = JavaVersion.VERSION_17.name
    sourceSets["java17"]//use Java 17 source set
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 2023-03-05
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    相关资源
    最近更新 更多