1 import org.gradle.api.artifacts.transform.*
2 import org.gradle.api.file.FileSystemLocation
3 import org.gradle.api.provider.Provider
4 import org.gradle.api.tasks.Input
5 import org.gradle.api.tasks.PathSensitive
6 import org.gradle.api.tasks.PathSensitivity
8 import java.io.FileInputStream
9 import java.io.FileOutputStream
10 import java.util.zip.ZipInputStream
11 import java.util.zip.ZipOutputStream
14 abstract class JarFileExcluder : TransformAction<JarFileExcluder.Parameters> {
15 interface Parameters : TransformParameters {
17 var excludeFilesByArtifact: Map<String, Set<String>>
20 @get:PathSensitive(PathSensitivity.NAME_ONLY)
22 abstract val inputArtifact: Provider<FileSystemLocation>
25 fun transform(outputs: TransformOutputs) {
26 val fileName = inputArtifact.get().asFile.name
27 for (entry in parameters.excludeFilesByArtifact) {
28 if (fileName.startsWith(entry.key)) {
29 val nameWithoutExtension = fileName.substring(0, fileName.lastIndexOf("."))
30 excludeFiles(inputArtifact.get().asFile, entry.value, outputs.file("${nameWithoutExtension}.jar"))
34 outputs.file(inputArtifact)
37 private fun excludeFiles(artifact: File, excludeFiles: Set<String>, jarFile: File) {
38 ZipInputStream(FileInputStream(artifact)).use { input ->
39 ZipOutputStream(FileOutputStream(jarFile)).use { output ->
40 var entry = input.nextEntry
41 while (entry != null) {
42 if (!excludeFiles.contains(entry.name)) {
43 output.putNextEntry(entry)
48 entry = input.nextEntry