blob: 4beeab2143740a87d7de4ce178675be1e6c8619f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
package org.jetbrains.conventions
import org.gradle.kotlin.dsl.support.serviceOf
/**
* Utility for downloading and installing a Maven binary.
*
* Provides the `setupMavenProperties` extension that contains the default versions and locations
* of the Maven binary.
*
* The task [installMavenBinary] will download and unzip the Maven bianry.
*/
plugins {
base
}
abstract class MavenCliSetupExtension {
abstract val mavenVersion: Property<String>
abstract val mavenPluginToolsVersion: Property<String>
abstract val mavenBuildDir: DirectoryProperty
/** Directory that will contain the unpacked Apache Maven dependency */
abstract val mavenInstallDir: DirectoryProperty
/**
* Path to the Maven executable.
*
* This should be different per OS:
*
* * Windows: `$mavenInstallDir/bin/mvn.cmd`
* * Unix: `$mavenInstallDir/bin/mvn`
*/
abstract val mvn: RegularFileProperty
}
val mavenCliSetupExtension =
extensions.create("mavenCliSetup", MavenCliSetupExtension::class).apply {
mavenVersion.convention(libs.versions.apache.maven)
mavenPluginToolsVersion.convention(libs.versions.apache.mavenPluginTools)
mavenBuildDir.convention(layout.buildDirectory.dir("maven"))
mavenInstallDir.convention(layout.buildDirectory.dir("apache-maven"))
val isWindowsProvider =
providers.systemProperty("os.name").map { "win" in it.toLowerCase() }
mvn.convention(
providers.zip(mavenInstallDir, isWindowsProvider) { mavenInstallDir, isWindows ->
mavenInstallDir.file(
when {
isWindows -> "bin/mvn.cmd"
else -> "bin/mvn"
}
)
}
)
}
val mavenBinary by configurations.registering {
description = "used to download the Maven binary"
isCanBeResolved = true
isCanBeConsumed = false
isVisible = false
defaultDependencies {
addLater(mavenCliSetupExtension.mavenVersion.map { mavenVersion ->
project.dependencies.create(
group = "org.apache.maven",
name = "apache-maven",
version = mavenVersion,
classifier = "bin",
ext = "zip"
)
})
}
}
tasks.clean {
delete(mavenCliSetupExtension.mavenBuildDir)
delete(mavenCliSetupExtension.mavenInstallDir)
}
val installMavenBinary by tasks.registering(Sync::class) {
val archives = serviceOf<ArchiveOperations>()
from(
mavenBinary.flatMap { conf ->
@Suppress("UnstableApiUsage")
val resolvedArtifacts = conf.incoming.artifacts.resolvedArtifacts
resolvedArtifacts.map { artifacts ->
artifacts.map { archives.zipTree(it.file) }
}
}
) {
eachFile {
// drop the first directory inside the zipped Maven bin (apache-maven-$version)
relativePath = RelativePath(true, *relativePath.segments.drop(1).toTypedArray())
}
includeEmptyDirs = false
}
into(mavenCliSetupExtension.mavenInstallDir)
}
|