Gradle 2.4 Cannot add deferred configuration for project

Currently our builds are on 2.2.1 building Java 7 projects. I wanted to try the performance enhancements of 2.4.

I ran the wrapper upgrade for 2.3 - all is fine
I ran the wrapper upgrade for nightly gradle-2.4-20150406220025+0000

FAILURE: Build failed with an exception.

  • Where:
    Script ‘/home/vagrant/workspace/project/buildtools/gradle/plugin-config-user.gradle’ line: 12

  • What went wrong:
    A problem occurred evaluating script.

Cannot add deferred configuration for project :

What this code does is apply any found local user overrides of plugin configuration.
The root project’s build.gradle:
apply from: "${gradleToolsDir}/plugin-config-user.gradle"
The plugin-config-user.gradle looks for a user file and applies it if found:

for (file in ["${userHome}/usersettings.gradle","${projectDir}/usersettings.gradle"]) {
  def userSettings = new File(file)
  if (userSettings.exists()) {
    apply from: userSettings
  }
}

My local usersettings.gradle currently has all overrides commented out. When I un-comment something then the build runs fine. Its a very common case for us to have local override files in place but we comment/un-comment as we need and in most cases the file’s content will be commented out.
As the file contains comments I can’t check for an empty file and its a git ignored file so often developers forget its even there.
I looked at the release notes for 2.4 but couldn’t see anything related, but this is going to be quite frustrating having to manage/support amongst developers who use this technique and have this file available but commented out.
Did something change or can I configure something else to support this scenario?

Hi @Warren,

This will be a bug. It would be extremely helpful if you could put together a little example that exhibits the same problem. If we have that, we’ll be able to get a fix in pretty quickly and a new nightly build for you to try.

Hi @luke_daley,

I’ve added 2 example projects:
https://github.com/hallatech/gradle24-1 - this is a working example with a jcenter plugin
https://github.com/hallatech/gradle24-2 - this is a failed example using one of our internal plugins. You won’t be able to actually run it because I’ve not included the maven credentials, but I’ve added the stacktrace in stacktrace.log

So it seems its related to my internal plugin, but the stack trace is not showing any of that plugin’s code.

If I run gradle build it fails on the usersettings.gradle or gradle build -Penv=ci it will fail for the same reason on the empty buildtools/gradle/env/ci.gradle

Thanks

Unfortunately that doesn’t help very much.

I’ve published a new snapshot (2.4-20150409092851+0000) with a toggle to get some more data out.

Can you please run something like:

gradle build -Dorg.gradle.trace.deferred.project.configuration=true

And provide the full exception stacktrace. The cause of the exception is what I’m after, and is only available with that toggle.

Heres the full output as requested. If this still doesn’t help, ping me privately and I can give you the credentials.

hallatech@Hallatechs-MacBook-Pro~/Documents/workspace-spindrift/gradle24-2$ g --full-stacktrace -Dorg.gradle.trace.deferred.project.configuration=true
applying user override: /Users/hallatech/Documents/workspace-spindrift/gradle24-2/usersettings.gradle

FAILURE: Build failed with an exception.

  • Where:
    Build file ‘/Users/hallatech/Documents/workspace-spindrift/gradle24-2/build.gradle’ line: 42

  • What went wrong:
    A problem occurred evaluating script.

Cannot add deferred configuration for project :

  • Try:
    Run with --info or --debug option to get more log output.

  • Exception is:
    org.gradle.api.GradleScriptException: A problem occurred evaluating script.
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:76)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl$1.run(DefaultScriptPluginFactory.java:148)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:156)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.applyScript(DefaultObjectConfigurationAction.java:102)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.access$000(DefaultObjectConfigurationAction.java:36)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction$1.run(DefaultObjectConfigurationAction.java:62)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.execute(DefaultObjectConfigurationAction.java:136)
    at org.gradle.api.internal.project.AbstractPluginAware.apply(AbstractPluginAware.java:46)
    at org.gradle.api.plugins.PluginAware$apply.call(Unknown Source)
    at org.gradle.api.internal.project.ProjectScript.apply(ProjectScript.groovy:34)
    at org.gradle.api.Script$apply$0.callCurrent(Unknown Source)
    at build_cp7h6drw5z8m3xr5qfgbtn3y8.run(/Users/hallatech/Documents/workspace-spindrift/gradle24-2/build.gradle:53)
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:74)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl$1.run(DefaultScriptPluginFactory.java:148)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:156)
    at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:39)
    at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
    at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:55)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:483)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:86)
    at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:42)
    at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:35)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:129)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:90)
    at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:49)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    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:120)
    at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:71)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
    Caused by: java.lang.IllegalStateException: Cannot add deferred configuration for project :
    at org.gradle.api.internal.project.DeferredProjectConfiguration.add(DeferredProjectConfiguration.java:46)
    at org.gradle.api.internal.project.AbstractProject.addDeferredConfiguration(AbstractProject.java:977)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:154)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.applyScript(DefaultObjectConfigurationAction.java:102)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.access$000(DefaultObjectConfigurationAction.java:36)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction$1.run(DefaultObjectConfigurationAction.java:62)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.execute(DefaultObjectConfigurationAction.java:136)
    at org.gradle.groovy.scripts.DefaultScript.apply(DefaultScript.java:104)
    at org.gradle.api.Script$apply$0.callCurrent(Unknown Source)
    at plugin_config_user_2v90irlsicvmhk69azo2uki84.run(/Users/hallatech/Documents/workspace-spindrift/gradle24-2/buildtools/gradle/plugin-config-user.gradle:13)
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:74)
    … 61 more
    Caused by: java.lang.Exception: Project ‘:’ deferred configuration fired
    at org.gradle.api.internal.project.DeferredProjectConfiguration.fire(DeferredProjectConfiguration.java:56)
    at org.gradle.api.internal.project.AbstractProject.fireDeferredConfiguration(AbstractProject.java:982)
    at org.gradle.api.internal.tasks.DefaultTaskContainer.discoverTasks(DefaultTaskContainer.java:202)
    at org.gradle.api.internal.project.DefaultProjectAccessListener.evaluateProjectAndDiscoverTasks(DefaultProjectAccessListener.java:33)
    at org.gradle.api.internal.project.DefaultProjectAccessListener.beforeRequestingTaskByPath(DefaultProjectAccessListener.java:24)
    at org.gradle.api.internal.project.AbstractProject$3.execute(AbstractProject.java:587)
    at org.gradle.api.internal.project.AbstractProject$3.execute(AbstractProject.java:585)
    at org.gradle.api.internal.project.AbstractProject.getTasksByName(AbstractProject.java:598)
    at org.gradle.api.Project$getTasksByName$4.call(Unknown Source)
    at com.spindrift.gradle.project.GlobalCommonTasksPlugin.apply(GlobalCommonTasksPlugin.groovy:42)
    at com.spindrift.gradle.plugins.DatabasePlugin.super$3$apply(DatabasePlugin.groovy)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1206)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:130)
    at com.spindrift.gradle.plugins.DatabasePlugin.apply(DatabasePlugin.groovy:64)
    at com.spindrift.gradle.plugins.DatabasePlugin.apply(DatabasePlugin.groovy)
    at org.gradle.api.internal.plugins.ImperativeOnlyPluginApplicator.applyImperative(ImperativeOnlyPluginApplicator.java:35)
    at org.gradle.api.internal.plugins.RuleBasedPluginApplicator.applyImperative(RuleBasedPluginApplicator.java:43)
    at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:141)
    at org.gradle.api.internal.plugins.DefaultPluginManager.apply(DefaultPluginManager.java:109)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.applyType(DefaultObjectConfigurationAction.java:113)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.access$200(DefaultObjectConfigurationAction.java:36)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction$3.run(DefaultObjectConfigurationAction.java:80)
    at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.execute(DefaultObjectConfigurationAction.java:136)
    at org.gradle.api.internal.project.AbstractPluginAware.apply(AbstractPluginAware.java:46)
    at org.gradle.api.plugins.PluginAware$apply.call(Unknown Source)
    at org.gradle.api.internal.project.ProjectScript.apply(ProjectScript.groovy:34)
    at org.gradle.api.Script$apply$0.callCurrent(Unknown Source)
    at build_cp7h6drw5z8m3xr5qfgbtn3y8.run(/Users/hallatech/Documents/workspace-spindrift/gradle24-2/build.gradle:42)
    … 50 more

BUILD FAILED

Total time: 3.558 secs

What’s going on at GlobalCommonTasksPlugin.groovy:42 ?

I can see now that the line of failure is linked to a base plugin from which the DatabasePlugin derives. That line 42 is actually a debug statement:

project.logger.debug “project.getTasksByName(ARGS_TASK,false)=${project},${project.getTasksByName(ARGS_TASK,false)}”

Commenting that out now shows in the stacktrace the same line number (i.e. the next line). So probably the getTasksByName is no longer applicable ?

How the plugins are structured is that there are a number of common tasks for each plugin. These are added to a base plugin. What that does is check first whether those tasks have actually been applied and if not apply them. So it ensures there is only 1 attempt to create these common tasks no matter how many of the plugins are applied that share that common base. The super method is like this:

   abstract class GlobalCommonTasksPlugin extends SpindriftBasePlugin<Project> {
  
  static final String ARGS_TASK="args";
  static final String SHOW_PROPERTIES_TASK="showProperties";
  static final String SHOW_TASK="show";
  static final String HOWTO_TASK="howto";
  
  /* (non-Javadoc)
   * @see org.gradle.api.Plugin#apply(java.lang.Object)
   */
  public void apply(Project project) {
    setResourceBundleName("com.spindrift.gradle.plugins.resources.CommonTasksPluginResources")
    
    //As this is a base plugin ensure its tasks are only applied once
//    project.logger.debug "project.getTasksByName(ARGS_TASK,false)=${project},${project.getTasksByName(ARGS_TASK,false)}"
    if (!project.rootProject.getTasksByName(ARGS_TASK,false)) {
      addArgs(project.rootProject,ARGS_TASK)
    }
    if (!project.rootProject.getTasksByName(SHOW_PROPERTIES_TASK,false)) {
      addShowProperties(project.rootProject,SHOW_PROPERTIES_TASK)
    }
    if (!project.rootProject.getTasksByName(SHOW_TASK,false)) {
      addShow(project.rootProject,SHOW_TASK)
    }
    if (!project.rootProject.getTasksByName(HOWTO_TASK,false)) {
      addHowto(project.rootProject,HOWTO_TASK)
    }
    
  }
....
}

I see what the problem is now and am working on a fix.

You can change your code to get around this and it will still work with older versions. Change you usage of project.getTasksByName() to project.tasks.findByName().

Great thanks! I’ve made the suggested changes to the base plugin and it runs fine across 3 gradle versions:
Example using a 20 project build. -x check used to eliminate some custom checks that weren’t subject to up-to-date processing

Build 1: 2.4 nightly - Total time: 36.58 secs
Build 2: 2.4 nightly - Total time: 8.332 secs
Build 3: 2.4 nightly - Total time: 7.778 secs
Build 4: 2.4 nightly - Total time: 7.113 secs
Build 5: 2.4 nightly - Total time: 6.706 secs
Build 6: 2.4 nightly - Total time: 8.119 secs
Build 7: 2.4 nightly - Total time: 3.677 secs (Using -x check)
Build 8: 2.4 nightly - Total time: 3.341 secs (Using -x check)
Build 9: 2.4 nightly - Total time: 3.208 secs (Using -x check)
Build 10: 2.4 nightly - Total time: 3.265 secs (Using -x check)

Build 1: 2.3 - Total time: 53.807 secs
Build 2: 2.3 - Total time: 10.502 secs
Build 3: 2.3 - Total time: 10.473 secs
Build 4: 2.3 - Total time: 8.731 secs
Build 5: 2.3 - Total time: 8.347 secs
Build 6: 2.3 - Total time: 8.939 secs
Build 7: 2.3 - Total time: 6.568 secs (Using -x check)
Build 8: 2.3 - Total time: 4.984 secs (Using -x check)
Build 9: 2.3 - Total time: 5.532 secs (Using -x check)
Build 10: 2.3 - Total time: 5.192 secs (Using -x check)

Build 1: 2.2.1 - Total time: 34.084 secs
Build 2: 2.2.1 - Total time: 10.692 secs
Build 3: 2.2.1 - Total time: 8.218 secs
Build 4: 2.2.1 - Total time: 8.428 secs
Build 5: 2.2.1 - Total time: 8.08 secs
Build 6: 2.2.1 - Total time: 9.455 secs
Build 7: 2.2.1 - Total time: 4.521 secs (Using -x check)
Build 8: 2.2.1 - Total time: 4.735 secs (Using -x check)
Build 9: 2.2.1 - Total time: 4.368 secs (Using -x check)
Build 10: 2.2.1 - Total time: 4.542 secs (Using -x check)

Excellent. Thanks for posting the results.