diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index 8ee2d9f1..0d6d8b1c 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -1,3 +1,5 @@ +import java.util.jar.JarFile + plugins { `java-library` `maven-publish` @@ -7,6 +9,9 @@ plugins { group = "com.knuddels" version = "1.2.0-SNAPSHOT" +val moduleName = "com.knuddels.jtokkit" +val java9 = sourceSets.create("java9") + repositories { mavenCentral() } @@ -17,20 +22,70 @@ java { } tasks.withType { - val javaVersion = if (name == "compileTestJava") 21 else 8 + val javaVersion = when (name) { + java9.compileJavaTaskName, "compileTestJava" -> 21 + else -> 8 + } javaCompiler = javaToolchains.compilerFor { languageVersion = JavaLanguageVersion.of(javaVersion) } } +tasks.named(java9.compileJavaTaskName) { + classpath = files() + destinationDirectory = layout.buildDirectory.dir("classes/java/moduleInfo") + options.release = 9 + options.compilerArgs.addAll( + listOf( + "--patch-module", + "$moduleName=${sourceSets.main.get().output.asPath}" + ) + ) + dependsOn(tasks.named(sourceSets.main.get().classesTaskName)) +} + dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api:5.11.1") testImplementation("org.junit.jupiter:junit-jupiter-params:5.11.1") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.11.1") } + tasks.getByName("test") { useJUnitPlatform() maxParallelForks = 4 } +tasks.named("jar") { + manifest.attributes["Multi-Release"] = "true" + into("META-INF/versions/9") { + from(tasks.named(java9.compileJavaTaskName)) { + include("module-info.class") + } + } +} + +tasks.named("sourcesJar") { + from(java9.allSource) +} + +val verifyMultiReleaseJar by tasks.registering { + dependsOn(tasks.named("jar")) + + doLast { + val jarFile = tasks.named("jar").get().archiveFile.get().asFile + JarFile(jarFile).use { artifact -> + check(artifact.manifest.mainAttributes.getValue("Multi-Release") == "true") { + "Expected ${jarFile.name} to be marked as a multi-release JAR." + } + check(artifact.getEntry("META-INF/versions/9/module-info.class") != null) { + "Expected ${jarFile.name} to contain META-INF/versions/9/module-info.class." + } + } + } +} + +tasks.named("check") { + dependsOn(verifyMultiReleaseJar) +} + publishing { repositories { maven { diff --git a/lib/src/java9/java/module-info.java b/lib/src/java9/java/module-info.java new file mode 100644 index 00000000..0d6e8395 --- /dev/null +++ b/lib/src/java9/java/module-info.java @@ -0,0 +1,4 @@ +module com.knuddels.jtokkit { + exports com.knuddels.jtokkit; + exports com.knuddels.jtokkit.api; +}