1+ plugins {
2+ java
3+ `maven- publish`
4+ id(" com.gradleup.shadow" )
5+ }
6+
7+ interface SourcesFatJarExtension {
8+ val relocates: ListProperty <String >
9+ val postSources: Property < (String ) -> String >
10+ }
11+
12+ val extension = project.extensions.create<SourcesFatJarExtension >(" sourcesFatJar" )
13+ extension.postSources.convention { it }
14+
15+ val sourcesFatJar = tasks.register(" sourcesFatJar" , Jar ::class ) {
16+ dependsOn(tasks.classes)
17+ group = " build"
18+ archiveClassifier.value(" sources" )
19+
20+ val tmpDir = temporaryDir
21+ tmpDir.deleteRecursively()
22+
23+ val result = dependencies.createArtifactResolutionQuery()
24+ .forComponents(configurations.runtimeClasspath.get().incoming.resolutionResult.allDependencies.filter {
25+ ! it.from.id.displayName.startsWith(" org.jetbrains.kotlin:kotlin-stdlib" )
26+ }.map { it.from.id }).withArtifacts(JvmLibrary ::class .java, SourcesArtifact ::class .java).execute()
27+ val replace = { str: String ->
28+ val destPrefix = " io.github.rothes.${rootProject.name.lowercase()} .lib."
29+ fun String.relocate (s : String ) = replace(s, destPrefix + s)
30+ var res = str
31+ extension.relocates.get().forEach { res = res.relocate(it) }
32+ extension.postSources.get().invoke(res)
33+ }
34+ for (component in result.resolvedComponents) {
35+ component.getArtifacts(SourcesArtifact ::class .java).forEach {
36+ if (it is ResolvedArtifactResult ) {
37+ zipTree(it.file.absolutePath).visit {
38+ if (path.startsWith(" META-INF" ) || file.isDirectory) return @visit
39+ val tmp = tmpDir.resolve(path)
40+ tmp.parentFile.mkdirs()
41+ tmp.writeText(replace(file.readText()))
42+ from(tmp) {
43+ duplicatesStrategy = DuplicatesStrategy .WARN
44+ into(
45+ " io/github/rothes/${rootProject.name.lowercase()} /lib/" + path.substringBeforeLast(
46+ " /"
47+ )
48+ )
49+ }
50+ }
51+ }
52+ }
53+ }
54+ }
55+
56+ publishing {
57+ repositories {
58+ mavenLocal()
59+ }
60+ publications {
61+ create<MavenPublication >(" mavenJar" ) {
62+ from(components[" shadow" ])
63+
64+ artifact(sourcesFatJar) {
65+ classifier = " sources"
66+ }
67+
68+ artifactId = project.name
69+ groupId = project.group as String?
70+ version = project.version as String?
71+ }
72+ }
73+ }
74+
75+ tasks.shadowJar {
76+ doFirst { // Wait for configuration
77+ val pkg = " io.github.rothes.${rootProject.name.lowercase()} .lib"
78+ fun relocate (pattern : String ) {
79+ relocate(pattern, " $pkg .$pattern " )
80+ }
81+
82+ extension.relocates.get().forEach { relocate(it) }
83+
84+ mergeServiceFiles()
85+ }
86+
87+ dependsOn(sourcesFatJar)
88+ }
0 commit comments