是否有可能以一种方式创建一个Gradle项目,以便主要部分可以与一个Java版本(例如Java 11)一起使用,而有些部分则依赖于更高的Java版本(例如Java 17),并且只能被Java 17的客户端使用?
应该可以在Java-17-部件中使用为Java17编译的依赖项。项目中为Java 11编译的部分也应该可以从Java 17代码中使用。
还应该有可能以完全相同的方式将项目导入到其他项目中,并且只有当项目的Java 17部分单独使用Java 17时,才能使用它们。
发布于 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可能如下所示:
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
}https://stackoverflow.com/questions/73110247
复制相似问题