Skip to content

Commit

Permalink
Defer configurations and cleanups (#973)
Browse files Browse the repository at this point in the history
  • Loading branch information
Goooler authored Sep 18, 2024
1 parent ceb119e commit 0c0eaac
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class ShadowApplicationPlugin implements Plugin<Project> {
jar.configure { jar ->
jar.inputs.property('mainClassName', classNameProvider)
jar.doFirst {
manifest.attributes 'Main-Class': classNameProvider.get()
jar.manifest.attributes 'Main-Class': classNameProvider.get()
}
}
}
Expand Down Expand Up @@ -126,7 +126,7 @@ class ShadowApplicationPlugin implements Plugin<Project> {
}
into("bin") {
from(startScripts)
filePermissions { unix(493) }
filePermissions { it.unix(493) }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class ShadowBasePlugin implements Plugin<Project> {

public static final String EXTENSION_NAME = 'shadow'
public static final String CONFIGURATION_NAME = 'shadow'
public static final String COMPONENT_NAME = 'shadow'

@Override
void apply(Project project) {
Expand All @@ -21,7 +22,7 @@ class ShadowBasePlugin implements Plugin<Project> {

project.tasks.register(KnowsTask.NAME, KnowsTask) { knows ->
knows.group = ShadowJavaPlugin.SHADOW_GROUP
knows.description = DESC
knows.description = KnowsTask.DESC
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@ package com.github.jengelman.gradle.plugins.shadow
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.attributes.Bundling
import org.gradle.api.attributes.Category
import org.gradle.api.attributes.LibraryElements
import org.gradle.api.attributes.Usage
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.component.AdhocComponentWithVariants
import org.gradle.api.component.SoftwareComponentFactory
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.api.tasks.TaskProvider
import org.gradle.jvm.tasks.Jar
import org.gradle.plugin.devel.plugins.JavaGradlePluginPlugin

import javax.inject.Inject
Expand All @@ -19,6 +22,7 @@ class ShadowJavaPlugin implements Plugin<Project> {

public static final String SHADOW_JAR_TASK_NAME = 'shadowJar'
public static final String SHADOW_GROUP = 'Shadow'
public static final String SHADOW_RUNTIME_ELEMENTS_CONFIGURATION_NAME = 'shadowRuntimeElements'

private final SoftwareComponentFactory softwareComponentFactory

Expand All @@ -29,35 +33,35 @@ class ShadowJavaPlugin implements Plugin<Project> {

@Override
void apply(Project project) {
configureShadowTask(project)
def shadowConfiguration = project.configurations.getByName(ShadowBasePlugin.CONFIGURATION_NAME)
def shadowTaskProvider = configureShadowTask(project, shadowConfiguration)

project.configurations.compileClasspath.extendsFrom project.configurations.shadow
project.configurations.named(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME) {
it.extendsFrom(shadowConfiguration)
}

project.configurations {
shadowRuntimeElements {
canBeConsumed = true
canBeResolved = false
attributes {
it.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage, Usage.JAVA_RUNTIME))
it.attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category, Category.LIBRARY))
it.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements, LibraryElements.JAR))
it.attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling, Bundling.SHADOWED))
}
outgoing.artifact(project.tasks.named(SHADOW_JAR_TASK_NAME))
def shadowRuntimeElements = project.configurations.create(SHADOW_RUNTIME_ELEMENTS_CONFIGURATION_NAME) { Configuration it ->
it.extendsFrom(shadowConfiguration)
it.canBeConsumed = true
it.canBeResolved = false
it.attributes {
it.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage, Usage.JAVA_RUNTIME))
it.attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category, Category.LIBRARY))
it.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements, LibraryElements.JAR))
it.attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling, Bundling.SHADOWED))
}
it.outgoing.artifact(shadowTaskProvider)
}

project.configurations.shadowRuntimeElements.extendsFrom project.configurations.shadow

project.components.java {
addVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
mapToOptional() // make it a Maven optional dependency
project.components.named("java", AdhocComponentWithVariants) {
it.addVariantsFromConfiguration(shadowRuntimeElements) {
it.mapToOptional()
}
}

AdhocComponentWithVariants shadow = softwareComponentFactory.adhoc("shadow")
project.components.add(shadow)
shadow.addVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
AdhocComponentWithVariants shadowComponent = softwareComponentFactory.adhoc(ShadowBasePlugin.COMPONENT_NAME)
project.components.add(shadowComponent)
shadowComponent.addVariantsFromConfiguration(shadowRuntimeElements) {
it.mapToMavenScope("runtime")
}

Expand All @@ -75,29 +79,30 @@ class ShadowJavaPlugin implements Plugin<Project> {
}
}

protected static void configureShadowTask(Project project) {
protected static TaskProvider<ShadowJar> configureShadowTask(Project project, Configuration shadowConfiguration) {
SourceSetContainer sourceSets = project.extensions.getByType(SourceSetContainer)
project.tasks.register(SHADOW_JAR_TASK_NAME, ShadowJar) { shadow ->
def jarTask = project.tasks.named(JavaPlugin.JAR_TASK_NAME, Jar)
def taskProvider = project.tasks.register(SHADOW_JAR_TASK_NAME, ShadowJar) { shadow ->
shadow.group = SHADOW_GROUP
shadow.description = 'Create a combined JAR of project and runtime dependencies'
shadow.archiveClassifier.set("all")
shadow.manifest.inheritFrom(project.tasks.jar.manifest)
def libsProvider = project.provider { -> [project.tasks.jar.manifest.attributes.get('Class-Path')] }
def files = project.objects.fileCollection().from { ->
project.configurations.findByName(ShadowBasePlugin.CONFIGURATION_NAME)
}
shadow.manifest.inheritFrom(jarTask.get().manifest)
def attrProvider = jarTask.map { it.manifest.attributes.get('Class-Path') }
def files = project.objects.fileCollection().from(shadowConfiguration)
shadow.doFirst {
if (!files.empty) {
def libs = libsProvider.get()
libs.addAll files.collect { "${it.name}" }
manifest.attributes 'Class-Path': libs.findAll { it }.join(' ')
def attrs = [attrProvider.getOrElse('')] + files.collect { it.name }
shadow.manifest.attributes 'Class-Path': attrs.join(' ').trim()
}
}
shadow.from(sourceSets.main.output)
shadow.configurations = [project.configurations.findByName('runtimeClasspath') ?
project.configurations.runtimeClasspath : project.configurations.runtime]
shadow.configurations = [
project.configurations.findByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME) ?:
project.configurations.runtime,
]
shadow.exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'module-info.class')
}
project.artifacts.add(ShadowBasePlugin.CONFIGURATION_NAME, project.tasks.named(SHADOW_JAR_TASK_NAME))
project.artifacts.add(shadowConfiguration.name, taskProvider)
return taskProvider
}
}

0 comments on commit 0c0eaac

Please sign in to comment.