shadow icon indicating copy to clipboard operation
shadow copied to clipboard

ShadowJar not working with newer 'implementation' configuration

Open connect2manu opened this issue 6 years ago • 22 comments

shadowJar task doesn't works when using dependencies with newer 'api' or 'implementation' or 'testImplementation' configurations instead of 'compile' or 'testCompile' configuration.

for e.g:

shadowJar task is ineffective when using dependencies like:

dependencies { **implementation** 'org.apache.commons:commons-lang3:3.5' }

instead of:

dependencies { **compile** 'org.apache.commons:commons-lang3:3.5' }

Shadow Version

2+

Gradle Version

4.3+

Expected Behavior

Fat jar should be generated upon execution of shadowJar task

Actual Behavior

Fat jar not getting generated upon execution of shadowJar task

Gradle Build Script(s)

One sample snippet provided above and using following shadow task

shadowJar { classifier = '' baseName = artifactId destinationDir = file("${buildDir}/dist") manifest { attributes 'Implementation-Title': title, 'Implementation-Version': version, 'Main-Class': mainClassName } zip64 true } Note: variable are defined under gradle.properties

connect2manu avatar Jan 11 '19 03:01 connect2manu

We are using Gradle 5.0 and having the same issue.

timpharo avatar Jan 11 '19 09:01 timpharo

Does it work if you tell it which configurations to use?

shadowJar {
    configurations = [project.configurations.implementation]
}

mig4 avatar Jan 18 '19 11:01 mig4

@mig4 Unfortunately this throws an IllegalStateException. Please see the full stacktrace below

> Resolving configuration 'implementation' directly is not allowed

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.internal.tasks.TaskDependencyResolveException: Could not determine the dependencies of task ':copy-data:shadowJar'.
        at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.getDependencies(CachingTaskDependencyResolveContext.java:68)
        at org.gradle.execution.plan.TaskDependencyResolver.resolveDependenciesFor(TaskDependencyResolver.java:46)
        at org.gradle.execution.plan.LocalTaskNode.getDependencies(LocalTaskNode.java:106)
        at org.gradle.execution.plan.LocalTaskNode.resolveDependencies(LocalTaskNode.java:79)
        at org.gradle.execution.plan.DefaultExecutionPlan.addEntryTasks(DefaultExecutionPlan.java:167)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.addEntryTasks(DefaultTaskExecutionGraph.java:139)
        at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:48)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:57)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$200(DefaultBuildConfigurationActionExecuter.java:26)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter$2.proceed(DefaultBuildConfigurationActionExecuter.java:63)
        at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:57)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$200(DefaultBuildConfigurationActionExecuter.java:26)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter$2.proceed(DefaultBuildConfigurationActionExecuter.java:63)
        at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:57)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$200(DefaultBuildConfigurationActionExecuter.java:26)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.run(DefaultBuildConfigurationActionExecuter.java:43)
        at org.gradle.internal.Factories$1.create(Factories.java:25)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry.withLenientState(DefaultProjectStateRegistry.java:132)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry.withLenientState(DefaultProjectStateRegistry.java:124)
        at org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:39)
        at org.gradle.initialization.DefaultGradleLauncher$CalculateTaskGraph.run(DefaultGradleLauncher.java:333)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.initialization.DefaultGradleLauncher.constructTaskGraph(DefaultGradleLauncher.java:218)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:155)
        at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:134)
        at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:58)
        at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:55)
        at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:82)
        at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:75)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:183)
        at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
        at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:75)
        at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:55)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:58)
        at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
        at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:39)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:49)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:46)
        at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:78)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:46)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36)
        at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68)
        at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.IllegalStateException: Resolving configuration 'implementation' directly is not allowed
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.assertIsResolvable(DefaultConfiguration.java:1198)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:529)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:524)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getResolvedConfiguration(Unknown Source)
        at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.getProperty(BeanDynamicObject.java:228)
        at org.gradle.internal.metaobject.BeanDynamicObject.tryGetProperty(BeanDynamicObject.java:171)
        at org.gradle.internal.metaobject.CompositeDynamicObject.tryGetProperty(CompositeDynamicObject.java:55)
        at org.gradle.internal.metaobject.AbstractDynamicObject.getProperty(AbstractDynamicObject.java:59)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getProperty(Unknown Source)
        at com.github.jengelman.gradle.plugins.shadow.internal.DefaultDependencyFilter.resolve(DefaultDependencyFilter.groovy:28)
        at com.github.jengelman.gradle.plugins.shadow.internal.DefaultDependencyFilter$_resolve_closure2.doCall(DefaultDependencyFilter.groovy:36)
        at com.github.jengelman.gradle.plugins.shadow.internal.DefaultDependencyFilter.resolve(DefaultDependencyFilter.groovy:35)
        at com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar$1.call(ShadowJar.java:106)
        at com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar$1.call(ShadowJar.java:102)
        at org.gradle.util.GUtil.uncheckedCall(GUtil.java:459)
        at org.gradle.api.internal.file.collections.BuildDependenciesOnlyFileCollectionResolveContext.add(BuildDependenciesOnlyFileCollectionResolveContext.java:64)
        at org.gradle.api.internal.file.collections.BuildDependenciesOnlyFileCollectionResolveContext.add(BuildDependenciesOnlyFileCollectionResolveContext.java:72)
        at org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection.visitContents(DefaultConfigurableFileCollection.java:116)
        at org.gradle.api.internal.file.CompositeFileCollection.visitDependencies(CompositeFileCollection.java:186)
        at org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection.visitDependencies(DefaultConfigurableFileCollection.java:122)
        at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext$TaskGraphImpl.getNodeValues(CachingTaskDependencyResolveContext.java:106)
        at org.gradle.internal.graph.CachingDirectedGraphWalker$GraphWithEmpyEdges.getNodeValues(CachingDirectedGraphWalker.java:211)
        at org.gradle.internal.graph.CachingDirectedGraphWalker.doSearch(CachingDirectedGraphWalker.java:121)
        at org.gradle.internal.graph.CachingDirectedGraphWalker.findValues(CachingDirectedGraphWalker.java:73)
        at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.getDependencies(CachingTaskDependencyResolveContext.java:66)
        ... 101 more

timpharo avatar Jan 18 '19 15:01 timpharo

You need configurations.runtime instead, as it extends from both compile and implementation.

tadfisher avatar Apr 07 '19 20:04 tadfisher

Custom tasks are not properly generating a fat jar with dependencies using shadow 5.0.0, gradle 5.4.1, and Java 8. Only the manifest and main class are included in the output jar.

The main shadowJar task works properly.

My use case is for generating a test jar so the example in the docs at https://imperceptiblethoughts.com/shadow/custom-tasks/ is exactly what I'm using. You should be able to reproduce this using that exact task definition in a bare project generated using the instructions at https://guides.gradle.org/creating-new-gradle-builds/ then choosing the options java-application, groovy for the build script DSL, and spock for the test framework.

Changing the dependency declarations to use the old testCompile configuration does properly include the dependencies into the jar but runtime errors occur (at least for me) when running.

agramian avatar May 03 '19 05:05 agramian

I run into the same exeception:

Resolving configuration 'runtime' directly is not allowed

Any ideas how to fix this? I think this might be related to java-library plugin?

jschneider avatar May 25 '19 11:05 jschneider

A workaround I found: create a dummy configuration that extends from implementation and use that instead (runtime didn't work for me)

Barteks2x avatar Aug 22 '19 07:08 Barteks2x

This is still happening. Any plans to fix this issue?

Using the old configurations - compile, runtime, testCompile, testRuntime, etc. - brings the dependency classes into the fat jar. So it runs if I just put the fat jar in the $CLASSPATH. But running the jar fails because it's missing the main manifest attribute.

CharlieReitzel avatar Nov 25 '19 00:11 CharlieReitzel

A working workaround is to manually allow resolving implementation configuration like this:

shadowJar {
    project.configurations.implementation.canBeResolved = true
    configurations = [project.configurations.implementation]
    // ...
}

P.S. I have no clue what consequences this action could have, but it at least does exactly what good ol' compile configuration did. Use this at your own risk.

ghost avatar Dec 08 '19 11:12 ghost

@scpketer Did you see previous postings? Referring to the new style configuration name, implementation, as you suggest gives the error:

> Resolving configuration 'implementation' directly is not allowed

Using the old style configurations compile, runtimeOnly, etc. does work. Or, at least, close enough.

CharlieReitzel avatar Dec 08 '19 14:12 CharlieReitzel

@CharlieReitzel Did you see my code snippet? It's clearly seen that my snippet enables direct resolving of implementation configuration.

project.configurations.implementation.canBeResolved = true

I'm using this approach in my own project, and I can tell it does work.

ghost avatar Dec 10 '19 14:12 ghost

Did you see my code snippet? It clearly seen that my snippet enables direct resolving of implementation configuration.

project.configurations.implementation.canBeResolved = true

Doh! :--) Thanks for clarifying and for the tip!

CharlieReitzel avatar Dec 10 '19 16:12 CharlieReitzel

In which file and directory do I place the shadowjar{} command. I don't see it referenced anywhere here and I am new to this stuff.

jcksnvllxr80 avatar Dec 19 '19 14:12 jcksnvllxr80

@jcksnvllxr80 The shadowJar code block goes in your build.gradle file. See the User Guide for more information on how to configure the shadowJar task.

cstroe avatar Dec 20 '19 06:12 cstroe

still a problem with version 5.1 but scpketer workaround does the trick

CarrKnight avatar Apr 17 '20 13:04 CarrKnight

still a problem with version 5.2

qoomon avatar Apr 28 '20 11:04 qoomon

still a problem with version 5.2

Yes, unfortunately.

ghost avatar May 18 '20 09:05 ghost

@scpketer , the workaround with the implementation worked . I couldn't find any other alternate .. As we are getting the the compile is deprecated warning and will be removed in gradle 7.0 version , and yet the issue is not fixed with shadow plugin , i see this as the only option .. Thank you

vishnu1309 avatar Dec 11 '20 11:12 vishnu1309

@scpketer , the workaround with the implementation worked . I couldn't find any other alternate .. As we are getting the the compile is deprecated warning and will be removed in gradle 7.0 version , and yet the issue is not fixed with shadow plugin , i see this as the only option .. Thank you

In fact, Gradle 7.0 still has this api

// gradle.kts
project.configurations.implementation.get().isCanBeResolved = true

chachako avatar Jan 05 '21 13:01 chachako

Just wanted to poke this issue since it has been over a year since a comment was left and this issue still exists. I have recently been struggling with getting my custom shadow task to include the dependencies in the thick jar until I changed my configuration to use

project.configurations.implementation.canBeResolved = true
configurations = [project.configurations.implementation]

Prior to this build, my team used Gradle 6 and used the deprecated compile and runtime dependency declarations. We had also pointed our custom shadow task to use configurations = [project.configurations.runtime] After upgrading to Gradle 7 and v7.1.2 of this plugin, we began running into issues with our jars missing dependencies.

shinn5112 avatar Feb 11 '22 18:02 shinn5112

This is my working solution in kotlin

withType<ShadowJar> {
    // <WORKAROUND for="https://github.com/johnrengelman/shadow/issues/448">
    configurations = listOf(
        project.configurations.implementation.get(),
        project.configurations.runtimeOnly.get()
    ).onEach { it.isCanBeResolved = true }
    // </WORKAROUND>
}

qoomon avatar Apr 19 '22 09:04 qoomon

But why should you do that @qoomon? It is the same as using the runtimeClasspath configuration which is resolvable and extends those two and would just work and also is the default used, so just remove the whole snippet you showed and it will work exactly the same, without abusing configurations that are not meant to be resolved.

Vampire avatar Nov 15 '23 12:11 Vampire