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

Support for Gradle Configuration Cache #297

Closed
Fabian-K opened this issue Mar 12, 2021 · 9 comments
Closed

Support for Gradle Configuration Cache #297

Fabian-K opened this issue Mar 12, 2021 · 9 comments

Comments

@Fabian-K
Copy link

Hi,

Gradle 6.8 has a new configuration cache feature that helps to improve build performance. Unfortunately, there are some restrictions on what plugins can use and the dependency-management-plugin is currently not compatible with this. It would be cool if it supports the configuration cache at some point :)

This should be reproducible with any sample project using gradle 6.8 and gradlew --configuration-cache assemble

Thanks, Fabian

- Plugin 'io.spring.dependency-management': read system property 'awt.toolkit'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.cpu.isalist'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.jnu.encoding'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.arch.data.model'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.boot.library.path'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.java.command'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'jdk.debug'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'java.vm.compressedOopsMode'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.management.compiler'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'file.encoding'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'java.io.tmpdir'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'java.awt.printerjob'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.os.patch.level'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.io.unicode.encoding'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'library.jansi.path'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
@wilkinsona
Copy link
Contributor

Thanks for the report but I can't reproduce the behaviour you have described using a minimal build.gradle:

plugins {
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

dependencyManagement {
    imports {
        mavenBom 'org.springframework.boot:spring-boot-dependencies:2.4.3'
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

I've tried with both 6.8.1 as you used and also with 6.8.3. In both cases, the output is the following:

$ ./gradlew --configuration-cache --console=plain clean assemble
Configuration cache is an incubating feature.
Calculating task graph as configuration cache cannot be reused because file 'build.gradle' has changed.
> Task :clean
> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes
> Task :jar
> Task :assemble

BUILD SUCCESSFUL in 872ms
3 actionable tasks: 3 executed
Configuration cache entry stored.

Can you please provide some more detailed steps to reproduce the problem? Alternatively, could you attach to this issue a zip of the HTML report that Gradle generates?

@Fabian-K
Copy link
Author

Thanks for looking into this! I checked the differences between your minimal build.gradle and my project and it looks like this starts to fail once you add the kotlin plugin to the game (id "org.jetbrains.kotlin.jvm" version "1.4.31")

I did not expect that to make a difference... now I´m not sure if the behavior of the spring plugin changes once the kotlin plugin is there or if it not correctly claims that its io.spring.dependency-management fault 🙇‍♂️

@wilkinsona
Copy link
Contributor

Thanks. I've reproduced the problem now. The dependency management plugin reads the JVM's system properties to make them available to some embedded Maven code that resolves a dependency's effective pom. This is happening at execution time and my understanding is that the configuration cache only prohibits reading system properties at configuration time:

Plugins and build scripts should not read system properties directly using the Java APIs at configuration time

Here's a stacktrace for one of the problems:
org.gradle.api.InvalidUserCodeException: Read system property 'awt.toolkit'
	at org.gradle.configurationcache.SystemPropertyAccessListener.systemPropertyQueried(SystemPropertyAccessListener.kt:92)
	at org.gradle.internal.classpath.Instrumented$DecoratingEntrySet$1.computeNext(Instrumented.java:350)
	at org.gradle.internal.classpath.Instrumented$DecoratingEntrySet$1.computeNext(Instrumented.java:343)
	at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
	at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
	at java.util.Hashtable.putAll(Hashtable.java:523)
	at io.spring.gradle.dependencymanagement.org.apache.maven.model.building.DefaultModelBuildingRequest.setSystemProperties(DefaultModelBuildingRequest.java:259)
	at io.spring.gradle.dependencymanagement.internal.maven.EffectiveModelBuilder.buildModel(EffectiveModelBuilder.java:62)
	at io.spring.gradle.dependencymanagement.internal.maven.MavenPomResolver.createPom(MavenPomResolver.java:134)
	at io.spring.gradle.dependencymanagement.internal.maven.MavenPomResolver.createPoms(MavenPomResolver.java:128)
	at io.spring.gradle.dependencymanagement.internal.maven.MavenPomResolver.resolvePoms(MavenPomResolver.java:87)
	at io.spring.gradle.dependencymanagement.internal.DependencyManagement.resolve(DependencyManagement.java:183)
	at io.spring.gradle.dependencymanagement.internal.DependencyManagement.resolveIfNecessary(DependencyManagement.java:153)
	at io.spring.gradle.dependencymanagement.internal.DependencyManagement.getManagedVersions(DependencyManagement.java:121)
	at io.spring.gradle.dependencymanagement.internal.DependencyManagementContainer.getManagedVersionsForConfiguration(DependencyManagementContainer.java:202)
	at io.spring.gradle.dependencymanagement.internal.DependencyManagementContainer.getManagedVersionsForConfiguration(DependencyManagementContainer.java:187)
	at io.spring.gradle.dependencymanagement.internal.DependencyManagementApplier$1.execute(DependencyManagementApplier.java:76)
	at io.spring.gradle.dependencymanagement.internal.DependencyManagementApplier$1.execute(DependencyManagementApplier.java:72)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:100)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:95)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:83)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:61)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy42.beforeResolve(Unknown Source)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.performPreResolveActions(DefaultConfiguration.java:782)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$400(DefaultConfiguration.java:149)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:641)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:634)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:634)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.lambda$resolveExclusively$4(DefaultConfiguration.java:614)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$CalculatedModelValueImpl.update(DefaultProjectStateRegistry.java:362)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveExclusively(DefaultConfiguration.java:611)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:598)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1900(DefaultConfiguration.java:149)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$SelectedArtifactsProvider.getValue(DefaultConfiguration.java:1328)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$SelectedArtifactsProvider.getValue(DefaultConfiguration.java:1318)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getSelectedArtifacts(DefaultConfiguration.java:1390)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.visitContents(DefaultConfiguration.java:1377)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.visitContents(DefaultConfiguration.java:497)
	at org.gradle.api.internal.file.AbstractFileCollection.getFiles(AbstractFileCollection.java:126)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getFiles(Unknown Source)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolve(DefaultConfiguration.java:487)
	at org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool$computedCompilerClasspath$2.invoke(Tasks.kt:113)
	at org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool$computedCompilerClasspath$2.invoke(Tasks.kt:105)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool.getComputedCompilerClasspath$kotlin_gradle_plugin(Tasks.kt:105)
	at sun.reflect.GeneratedMethodAccessor120.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue$1$1.create(AbstractNestedRuntimeBeanNode.java:77)
	at org.gradle.internal.deprecation.DeprecationLogger.whileDisabled(DeprecationLogger.java:236)
	at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue$1.get(AbstractNestedRuntimeBeanNode.java:73)
	at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
	at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue.call(AbstractNestedRuntimeBeanNode.java:133)
	at org.gradle.util.GUtil.uncheckedCall(GUtil.java:452)
	at org.gradle.util.DeferredUtil.unpackNestableDeferred(DeferredUtil.java:64)
	at org.gradle.api.internal.file.collections.UnpackingVisitor.add(UnpackingVisitor.java:84)
	at org.gradle.api.internal.file.DefaultFileCollectionFactory$ResolvingFileCollection.visitChildren(DefaultFileCollectionFactory.java:312)
	at org.gradle.api.internal.file.CompositeFileCollection.visitDependencies(CompositeFileCollection.java:108)
	at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext$TaskGraphImpl.getNodeValues(CachingTaskDependencyResolveContext.java:114)
	at org.gradle.internal.graph.CachingDirectedGraphWalker$GraphWithEmptyEdges.getNodeValues(CachingDirectedGraphWalker.java:213)
	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:69)
	at org.gradle.execution.plan.TaskDependencyResolver.resolveDependenciesFor(TaskDependencyResolver.java:46)
	at org.gradle.execution.plan.LocalTaskNode.getDependencies(LocalTaskNode.java:155)
	at org.gradle.execution.plan.LocalTaskNode.resolveDependencies(LocalTaskNode.java:123)
	at org.gradle.execution.plan.DefaultExecutionPlan.doAddNodes(DefaultExecutionPlan.java:171)
	at org.gradle.execution.plan.DefaultExecutionPlan.addEntryTasks(DefaultExecutionPlan.java:135)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.addEntryTasks(DefaultTaskExecutionGraph.java:160)
	at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:49)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:55)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:26)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:63)
	at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:45)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:55)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:26)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:63)
	at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:48)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:55)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.lambda$select$0(DefaultBuildConfigurationActionExecuter.java:42)
	at org.gradle.internal.Factories$1.create(Factories.java:31)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry.withMutableStateOfAllProjects(DefaultProjectStateRegistry.java:141)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry.withMutableStateOfAllProjects(DefaultProjectStateRegistry.java:128)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:40)
	at org.gradle.initialization.DefaultTaskExecutionPreparer.prepareForTaskExecution(DefaultTaskExecutionPreparer.java:38)
	at org.gradle.initialization.BuildOperationFiringTaskExecutionPreparer$CalculateTaskGraph.populateTaskGraph(BuildOperationFiringTaskExecutionPreparer.java:117)
	at org.gradle.initialization.BuildOperationFiringTaskExecutionPreparer$CalculateTaskGraph.run(BuildOperationFiringTaskExecutionPreparer.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.initialization.BuildOperationFiringTaskExecutionPreparer.prepareForTaskExecution(BuildOperationFiringTaskExecutionPreparer.java:56)
	at org.gradle.initialization.DefaultGradleLauncher.prepareTaskExecution(DefaultGradleLauncher.java:233)
	at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:167)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:148)
	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
	at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:72)
	at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:67)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:67)
	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:56)
	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:63)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:77)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
	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.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.lambda$execute$0(InProcessBuildActionExecuter.java:54)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:86)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:53)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:29)
	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.lambda$execute$0(BuildTreeScopeLifecycleBuildActionExecuter.java:33)
	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:49)
	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:32)
	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:27)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:104)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:64)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:37)
	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.lambda$execute$0(SessionScopeLifecycleBuildActionExecuter.java:54)
	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:67)
	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:50)
	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	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:47)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	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:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.lang.Thread.run(Thread.java:748)

The problem can be reproduced with Gradle 6.8.3 and the following build.gradle script:

plugins {
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id "org.jetbrains.kotlin.jvm" version "1.4.31"
}

version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

dependencyManagement {
    imports {
        mavenBom 'org.springframework.boot:spring-boot-dependencies:2.4.3'
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

def afterEvaluation = false
gradle.projectsEvaluated {
	println "Evaluated"
    afterEvaluation = true
}

allprojects { project ->
    configurations.all { configuration ->
        configuration.incoming.beforeResolve {
            println "Resolving $configuration"
           if (!afterEvaluation) {
               throw new Exception("Configuration $configuration.name of project $project.name is being resolved at configuration time.")
           }
        }
    }
}
$ ./gradlew --configuration-cache build
Configuration cache is an incubating feature.
Calculating task graph as no configuration cache is available for tasks: build
Evaluated
Resolving configuration ':kotlinCompilerClasspath'
Resolving configuration ':compileClasspath'
Resolving configuration ':kotlinCompilerPluginClasspath'
Resolving configuration ':annotationProcessor'
Resolving configuration ':testCompileClasspath'
Resolving configuration ':testAnnotationProcessor'
Resolving configuration ':testRuntimeClasspath'

FAILURE: Build failed with an exception.

* What went wrong:
Configuration cache problems found in this build.

280 problems were found storing the configuration cache, 31 of which seem unique.
- Plugin 'io.spring.dependency-management': read system property 'java.runtime.name'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.boot.library.path'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'gopherProxySet'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'kotlin.environment.keepalive'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'file.encoding.pkg'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'user.country'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.java.launcher'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.os.patch.level'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'user.dir'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'java.awt.graphicsenv'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'java.endorsed.dirs'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'java.io.tmpdir'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'org.gradle.appname'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'user.variant'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
- Plugin 'io.spring.dependency-management': read system property 'sun.jnu.encoding'
  See https://docs.gradle.org/6.8.1/userguide/configuration_cache.html#config_cache:requirements:undeclared_sys_prop_read
plus 16 more problems. Please see the report for details.

See the complete report at file:///Users/awilkinson/dev/temp/dmp-296/build/reports/configuration-cache/29t60872gqbxxv4b0etoznxta-4/configuration-cache-report.html
> Read system property 'java.runtime.name'
> Read system property 'sun.boot.library.path'
> Read system property 'gopherProxySet'
> Read system property 'kotlin.environment.keepalive'
> Read system property 'file.encoding.pkg'

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

* Get more help at https://help.gradle.org

BUILD FAILED in 1s
2 actionable tasks: 2 up-to-date
Configuration cache entry discarded with 280 problems.

The script verifies that evaluation has completed before any configurations are resolved so I'm pretty sure that the system properties are being read at execution time. If that's correct then it looks like there's either a bug in Gradle or the documentation is understating the restrictions on reading system properties. I'll seek some guidance from the Gradle team.

@eskatos
Copy link

eskatos commented Mar 12, 2021

The undeclared system property reads are reported when calculating the task graph, after evaluation, before execution.

Task graph calculation visits the dependencies of task inputs here
which happen to be a by lazy property in the Kotlin plugin that computes a classpath here - source
resolving that classpath triggers the spring dependency management plugin to resolve managed versions here
then the undeclared read gets reported at the usage site in the spring dependency management plugin here

Here's the configuration-cache-report.zip.

The attribution of the problem could be better and explain the chain.

Changing the script to report configurations resolved at task graph calculation time, before execution:

// ... snip

def ready = false
gradle.taskGraph.whenReady {
    println "Task Graph Ready"
    ready = true
}

allprojects { project ->
    configurations.all { configuration ->
        configuration.incoming.beforeResolve {
           println "Resolving $configuration"
           if (!ready) {
               throw new Exception("$configuration of $project is being resolved at configuration time")
           }
        }
    }
}

and running gradle build shows that this is the kotlinCompilerClasspath configuration that is resolved

* What went wrong:
Could not determine the dependencies of task ':compileKotlin'. |  
> Failed to notify dependency resolution listener. |  
   > configuration ':kotlinCompilerClasspath' of root project 'spring-297' is being resolved at configuration time

https://scans.gradle.com/s/7bzrjmkjucvpm/failure?expanded-stacktrace=WyIwLTEtMiJd&focused-stack-frame=0-1-2-52#1

I assume resolving that configuration triggers the spring dependency mangement plugin resolution rules.

I think this property on the Kotlin compilation task should be a proper lazy FileCollection instead of a by lazy List<File>, that way the task dependencies visitation could keep the actual computation lazy.

In other words it looks like a problem in the Kotlin plugin to me.

@wilkinsona
Copy link
Contributor

Thank you, @eskatos.

I assume resolving that configuration triggers the spring dependency mangement plugin resolution rules

Yes, that's right. By default dependency management is configured "globally" (to all configurations) so resolution of kotlinCompilerClasspath triggers it.

In other words it looks like a problem in the Kotlin plugin to me

That tallies with the problem only occurring when the Kotlin plugin's applied.

@Fabian-K can you please raise an issue with JetBrains and comment here with a link to it?

@Fabian-K
Copy link
Author

I found gradle/gradle#13490 in general and https://youtrack.jetbrains.com/issue/KT-43605 specifically for kotlin

@wilkinsona
Copy link
Contributor

wilkinsona commented Mar 24, 2021

KT-43605 is for a different problem when using Gradle's configuration cache so I'd recommend raising a new issue for your specific problem. As @eskatos said above, the problem you're seeing is due to the computedCompilerClasspath property.

@Fabian-K
Copy link
Author

Fabian-K commented Apr 1, 2021

Sorry for the delay, I opened https://youtrack.jetbrains.com/issue/KT-45834

@wilkinsona
Copy link
Contributor

Thank you, @Fabian-K.

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

No branches or pull requests

4 participants