首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一等级项目中不同Java版本的代码

同一等级项目中不同Java版本的代码
EN

Stack Overflow用户
提问于 2022-07-25 13:42:35
回答 1查看 76关注 0票数 0

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

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

还应该有可能以完全相同的方式将项目导入到其他项目中,并且只有当项目的Java 17部分单独使用Java 17时,才能使用它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-25 13:42:44

多释放罐可用于此。多版本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时,Java17构建输出将被移动到META-INF/versions/16,使其仅适用于16+。

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

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73110247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档