added multi-release-jar plugin
This commit is contained in:
23
multi-release-jar/build.gradle.kts
Normal file
23
multi-release-jar/build.gradle.kts
Normal file
@@ -0,0 +1,23 @@
|
||||
plugins {
|
||||
`maven-publish`
|
||||
`groovy-gradle-plugin`
|
||||
id("com.gradle.plugin-publish")
|
||||
}
|
||||
|
||||
gradlePlugin {
|
||||
plugins {
|
||||
create("MultiVersionJarPlugin") {
|
||||
id = "net.woggioni.plugins.multi-version-jar"
|
||||
implementationClass = "net.woggioni.plugins.multi.release.jar.MultiVersionJarPlugin"
|
||||
}
|
||||
create("MultiReleaseJarPlugin") {
|
||||
id = "net.woggioni.plugins.multi-release-jar"
|
||||
implementationClass = "net.woggioni.plugins.multi.release.jar.MultiReleaseJarPlugin"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
@@ -0,0 +1,75 @@
|
||||
package net.woggioni.plugins.multi.release.jar
|
||||
|
||||
import org.gradle.api.JavaVersion
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.artifacts.Configuration
|
||||
import org.gradle.api.attributes.java.TargetJvmVersion
|
||||
import org.gradle.api.file.FileCollection
|
||||
import org.gradle.api.file.SourceDirectorySet
|
||||
import org.gradle.api.plugins.Convention
|
||||
import org.gradle.api.plugins.JavaBasePlugin
|
||||
import org.gradle.api.plugins.JavaPluginConvention
|
||||
import org.gradle.api.tasks.SourceSet
|
||||
import org.gradle.api.tasks.TaskProvider
|
||||
import org.gradle.api.tasks.compile.JavaCompile
|
||||
import org.gradle.internal.impldep.org.apache.commons.compress.compressors.z.ZCompressorInputStream
|
||||
import org.gradle.jvm.tasks.Jar
|
||||
|
||||
class MultiReleaseJarPlugin implements Plugin<Project> {
|
||||
@Override
|
||||
void apply(Project project) {
|
||||
project.pluginManager.apply(JavaBasePlugin)
|
||||
if(JavaVersion.current() > JavaVersion.VERSION_1_8) {
|
||||
SourceSet mainSourceSet = (project.sourceSets.main as SourceSet)
|
||||
JavaCompile compileJavaTask = project.tasks.named("compileJava", JavaCompile).get()
|
||||
compileJavaTask.configure {
|
||||
options.release.set(JavaVersion.VERSION_1_8.majorVersion.toInteger())
|
||||
}
|
||||
Jar jarTask = project.tasks.named("jar", Jar).get()
|
||||
jarTask.configure {
|
||||
manifest.attributes('Multi-Release': 'true')
|
||||
}
|
||||
ArrayList<FileCollection> compileOutputs = new ArrayList<>()
|
||||
compileOutputs << compileJavaTask.outputs.files
|
||||
ArrayList<FileCollection> sourcePaths = new ArrayList<>()
|
||||
sourcePaths << mainSourceSet.java.sourceDirectories
|
||||
Arrays.stream(JavaVersion.values()).filter {
|
||||
it > JavaVersion.VERSION_1_8 && it <= JavaVersion.current()
|
||||
}.forEach {javaVersion ->
|
||||
SourceDirectorySet sourceDirectorySet =
|
||||
project.objects.sourceDirectorySet("java${javaVersion.majorVersion}", javaVersion.toString())
|
||||
sourceDirectorySet.with {
|
||||
srcDir(new File(project.projectDir, "src/main/${sourceDirectorySet.name}"))
|
||||
destinationDirectory.set(new File(project.buildDir, "classes/${sourceDirectorySet.name}"))
|
||||
sourcePaths << sourceDirectories
|
||||
}
|
||||
TaskProvider<JavaCompile> compileTask = project.tasks.register("compileJava${javaVersion.majorVersion}", JavaCompile, {
|
||||
options.release.set(javaVersion.majorVersion.toInteger())
|
||||
classpath = compileOutputs.stream().reduce { fc1, fc2 -> fc1 + fc2 }.get()
|
||||
it.doFirst {
|
||||
options.compilerArgs << "--module-path" << mainSourceSet.compileClasspath.asPath
|
||||
}
|
||||
source = sourceDirectorySet
|
||||
destinationDirectory.set(sourceDirectorySet.destinationDirectory)
|
||||
options.annotationProcessorPath = mainSourceSet.annotationProcessorPath
|
||||
modularity.inferModulePath = false
|
||||
options.sourcepath = sourcePaths.stream().reduce { fc1, fc2 -> fc1 + fc2 }.get()
|
||||
})
|
||||
compileOutputs << compileJavaTask.outputs.files
|
||||
sourceDirectorySet.compiledBy(compileTask, { it.getDestinationDirectory()})
|
||||
jarTask.configure { Jar it ->
|
||||
from(compileTask.get().outputs.files) {
|
||||
into("META-INF/versions/${javaVersion.majorVersion}")
|
||||
}
|
||||
}
|
||||
}
|
||||
["apiElements", "runtimeElements"].forEach {String name ->
|
||||
Configuration conf = project.configurations.getByName(name)
|
||||
conf.attributes {
|
||||
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, compileJavaTask.options.release.get())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,79 @@
|
||||
package net.woggioni.plugins.multi.release.jar
|
||||
|
||||
import org.gradle.api.JavaVersion
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.artifacts.Configuration
|
||||
import org.gradle.api.attributes.java.TargetJvmVersion
|
||||
import org.gradle.api.file.RegularFileProperty
|
||||
import org.gradle.api.file.SourceDirectorySet
|
||||
import org.gradle.api.plugins.JavaBasePlugin
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.gradle.api.tasks.SourceSet
|
||||
import org.gradle.api.tasks.compile.JavaCompile
|
||||
import org.gradle.jvm.tasks.Jar
|
||||
|
||||
class MultiVersionJarPlugin implements Plugin<Project> {
|
||||
|
||||
@Override
|
||||
void apply(Project project) {
|
||||
project.apply(to: JavaBasePlugin)
|
||||
if(JavaVersion.current() > JavaVersion.VERSION_1_8) {
|
||||
SourceSet mainSourceSet = (project.sourceSets.main as SourceSet)
|
||||
SourceDirectorySet javaSet = mainSourceSet.java
|
||||
File java8ClassesDir = project.buildDir.toPath().resolve("classes/java8").toFile()
|
||||
File java11ClassesDir = project.buildDir.toPath().resolve("classes/java11").toFile()
|
||||
JavaCompile compileJava8Task = project.tasks.register("compileJava8", JavaCompile, {
|
||||
exclude("module-info.java")
|
||||
options.release = JavaVersion.VERSION_1_8.majorVersion.toInteger()
|
||||
classpath = mainSourceSet.compileClasspath
|
||||
source = javaSet
|
||||
destinationDirectory = java8ClassesDir
|
||||
options.annotationProcessorPath = mainSourceSet.annotationProcessorPath
|
||||
modularity.inferModulePath = false
|
||||
}).get()
|
||||
|
||||
JavaCompile compileModuleInfoTask = project.tasks.register("compileModuleInfo", JavaCompile, {
|
||||
include("module-info.java")
|
||||
options.release = JavaVersion.VERSION_11.majorVersion.toInteger()
|
||||
classpath = mainSourceSet.compileClasspath
|
||||
source = (project.sourceSets.main as SourceSet).java
|
||||
destinationDirectory = java11ClassesDir
|
||||
options.annotationProcessorPath = mainSourceSet.annotationProcessorPath
|
||||
modularity.inferModulePath = true
|
||||
}).get()
|
||||
|
||||
Provider<Jar> jarTaskProvider = project.tasks.named("jar", Jar)
|
||||
Provider<Jar> multiVersionJarTaskProvider = project.tasks.register("multiVersionJar", Jar) {
|
||||
Jar jarTask = jarTaskProvider.get()
|
||||
from(compileJava8Task.outputs.files)
|
||||
from(compileModuleInfoTask.outputs.files)
|
||||
archiveBaseName = jarTask.archiveBaseName
|
||||
destinationDirectory = jarTask.destinationDirectory
|
||||
archiveExtension = jarTask.archiveExtension
|
||||
manifest = jarTask.manifest
|
||||
}
|
||||
|
||||
jarTaskProvider.configure {
|
||||
actions = []
|
||||
Jar multiVersionJarTask = multiVersionJarTaskProvider.get()
|
||||
from(multiVersionJarTask.outputs.files)
|
||||
(it.archiveFile as RegularFileProperty).set(multiVersionJarTask.archiveFile)
|
||||
}
|
||||
["apiElements", "runtimeElements"].forEach {String name ->
|
||||
Configuration conf = project.configurations.getByName(name)
|
||||
conf.attributes {
|
||||
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 8)
|
||||
}
|
||||
}
|
||||
}
|
||||
project.tasks.named("compileJava", JavaCompile) {
|
||||
if(JavaVersion.current() > JavaVersion.VERSION_1_8) {
|
||||
modularity.inferModulePath = true
|
||||
} else {
|
||||
exclude("module-info.java")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user