diff --git a/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowExtension.groovy b/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowExtension.groovy index 865b3a3e1..03a575d54 100644 --- a/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowExtension.groovy +++ b/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowExtension.groovy @@ -5,16 +5,20 @@ import org.gradle.api.Project import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.artifacts.SelfResolvingDependency import org.gradle.api.file.RegularFile +import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.publish.maven.MavenPom import org.gradle.api.publish.maven.MavenPublication class ShadowExtension { - private final Provider> archiveFile + private final Provider archive private final Provider> allDependencies ShadowExtension(Project project) { - archiveFile = project.provider { project.tasks.withType(ShadowJar).getByName("shadowJar").archiveFile } + archive = project.provider { + def archiveTask = project.tasks.withType(ShadowJar).getByName("shadowJar") + new Archive(archiveTask.archiveFile, archiveTask.archiveClassifier) + } allDependencies = project.provider { project.configurations.getByName("shadow").allDependencies.collect { if ((it instanceof ProjectDependency) || !(it instanceof SelfResolvingDependency)) { @@ -25,7 +29,10 @@ class ShadowExtension { } void component(MavenPublication publication) { - publication.artifact(archiveFile.get()) + publication.artifact([ + source : archive.get().file, + classifier: archive.get().classifier.get() + ]) // Don't inline this variable, it seems Groovy closure capturing is confused by the field instead of a local variable. final def allDeps = allDependencies @@ -43,6 +50,16 @@ class ShadowExtension { } } + private class Archive { + Provider file + Property classifier + + Archive(Provider file, Property classifier) { + this.file = file + this.classifier = classifier + } + } + private class Dep { String group String name diff --git a/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/PublishingSpec.groovy b/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/PublishingSpec.groovy index 3fb11411d..5ad14b19d 100644 --- a/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/PublishingSpec.groovy +++ b/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/PublishingSpec.groovy @@ -78,6 +78,54 @@ class PublishingSpec extends PluginSpecification { assert dependency.version.text() == '1.0' } + def "publish shadow jar with maven-publish plugin using custom classifier and extension"() { + given: + repo.module('shadow', 'a', '1.0') + .insertFile('a.properties', 'a') + .insertFile('a2.properties', 'a2') + .publish() + repo.module('shadow', 'b', '1.0') + .insertFile('b.properties', 'b') + .publish() + + settingsFile << "rootProject.name = 'maven'" + buildFile << """ + apply plugin: 'maven-publish' + + dependencies { + implementation 'shadow:a:1.0' + shadow 'shadow:b:1.0' + } + + shadowJar { + archiveClassifier = 'my-classifier' + archiveExtension = 'my-ext' + archiveBaseName = 'maven-all' + } + + publishing { + publications { + shadow(MavenPublication) { publication -> + project.shadow.component(publication) + artifactId = 'maven-all' + } + } + repositories { + maven { + url "${publishingRepo.uri}" + } + } + } + """.stripIndent() + + when: + run('publish') + + then: + File publishedFile = publishingRepo.rootDir.file('shadow/maven-all/1.0/maven-all-1.0-my-classifier.my-ext').canonicalFile + assert publishedFile.exists() + } + def "publish multiproject shadow jar with maven-publish plugin"() { given: