Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ShadowJar not working with newer 'implementation' configuration #448

Open
connect2manu opened this issue Jan 11, 2019 · 22 comments
Open

ShadowJar not working with newer 'implementation' configuration #448

connect2manu opened this issue Jan 11, 2019 · 22 comments

Comments

@connect2manu
Copy link

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

@timpharo
Copy link

We are using Gradle 5.0 and having the same issue.

@mig4
Copy link

mig4 commented Jan 18, 2019

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

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

@timpharo
Copy link

@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

@tadfisher
Copy link

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

@agramian
Copy link

agramian commented May 3, 2019

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.

@jschneider
Copy link

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?

@Barteks2x
Copy link

Barteks2x commented Aug 22, 2019

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

@CharlieReitzel
Copy link

CharlieReitzel commented Nov 25, 2019

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.

@ghost
Copy link

ghost commented Dec 8, 2019

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.

@CharlieReitzel
Copy link

CharlieReitzel commented Dec 8, 2019

@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.

@ghost
Copy link

ghost commented Dec 10, 2019

@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.

@CharlieReitzel
Copy link

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!

@jcksnvllxr80
Copy link

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.

@cstroe
Copy link

cstroe commented Dec 20, 2019

@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.

@CarrKnight
Copy link

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

@qoomon
Copy link

qoomon commented Apr 28, 2020

still a problem with version 5.2

@ghost
Copy link

ghost commented May 18, 2020

still a problem with version 5.2

Yes, unfortunately.

@vishnu1309
Copy link

@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

@chachako
Copy link

chachako commented Jan 5, 2021

@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

@shinn5112
Copy link

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.

@qoomon
Copy link

qoomon commented Apr 19, 2022

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>
}

@Vampire
Copy link

Vampire commented Nov 15, 2023

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests