Coder Social home page Coder Social logo

gradle-nebula-integration's People

Contributors

chali avatar ljacomet avatar odysseuslives avatar rpalcolea avatar sghill avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gradle-nebula-integration's Issues

Dependencies added conditionally are incompatible with core locking

We've been working around IntelliJ's wonky handling of providedCompile/providedRuntime by conditionally moving it to provided only when tasks are requested (as is the case when fetching models over the tooling API).

However, that causes core locking to fail when importing into the IDE. We consider that an IntelliJ bug, however we don't have alternative for these provided dependencies and will hamper core locking adoption:

https://youtrack.jetbrains.com/issue/IDEA-197475

Older Gradle distribution caches are not cleaned up

While looking at cache cleanup, I see that shared dependency caches such as directories in ~/.gradle/caches/modules-2 and files in ~/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin that have not been used recently are cleaned up, but I still see older caches and distributions of Gradle that I have not used in a few months.

I am verifying the age of these version-specific caches and distributions by using tree -D -L <depth> <folder-name> as run in the script in this repo.

For example, in ~/.gradle.caches, I see the following caches not cleaned up:

├── [Apr 11 13:01]  2.13
├── [Apr 24  9:45]  4.5.1
├── [May 22 10:58]  4.6
├── [May 24 12:58]  2.10
├── [Jun 12 18:39]  4.8
├── [Jun 26 12:34]  3.3
├── [Jun 26 14:09]  4.8.1

and in ~/.gradle/wrapper/dists, I see the following distributions:

├── [Feb 22  2018]  gradle-4.5.1-bin
├── [Feb 27 12:31]  gradle-2.13-bin
├── [Mar  2  8:54]  gradle-4.6-bin
├── [Jun 13 12:46]  gradle-4.8-bin
├── [Jun 26 12:34]  gradle-3.3-all
├── [Jun 26 12:36]  gradle-4.8.1-bin
├── [Jul 20 10:27]  gradle-2.10-bin

in addition to versions that I have used more recently.

Am I evaluating the age/ "last use" of these version caches the correct way, and these should have been cleaned up?

Alignment: dependencies aligned to a non-forced version when there is a force in place

Scenario

Given a build file containing a dependency with an alignment and a force:

dependencies {
    compile 'org.slf4j:slf4j-api:1.6.0'
    compile 'org.slf4j:slf4j-simple:1.7.20'
}

configurations.all {
    resolutionStrategy {
        force 'org.slf4j:slf4j-simple:1.5.5'
    }
}

project.dependencies.components.all(AlignJackson.class)

class AlignJackson implements ComponentMetadataRule {
    void execute(ComponentMetadataContext ctx) {
        ctx.details.with { it ->
            if (it.getId().getGroup().startsWith("org.slf4j")) {
                it.belongsTo("org.slf4j:slf4j-platform:${it.getId().getVersion()}")
            }
        }
    }
}

when I run ./gradlew dependencyInsight --dependency slf4j
with Gradle 4.10-20180801000007+0000

then I should see the final version as 1.5.5 for all dependencies (which I do not)
because the single force to 1.5.5 should have pushed the dependency platform down to this version.
Note: See full output below

Example Project

Please see the whole example project at dependency-insight/docs/alignment/alignment-static-transitive-force/input


Current output for reference

Tasks: dependencyInsight --dependency slf4j-api

> Task :dependencyInsight
org.slf4j:slf4j-api:1.6.0
   variant "compile" [
      org.gradle.status = release (not requested)
      org.gradle.usage  = java-api
   ]
   Selection reasons:
      - Was requested
      - By constraint : belongs to platform org.slf4j:slf4j-platform:1.6.0
      - By conflict resolution : between versions 1.6.0 and 1.5.5

org.slf4j:slf4j-api:1.6.0
+--- compileClasspath
\--- org.slf4j:slf4j-simple:1.6.0
     +--- compileClasspath
     \--- compileClasspath

Tasks: dependencyInsight --dependency slf4j-simple

> Task :dependencyInsight
org.slf4j:slf4j-simple:1.6.0
   variant "compile" [
      org.gradle.status = release (not requested)
      org.gradle.usage  = java-api
   ]
   Selection reasons:
      - Was requested
      - Forced
      - By constraint : belongs to platform org.slf4j:slf4j-platform:1.6.0
      - By conflict resolution : between versions 1.5.5 and 1.6.0

org.slf4j:slf4j-simple:1.7.20 -> 1.6.0
\--- compileClasspath

Intellij - Can't import project with Gradle 5.1 Nightly

Hi folks,

I tried to import a project in IntelliJ using latest nightly gradle-5.1-20181130102259+0000-bin.zip

I get a Connection refused:

screen shot 2018-11-30 at 12 44 23 pm

Download of the distribution happens:

screen shot 2018-11-30 at 12 46 33 pm

If I use https\://services.gradle.org/distributions-snapshots/gradle-5.1-20181127213941+0000-bin.zip it works.

Wonder if a regression happened on Gradle side.

Sample project in https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/import-gradle5-1-nightly-issue

Class-based ComponentMetatdataRule Ordering

Switching over to class-based component metadata rules introduces this exception if everything isn't class-based:

Caused by: java.lang.IllegalArgumentException: Non class based component metadata rules must all be added before class based ones.

When a distribution and plugins are contributing component metadata rules, this prevents consumers and other plugins from using legacy component metadata rules.

Dependency download retries with repository bad credentials

Hi folks!

Some context:

We were applying the following init.gradle to one of our test projects that use nebula:

allprojects {
    buildscript {
        repositories {
        maven {
                     name 'internal-plugin-portal'
                     url 'https://repo.test.netflix.net/artifactory/gradle-plugins' }
                     }
    }
    repositories {
    maven {
                 name 'internal-plugin-portal'
                 url 'https://repo.test.netflix.net/artifactory/gradle-plugins' }

    }
}

While building our project using this script in Gradle 4.10.2 there were no issues, but 5.1 nightly was running out of memory and after increasing the heap size it took 13 min to build vs the usual 1 min.

We started looking into why this happened. One thing that we found is that when we applied this gradle script in gradle 4.10.2 we saw multiple errors like this one

Caused by: org.gradle.api.resources.ResourceException: Could not get resource 'https://repo.test.netflix.net/artifactory/gradle-plugins/org/apache/apache/5/apache-5.pom'.
Caused by: java.lang.NullPointerException
    at org.gradle.internal.resource.transport.http.ntlm.NTLMCredentials.<init>(NTLMCredentials.java:35)

Thankfully, the error message got enriched in gradle/gradle#6369 gradle/gradle#6379.

With nightly release we found the following:

Caused by: org.gradle.api.resources.ResourceException: Could not get resource 'https://repo.test.netflix.net/artifactory/gradle-plugins/org/apache/apache/5/apache-5.pom'.
Caused by: java.lang.NullPointerException: Username must not be null!
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:906)
    at org.gradle.internal.resource.transport.http.ntlm.NTLMCredentials.<init>(NTLMCredentials.java:36)

At this point it was clear to us that the issue was credentials related and then we noticed the retries:

02:20:02.788 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess] Error while accessing remote repository 622fcde3bac6a47b8e324d8bbe011e59. Waiting 1000ms before next retry. 2 retries left

02:20:03.791 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess] Error while accessing remote repository 622fcde3bac6a47b8e324d8bbe011e59. Waiting 2000ms before next retry. 1 retries left

After the 13 min we found around 1.1k retries in our project due to the bad credentials.

Our fix was to not use a repository that requires credentials without them 😅. We didn't notice this issue (and it's been months already probably) before because we didn't have retries so retries are great!

I believe the feedback goes more into if it is possible to avoid retries when there aren't credentials or valid credentials for a repository. Without debugging there are two potential scenarios for users:

  1. If the dependency graph is small, they might not run out of memory and just see a "slow" build.
  2. With big project, they might run out of memory like us

Dependency insight: "Force" selection reason does not show up when there is a substitution in place

Scenario

Given a build file containing a dependency with a substitution and a force:

dependencies {
    compile 'org.mockito:mockito-all:1.8.0'
}

configurations.all {
    resolutionStrategy {
        force 'org.mockito:mockito-all:1.10.17'
    }
}

def substitutionMessage = '✭ substitution org.mockito:mockito-all -> org.mockito:mockito-core:1.10.19'
configurations.all {
    resolutionStrategy.dependencySubstitution {
        substitute module('org.mockito:mockito-all') because (substitutionMessage) with module('org.mockito:mockito-core:1.10.19')
    }
}

when I run ./gradlew dependencyInsight --dependency mockito
with Gradle 4.10-20180801000007+0000

then I should see the final version as 1.10.19 (which I do)
and I should see a selection reason as Forced (which I do not)
Note: See full output below

Example Project

Please see the whole example project at dependency-insight/docs/basic/substitute-static-force/input


Current output for reference

> Task :dependencyInsight
org.mockito:mockito-core:1.10.19
   variant "compile" [
      org.gradle.status = release (not requested)
      org.gradle.usage  = java-api
   ]
   Selection reasons:
      - Was requested
      - Selected by rule : ✭ substitution org.mockito:mockito-all -> org.mockito:mockito-core:1.10.19

org.mockito:mockito-all:1.8.0 -> org.mockito:mockito-core:1.10.19
\--- compileClasspath

Setting attribute value of `candidate` prevents from project configuration

When we detect a version that it's a Release Candidate, we set the status to candidate.

This is broken starting with 5.0-20180923235913+0000 release.

Running the MyPluginSpec test from https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/broken-release-candidate-attribute will generate the following exception:

org.gradle.api.GradleException: Build aborted because of an internal error.

	at nebula.test.functional.internal.DefaultExecutionResult.rethrowFailure(DefaultExecutionResult.groovy:97)
	at nebula.test.IntegrationSpec.runTasksSuccessfully(IntegrationSpec.groovy:149)
	at gradle5.rc.issue.MyPluginSpec.specific transitive candidates or snapshots resolved(MyPluginSpec.groovy:76)
Caused by: org.gradle.internal.exceptions.LocationAwareException: A problem occurred configuring root project 'specific-transitive-candidates-or-snapshots-resolved'.
	at org.gradle.initialization.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:74)
	at org.gradle.initialization.MultipleBuildFailuresExceptionAnalyser.transform(MultipleBuildFailuresExceptionAnalyser.java:49)
	at org.gradle.initialization.StackTraceSanitizingExceptionAnalyser.transform(StackTraceSanitizingExceptionAnalyser.java:30)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:164)
	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:133)
	at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:77)
	at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:74)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:98)
	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:74)
	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:55)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:49)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
	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.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:59)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
	at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:60)
	at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:58)
	at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:37)
	at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:181)
	at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:124)
	at org.gradle.tooling.internal.provider.DefaultConnection.getModel(DefaultConnection.java:208)
	at org.gradle.tooling.internal.consumer.connection.CancellableModelBuilderBackedModelProducer.produceModel(CancellableModelBuilderBackedModelProducer.java:53)
	at org.gradle.tooling.internal.consumer.connection.PluginClasspathInjectionSupportedCheckModelProducer.produceModel(PluginClasspathInjectionSupportedCheckModelProducer.java:41)
	at org.gradle.tooling.internal.consumer.connection.AbstractConsumerConnection.run(AbstractConsumerConnection.java:59)
	at org.gradle.tooling.internal.consumer.connection.ParameterValidatingConsumerConnection.run(ParameterValidatingConsumerConnection.java:47)
	at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:89)
	at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:83)
	at org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.run(LazyConsumerActionExecutor.java:84)
	at org.gradle.tooling.internal.consumer.connection.CancellableConsumerActionExecutor.run(CancellableConsumerActionExecutor.java:45)
	at org.gradle.tooling.internal.consumer.connection.ProgressLoggingConsumerActionExecutor.run(ProgressLoggingConsumerActionExecutor.java:58)
	at org.gradle.tooling.internal.consumer.connection.RethrowingErrorsConsumerActionExecutor.run(RethrowingErrorsConsumerActionExecutor.java:38)
	at org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:55)
	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: org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project 'specific-transitive-candidates-or-snapshots-resolved'.
	at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:80)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:73)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.access$400(LifecycleProjectEvaluator.java:54)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:107)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:68)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:687)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:140)
	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:60)
	at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:41)
	at org.gradle.initialization.DefaultGradleLauncher$ConfigureBuild.run(DefaultGradleLauncher.java:286)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.initialization.DefaultGradleLauncher.configureBuild(DefaultGradleLauncher.java:194)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:150)
	... 61 more
Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all artifacts for configuration ':classpath'.
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.rethrowFailure(DefaultConfiguration.java:1076)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1700(DefaultConfiguration.java:123)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationArtifactCollection.ensureResolved(DefaultConfiguration.java:1511)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationArtifactCollection.getArtifacts(DefaultConfiguration.java:1483)
	at org.gradle.composite.internal.CompositeBuildClassPathInitializer.execute(CompositeBuildClassPathInitializer.java:45)
	at org.gradle.composite.internal.CompositeBuildClassPathInitializer.execute(CompositeBuildClassPathInitializer.java:32)
	at org.gradle.api.internal.initialization.DefaultScriptClassPathResolver.resolveClassPath(DefaultScriptClassPathResolver.java:37)
	at org.gradle.api.internal.initialization.DefaultScriptHandler.getScriptClassPath(DefaultScriptHandler.java:72)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.defineScriptHandlerClassScope(DefaultPluginRequestApplicator.java:204)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:82)
	at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:186)
	at org.gradle.configuration.BuildOperationScriptPlugin$1$1.run(BuildOperationScriptPlugin.java:69)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:66)
	at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:63)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:48)
	at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:63)
	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:41)
	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$EvaluateProject.run(LifecycleProjectEvaluator.java:105)
	... 80 more
Caused by: org.gradle.internal.resolve.ModuleVersionResolveException: Could not resolve test.nebula:a:1.1.1-rc.1.
Required by:
    project :
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.calculateTargetConfigurations(EdgeState.java:187)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.attachToTargetConfigurations(EdgeState.java:129)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.attachToTargetRevisionsSerially(DependencyGraphBuilder.java:317)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolveEdges(DependencyGraphBuilder.java:216)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:169)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:130)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:121)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:169)
	at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:86)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:73)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$5.run(DefaultConfiguration.java:533)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:524)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:509)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1800(DefaultConfiguration.java:123)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getSelectedArtifacts(DefaultConfiguration.java:1059)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.access$3100(DefaultConfiguration.java:993)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationArtifactCollection.ensureResolved(DefaultConfiguration.java:1505)
	... 102 more
Caused by: org.gradle.internal.component.NoMatchingConfigurationSelectionException: Unable to find a matching variant of test.nebula:a:1.1.1-rc.1:
  - Variant 'compile':
      - Found org.gradle.component.category 'library' but wasn't required.
      - Required org.gradle.status 'release' and found incompatible value 'candidate'.
      - Found org.gradle.usage 'java-api' but wasn't required.
  - Variant 'enforced-platform-compile':
      - Found org.gradle.component.category 'enforced-platform' but wasn't required.
      - Required org.gradle.status 'release' and found incompatible value 'candidate'.
      - Found org.gradle.usage 'java-api' but wasn't required.
  - Variant 'enforced-platform-runtime':
      - Found org.gradle.component.category 'enforced-platform' but wasn't required.
      - Required org.gradle.status 'release' and found incompatible value 'candidate'.
      - Found org.gradle.usage 'java-runtime' but wasn't required.
  - Variant 'platform-compile':
      - Found org.gradle.component.category 'platform' but wasn't required.
      - Required org.gradle.status 'release' and found incompatible value 'candidate'.
      - Found org.gradle.usage 'java-api' but wasn't required.
  - Variant 'platform-runtime':
      - Found org.gradle.component.category 'platform' but wasn't required.
      - Required org.gradle.status 'release' and found incompatible value 'candidate'.
      - Found org.gradle.usage 'java-runtime' but wasn't required.
  - Variant 'runtime':
      - Found org.gradle.component.category 'library' but wasn't required.
      - Required org.gradle.status 'release' and found incompatible value 'candidate'.
      - Found org.gradle.usage 'java-runtime' but wasn't required.
	at org.gradle.internal.component.model.AttributeConfigurationSelector.selectConfigurationUsingAttributeMatching(AttributeConfigurationSelector.java:46)
	at org.gradle.internal.component.model.LocalComponentDependencyMetadata.selectConfigurations(LocalComponentDependencyMetadata.java:133)
	at org.gradle.internal.component.local.model.DslOriginDependencyMetadataWrapper.selectConfigurations(DslOriginDependencyMetadataWrapper.java:60)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.calculateTargetConfigurations(EdgeState.java:184)
	... 123 more

  - Required org.gradle.status 'release' and found incompatible value 'candidate'.

Ideally, we should be able to set the status to candidate.

Platform Artifact Support

project: https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/excludes-in-bom

Excludes within BOM

A dependency that is excluded within a bom ends up brought in anyway.

BOM

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.0.7.RELEASE</version>
            
            <exclusions>
                <exclusion>
                    <groupId>org.yaml</groupId>
                    <artifactId>snakeyaml</artifactId>
                </exclusion>
            </exclusions>
            
        </dependency>
    </dependencies>
</dependencyManagement>

build.gradle

dependencies {
  implementation 'nebulatest:nebulabom:1.0.0'       // recommends a version of spring-beans excluding snakeyaml
  implementation 'org.springframework:spring-beans' // expecting snakeyaml to be excluded
  implementation 'org.yaml:snakeyaml:1.19'          // snakeyaml loses to spring-bean's snakeyaml
}

Dependencies Resolved

$ ./gradlew -q dependencies --configuration compileClasspath

------------------------------------------------------------
Root project
------------------------------------------------------------

compileClasspath - Compile classpath for source set 'main'.
+--- nebulatest:nebulabom:1.0.0
|    \--- org.springframework:spring-beans:5.0.7.RELEASE
|         +--- org.springframework:spring-core:5.0.7.RELEASE
|         |    \--- org.springframework:spring-jcl:5.0.7.RELEASE
|         \--- org.yaml:snakeyaml:1.20                           <-- expected to be excluded
+--- org.springframework:spring-beans -> 5.0.7.RELEASE (*)
\--- org.yaml:snakeyaml:1.19 -> 1.20

(*) - dependencies omitted (listed previously)

Ideally I'd like to be able to craft a BOM that can exclude all the known edges that bring in a problematic dependency. Is it expected this would not work today?

I suspect this may be because dependencyManagement maps to DependencyConstraint, which doesn't have any exclude abilities, but wanted to check.

Dependencies are not aligned when bom is used

Dependencies which are marked to belong to the same group and forced to downgrade have are not aligned in this case.

You can see this output ./gradlew dependencies --configuration compile

compile - Dependencies for source set 'main' (deprecated, use 'implementation' instead).
+--- example:bom:1.0
|    +--- example:platform:2.0
|    |    \--- example:transitive1:1.0
|    |         \--- example:transitive2:1.0
|    |              \--- com.fasterxml.jackson.datatype:jackson-datatype-guava:2.2.0 -> 2.9.6
|    +--- com.fasterxml.jackson.datatype:jackson-datatype-joda:2.9.6 -> 2.8.6
|    \--- com.fasterxml.jackson.datatype:jackson-datatype-guava:2.9.6
+--- example:dependency1:1.0
|    \--- example:platform:1.0 -> 2.0 (*)
\--- example:dependency2:1.0
     +--- com.fasterxml.jackson.datatype:jackson-datatype-joda:2.9.6 -> 2.8.6
     \--- com.fasterxml.jackson.datatype:jackson-datatype-guava:2.9.6

I would expect all dependencies at the 2.8.6 version. Full example project https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/broken-alignment-with-bom.

Interesting facts are:

  • When bom is causing the upgrade of platform from 1.0 to 2.0 then I see the problem. Direct dependency on platform:2.0 instead example:dependency1:1.0 doesn't have this problem.
  • It seems that even depth of transitive dependencies in platform is playing a role. When platform directly depended on jackson-datatype-guava:2.2.0 I was getting the right version.

IMPROVED_POM_SUPPORT: Excludes on first-order overwritten by transitive

Example project: https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/consumer-excludes-with-bom

Given a build file with dependencies declared like this:

dependencies {
  implementation('org.springframework:spring-beans:5.0.6.RELEASE') { // depends on snakeyaml 1.20
    exclude group: 'org.yaml', module: 'snakeyaml'
  }
  implementation 'nebulatest:mylib:latest.release' // depends on snakeyaml:1.19 and spring-beans:5.0.6.RELEASE
}

I would expect spring-beans opinion of snakeyaml to not participate in conflict resolution since it has been excluded, resulting in 1.19 of snakeyaml.

Without IMPROVED_POM_SUPPORT

$ ./gradlew -DimprovedPom=false -q dependencies --configuration compileClasspath

------------------------------------------------------------
Root project
------------------------------------------------------------

compileClasspath - Compile classpath for source set 'main'.
+--- org.springframework:spring-beans:5.0.6.RELEASE
|    \--- org.springframework:spring-core:5.0.6.RELEASE
|         \--- org.springframework:spring-jcl:5.0.6.RELEASE
\--- nebulatest:mylib:latest.release -> 1.0.1
     +--- org.yaml:snakeyaml:1.19                                                    <-- expected
     \--- org.springframework:spring-beans:5.0.6.RELEASE (*)

(*) - dependencies omitted (listed previously)

With IMPROVED_POM_SUPPORT

$ ./gradlew -DimprovedPom=true -q dependencies --configuration compileClasspath

------------------------------------------------------------
Root project
------------------------------------------------------------

compileClasspath - Compile classpath for source set 'main'.
+--- org.springframework:spring-beans:5.0.6.RELEASE
|    +--- org.springframework:spring-core:5.0.6.RELEASE
|    |    \--- org.springframework:spring-jcl:5.0.6.RELEASE
|    \--- org.yaml:snakeyaml:1.20                                                           <-- not expected
\--- nebulatest:mylib:latest.release -> 1.0.1
     +--- org.yaml:snakeyaml:1.19 -> 1.20
     \--- org.springframework:spring-beans:5.0.6.RELEASE (*)

(*) - dependencies omitted (listed previously)

Dependency insight: Rejections do not show up as a contributor when user has not selected a dynamic version

Scenario

Given a build file containing a dependency with a rejection and non-dynamic version selection:

dependencies {
    compile 'com.google.guava:guava:18.0'
}

import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionSelectorScheme
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator
configurations.all {
    resolutionStrategy.componentSelection.all({ selection ->
        def candidate = selection.candidate
        def rejectionMessage = '✭ rejection of com.google.guava:guava:16.0.1'
        if (candidate.group == 'com.google.guava' && candidate.module == 'guava') {
            def comparator = new DefaultVersionComparator()
            def scheme = new DefaultVersionSelectorScheme(comparator)

            def versionSelector = scheme.parseSelector('16.0.1')
            if (candidate.version == null || candidate.version == '' || versionSelector.accept(candidate.version)) {
                selection.reject(rejectionMessage)
            }
        }
    })
}

when I run ./gradlew dependencyInsight --dependency guava
with Gradle 4.10-20180801000007+0000

then I should see the final version as 18.0 (which I do)
and I should see a selection reason as Rejection : 16.0.1 by rule because... (which I do not)
Note: See full output below

Example Project

Please see the whole example project at dependency-insight/docs/reject/reject-static/input


Current output for reference

> Task :dependencyInsight
com.google.guava:guava:18.0
   variant "compile" [
      org.gradle.status = release (not requested)
      org.gradle.usage  = java-api
   ]

com.google.guava:guava:18.0
\--- compileClasspath

Alignment: dependencies are not aligned when there is a force in place

Scenario

Given a build file containing a dependency with an alignment and a force:

dependencies {
    compile 'org.slf4j:slf4j-api:1.6.0'
    compile 'org.slf4j:slf4j-simple:1.7.20'
}

configurations.all {
    resolutionStrategy {
        force 'org.slf4j:slf4j-api:1.5.0'
    }
}

project.dependencies.components.all(AlignJackson.class)

class AlignJackson implements ComponentMetadataRule {
    void execute(ComponentMetadataContext ctx) {
        ctx.details.with { it ->
            if (it.getId().getGroup().startsWith("org.slf4j")) {
                it.belongsTo("org.slf4j:slf4j-platform:${it.getId().getVersion()}")
            }
        }
    }
}

when I run ./gradlew dependencyInsight --dependency slf4j
with Gradle 4.10-20180801000007+0000

then I should see the final version as 1.5.0 for all dependencies (which I do not)
because the single force to 1.5.0 should have pushed the dependency platform down to this version.
Note: See full output below

Example Project

Please see the whole example project at dependency-insight/docs/alignment/alignment-static-direct-force/input


Current output for reference

Tasks: dependencyInsight --dependency slf4j-api

> Task :dependencyInsight
org.slf4j:slf4j-api:1.5.0
   variant "compile" [
      org.gradle.status = release (not requested)
      org.gradle.usage  = java-api
   ]
   Selection reasons:
      - Was requested
      - Forced
      - By constraint : belongs to platform org.slf4j:slf4j-platform:1.7.20

org.slf4j:slf4j-api:1.6.0 -> 1.5.0
\--- compileClasspath

org.slf4j:slf4j-api:1.7.20 -> 1.5.0
\--- org.slf4j:slf4j-simple:1.7.20
     +--- compileClasspath
     \--- compileClasspath

Tasks: dependencyInsight --dependency slf4j-simple

> Task :dependencyInsight
org.slf4j:slf4j-simple:1.7.20
   variant "compile" [
      org.gradle.status = release (not requested)
      org.gradle.usage  = java-api
   ]
   Selection reasons:
      - Was requested
      - By constraint : belongs to platform org.slf4j:slf4j-platform:1.7.20

org.slf4j:slf4j-simple:1.7.20
\--- compileClasspath

Higher version transitive doesn't align its parent dependency.

I found the following situation. netflix:exampleapp-client:80.0.139 depends on netflix:exampleapp-common:80.0.154. Modules exampleapp-* are aligned. It causes upgrade of netflix:exampleapp-client to 80.0.154 which depends on a higher version of common and the situation repeats. With our resolution rules it converges to this situation:

compile - Dependencies for source set 'main' (deprecated, use 'implementation' instead).
\--- netflix:exampleapp-client:80.0.139 -> 80.0.236
     +--- netflix:exampleapp-common:80.0.260
     \--- netflix:exampleapp-smart-client:80.0.21
          \--- netflix:exampleapp-model:80.0.15

However, with belongsTo based implementation, it stops sooner. netflix:exampleapp-common:80.0.249 is not causing an upgrade of netflix:exampleapp-client to the closest possible version which should be 80.0.236

compile - Dependencies for source set 'main' (deprecated, use 'implementation' instead).
\--- netflix:exampleapp-client:80.0.139 -> 80.0.225
     +--- netflix:exampleapp-common:80.0.249
     \--- netflix:exampleapp-smart-client:80.0.10

Complete example: https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/non-upgraded-dependency-by-alignment

You can comment out:

components.all { ComponentMetadataDetails details ->
    if (details.id.name.startsWith('exampleapp')) {
        details.belongsTo("aligned-platform:exampleapp:${details.id.version}")
    }
}

and uncomment:

resolutionRules files('alignment-rule.json')

to see how our plugin behaves.

Removed Configuration has lockfile left behind on regeneration

Given a buildfile such as:

apply plugin: 'java'
apply plugin: 'checkstyle'

dependencyLocking { 
    lockAllConfigurations()
}

repositories { jcenter() }

dependencies {
    testImplementation 'junit:junit:4.12'
}

When ./gradlew --write-locks dependencies is executed, a lockfile is generated as expected for each configure.
However when the checkstyle plugin is removed (and its checkstyle configuration disppears) and ./gradlew --write-locks dependencies is executed, the files are not removed.

Dependency insight: exclusions do not have any selection reasons

This is a two-part issue:

  • Exclusions do not provide a selection reason on their own
  • Exclusions remove all other selection reasons from dependency insight

Scenario

Given a build file containing a dependency with a substitution and an exclusion:

dependencies {
    compile 'io.netty:netty-all:4.1.20.FINAL'
}

def substitutionMessage = '✭ substitution io.netty:netty-all -> io.netty:netty-common:4.1.23.Final'
configurations.all {
    resolutionStrategy.dependencySubstitution {
        substitute module('io.netty:netty-all') because (substitutionMessage) with module('io.netty:netty-common:4.1.23.Final')
    }
}

def exclusionMessage = '✭ exclusion io.netty:netty-all'
configurations.all {
    exclude group: 'io.netty', module: 'netty-all'
}

when I run ./gradlew dependencyInsight --dependency netty
with Gradle 4.10-20180801000007+0000

then I should see no final version selected (which I do)
and I should see a selection reason as excluded (which I do not)
and I should see a selection reason as substitution (which I do not), letting me know that the substitution added to the selection, but was not the final chosen version
Note: See full output below

Example Project

Please see the whole example project at dependency-insight/docs/exclude/exclude-substitute-static/input

An example project with a force is at dependency-insight/docs/exclude/exclude-static-force/input


Current output for reference

> Task :dependencyInsight
No dependencies matching given input were found in configuration ':compileClasspath'

Consuming preferred dependencies is unexpected across Gradle, Maven, and Ivy metadata

Tracking gradle/gradle#7351

I'm raising this as an issue/ conversation topic as it relates to functionality not part of Ivy or Maven metadata, but an interesting user flow of:

  1. User defines preferred dependency version in a project
  2. User publishes with Maven or Ivy or Gradle metadata format
  3. User consumes dependency in another project
  4. User expects to resolve to the preferred transitive dependency version

That will have a different outcome depending on what metadata format is used.

Mainly, I'd like a discussion/ clarification/ README section that details what I should expect with these use cases.

Update lock is generating inconsistent lock with actually resolved dependencies.

I have a bom in a project and one dependency.

dependencyLocking {
    lockAllConfigurations()
}

dependencyRecommendations {
    mavenBom module: 'netflix:custom-bom:1.0'
}

dependencies {
    compile('netflix:common')
}

Steps to reproduce:

  • I generate lock via ./gradlew dependencies --write-locks
  • I update the bom to a new version netflix:custom-bom:2.0
  • I update lock via ./gradlew dependencies --update-locks 'netflix:custom-bom'
  • I run ./gradlew clean assemble and it fails with error like this.
Could not determine the dependencies of task ':compileJava'.
> Could not resolve all dependencies for configuration ':compileClasspath'.
   > Dependency lock state for configuration 'compileClasspath' is out of date:
       - Did not resolve 'org.springframework.boot:spring-boot-starter-web:2.0.3.RELEASE' which is part of the lock state

Names and examples are just illustrative. I will share a real project privately.

NPE on `incoming.resolutionResult.allDependencies` in Gradle 5.0

nebula-plugins/gradle-resolution-rules-plugin is failing a test on Gradle 5.0 nightly builds with a NullPointerException while calling incoming.resolutionResult.allDependencies from alignRule.

Steps to Reproduce

  1. git clone https://github.com/nebula-plugins/gradle-resolution-rules-plugin.git && cd gradle-resolution-rules-plugin
  2. ./gradlew wrapper --gradle-version 5.0-20180829062852+0000
  3. ./gradlew integTest --tests nebula.plugin.resolutionrules.AlignRulesPluginInteractionSpec

Stacktrace

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:dependencies'.
> Could not resolve all dependencies for configuration ':app:compileCopy'.
   > java.lang.NullPointerException (no error message)
 
* Try:
Run with --debug option to get more log output. Run with --scan to get full insights.
 
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:dependencies'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipCachedTaskExecuter.execute(SkipCachedTaskExecuter.java:105)
	at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.execute(ResolveBuildCacheKeyExecuter.java:79)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:61)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
	at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
	at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
	at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:292)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:277)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
	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: org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':app:compileCopy'.
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.wrapException(ErrorHandlingConfigurationResolver.java:103)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:75)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$5.run(DefaultConfiguration.java:533)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:524)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:509)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1800(DefaultConfiguration.java:123)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies.assertArtifactsResolved(DefaultConfiguration.java:1270)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies.access$3000(DefaultConfiguration.java:1159)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies$LenientResolutionResult.resolve(DefaultConfiguration.java:1285)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies$LenientResolutionResult.getAllDependencies(DefaultConfiguration.java:1304)
	at nebula.plugin.resolutionrules.AlignRules.selectedVersions(alignRule.kt:188)
	at nebula.plugin.resolutionrules.AlignRules.baselineAligns(alignRule.kt:115)
	at nebula.plugin.resolutionrules.AlignRules.apply(alignRule.kt:99)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin$apply$1$$special$$inlined$onResolve$1.execute(configurations.kt:22)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin$apply$1$$special$$inlined$onResolve$1.execute(configurations.kt)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:91)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:80)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy51.beforeResolve(Unknown Source)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.performPreResolveActions(DefaultConfiguration.java:582)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$500(DefaultConfiguration.java:123)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$5.run(DefaultConfiguration.java:531)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:524)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:509)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1800(DefaultConfiguration.java:123)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies.assertArtifactsResolved(DefaultConfiguration.java:1270)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies.access$3000(DefaultConfiguration.java:1159)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies$LenientResolutionResult.resolve(DefaultConfiguration.java:1285)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies$LenientResolutionResult.getRoot(DefaultConfiguration.java:1298)
	at org.gradle.api.tasks.diagnostics.internal.dependencies.AsciiDependencyReportRenderer.render(AsciiDependencyReportRenderer.java:95)
	at org.gradle.api.tasks.diagnostics.AbstractDependencyReportTask.generate(AbstractDependencyReportTask.java:65)
	at org.gradle.api.tasks.diagnostics.AbstractReportTask$2.generateReport(AbstractReportTask.java:75)
	at org.gradle.api.tasks.diagnostics.internal.ReportGenerator.generateReport(ReportGenerator.java:58)
	at org.gradle.api.tasks.diagnostics.AbstractReportTask.generate(AbstractReportTask.java:85)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:726)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:693)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)
	... 32 more
Caused by: java.lang.NullPointerException
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.getFailure(EdgeState.java:207)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.oldresult.ResolutionFailureCollector.visitNode(ResolutionFailureCollector.java:62)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.CompositeDependencyGraphVisitor.visitNode(CompositeDependencyGraphVisitor.java:39)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.CompositeDependencyGraphVisitor.visitNode(CompositeDependencyGraphVisitor.java:39)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.assembleResult(DependencyGraphBuilder.java:357)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:130)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:123)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:167)
	at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:89)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:73)
	... 96 more

Unexpected parent dependency exception when belongsTo alignment is used.

Caused by: java.lang.IllegalStateException: Unexpected parent dependency id 1419. Seen ids: [2, 2053, 1036, 1037, 1038, 2068, 2075, 2077, 2079, 2081, 2083, 2096, 2101, 2115, 2116, 71, 72, 73, 74, 75, 2123, 77, 78, 2126, 80, 81, 2129, 82, 83, 1107, 1108, 1109, 1110, 2134, 1111, 2135, 1112, 1113, 1114, 1115, 1117, 1118, 95, 1119, 96, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 2153, 1130, 2154, 1131, 1132, 1133, 1134, 111, 1135, 1136, 1137, 2161, 114, 1138, 115, 1139, 116, 1140, 2166, 2168, 1145, 1146, 2170, 1149, 2175, 1152, 2189, 2190, 151, 152, 153, 1177, 154, 155, 156, 157, 2205, 158, 159, 160, 161, 1187, 1188, 1189, 1196, 2226, 1207, 1212, 2236, 1213, 2237, 1216, 1221, 1222, 2248, 1225, 2249, 2250, 2251, 2252, 205, 1230, 2255, 210, 1235, 1238, 1245, 1246, 1255, 1261, 241, 242, 1280, 1281, 1283, 1284, 1285, 262, 1286, 1287, 264, 267, 1292, 269, 1297, 278, 281, 282, 283, 284, 285, 286, 287, 289, 290, 291, 1315, 1316, 1318, 1329, 1330, 1331, 1332, 1333, 1352, 1354, 337, 1361, 339, 1364, 341, 344, 347, 349, 351, 353, 1378, 356, 358, 1382, 1386, 363, 1389, 366, 368, 1394, 373, 1397, 375, 1400, 377, 1403, 380, 382, 1406, 385, 1409, 387, 389, 391, 393, 395, 397, 1422, 400, 402, 404, 406, 408, 410, 412, 415, 420, 1444, 1446, 423, 1448, 1454, 431, 1456, 1460, 1465, 1467, 1470, 1473, 1479, 458, 459, 461, 1486, 1491, 1492, 470, 471, 1495, 477, 478, 485, 486, 487, 492, 1518, 1519, 1520, 1521, 1524, 504, 1529, 506, 1530, 507, 1535, 514, 515, 516, 1550, 1551, 1552, 1553, 1562, 1567, 1579, 563, 564, 565, 566, 567, 1591, 568, 1592, 569, 1593, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 596, 597, 598, 599, 600, 1630, 1631, 1632, 610, 612, 1637, 617, 1642, 1643, 1648, 632, 633, 634, 635, 636, 637, 638, 1666, 1667, 1668, 645, 646, 647, 1671, 1676, 1685, 662, 1686, 663, 1687, 664, 665, 666, 667, 668, 1698, 1699, 1710, 1717, 1718, 1719, 697, 698, 1722, 699, 700, 701, 702, 703, 704, 1728, 705, 1729, 706, 707, 708, 1732, 709, 710, 718, 729, 1767, 744, 745, 1770, 752, 753, 754, 767, 768, 771, 775, 802, 1826, 805, 1829, 820, 1844, 1849, 827, 1854, 831, 1855, 1858, 1876, 1878, 1880, 1882, 1884, 1886, 1888, 1890, 1892, 1894, 871, 1896, 873, 1898, 1900, 1902, 880, 883, 1911, 1913, 890, 1914, 893, 1919, 1920, 898, 902, 904, 1929, 906, 908, 910, 1934, 1935, 912, 914, 1942, 921, 1947, 924, 928, 931, 934, 937, 944, 1972, 1973, 957, 958, 959, 960, 965, 966, 969, 1997, 974, 975, 2000, 978, 2005, 2010, 987, 988, 989, 990, 993, 996, 999, 2024, 1002, 1005, 1010, 1011, 2038, 1021, 1022]
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.oldresult.TransientConfigurationResultsBuilder.deserialize(TransientConfigurationResultsBuilder.java:192)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.oldresult.TransientConfigurationResultsBuilder.access$200(TransientConfigurationResultsBuilder.java:49)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.oldresult.TransientConfigurationResultsBuilder$6$1.read(TransientConfigurationResultsBuilder.java:135)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.oldresult.TransientConfigurationResultsBuilder$6$1.read(TransientConfigurationResultsBuilder.java:133)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.store.DefaultBinaryStore$SimpleBinaryData.read(DefaultBinaryStore.java:128)
        ... 117 more

I'm getting this exception after following calls:
GRADLE_USER_HOME=./.gradleUserHome ./gradlew -Dnebula.features.coreAlignmentSupport=false -qs gL --offline
GRADLE_USER_HOME=./.gradleUserHome ./gradlew -Dnebula.features.coreAlignmentSupport=true -qs gL --offline

ProfileListener Conditional in Gradle 5.0

Is there a way for a plugin to ensure StartParameter#setProfile(true) is always enabled from a plugin?

I've tried setting it in the plugin, and from an initscript, but both seem to be too late.

nebula-plugins/gradle-metrics-plugin relies on org.gradle.profile.ProfileListener#buildFinished(BuildProfile) being executed to get timing information and upload results (here).

gradle/gradle@946a56b changed this behavior from being always called to only called when --profile is passed.

Steps to Reproduce

  1. git clone https://github.com/nebula-plugins/gradle-metrics-plugin.git && cd gradle-metrics-plugin
  2. ./gradlew wrapper --gradle-version 5.0-20180829062852+0000
  3. ./gradlew check

Unexpected result of resolution when the same dependency is requested multiple times with different attributes

I have a direct dependency on org.junit:junit-engine-api:5.+ with release requested status attribute. I have another direct dependency org.junit:junit4-engine:5.+ with integration requested status attribute. junit4-engine will transitively bring junit-engine-api. I would assume that each leaf in the dependency graph will pick a candidate version considering requested attribute. Those versions will then conflict resolve. Now my resolution fails because the winner of conflict resolution is not able to fulfill conflicting requested attributes.

Run ./gradlew dependencies in https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/lowerStatusConflict to see this result:

+--- org.junit:junit4-engine:5.+ -> 5.0.0-SNAPSHOT
|    +--- org.junit:junit-engine-api:5.0.0-SNAPSHOT
|    |    +--- org.junit:junit-commons:5.0.0-SNAPSHOT
|    |    \--- org.opentest4j:opentest4j:1.0.0-M1
|    \--- junit:junit:4.12
|         \--- org.hamcrest:hamcrest-core:1.3
\--- org.junit:junit-engine-api:5.+ FAILED

Aligned group through belongsTo needs to be easily downgraded to a specific version

Alignment of libraries implemented in gradle-resolution-rules-plugin supports a feature that if one library from the aligned group is forced to a specific version the whole group is being aligned to that version. Gradle core has incubating feature which is doing an alignment too but doesn't currently support easy way how to downgrade the group.

Example project: https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/alignmentRulesAndForce

`CacheableRule` does not appear to be working with `ComponentMetadataRule`

Hi @ljacomet @bigdaz @melix

We were trying to implement a ComponentMetadataRule using CacheableRule.

However, it seems that the rule is not getting cache across builds and it gets executed twice.

To give an example, took the same repo we shared for the candidate issue and added the rule in there -> https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/cache-rule-issue

We have a CacheableStatusRule annotated with @CacheableRule in https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/cache-rule-issue and applying it in https://github.com/nebula-plugins/gradle-nebula-integration/blob/master/cache-rule-issue/src/main/groovy/gradle5/rc/issue/MyPlugin.groovy#L23

Then in our test we run the task build twice passing the --build-cache flag -> https://github.com/nebula-plugins/gradle-nebula-integration/blob/master/cache-rule-issue/src/test/groovy/gradle5/rc/issue/MyPluginSpec.groovy#L79

We expected the second result to not include the Executing CacheableStatusRule string in the output, however it shows up.

We also made sure that project.gradle.startParameter.buildCacheEnable is true

Please let us know if this is an issue or probably we are doing something wrong? or this isn't the expected behavior. Also if you have a better/suggested way to test CacheableRule will be much appreciated it

java.lang.RuntimeException: Problems reading data from Binary store

When I enable alignment through belongsTo resolution of dependencies fails with the following error.

Command:
GRADLE_USER_HOME=./gradleHome ./gradlew -Dnebula.features.coreAlignmentSupport=true --info --stacktrace dependencies

Result:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':dependencies'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:96)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:65)
        at org.gradle.api.internal.tasks.execution.ActionEventFiringTaskExecuter.execute(ActionEventFiringTaskExecuter.java:44)
        at org.gradle.api.internal.tasks.execution.TimeoutTaskExecuter.execute(TimeoutTaskExecuter.java:53)
        at org.gradle.api.internal.tasks.execution.SnapshotAfterExecutionTaskExecuter.execute(SnapshotAfterExecutionTaskExecuter.java:38)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:61)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
        at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
        at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:47)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:298)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:283)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
        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: org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':compile'.
        at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.wrapException(ErrorHandlingConfigurationResolver.java:103)
        at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.access$000(ErrorHandlingConfigurationResolver.java:47)
        at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver$ErrorHandlingResolutionResult.getRoot(ErrorHandlingConfigurationResolver.java:201)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies$LenientResolutionResult.getRoot(DefaultConfiguration.java:1321)
        at org.gradle.api.tasks.diagnostics.internal.dependencies.AsciiDependencyReportRenderer.render(AsciiDependencyReportRenderer.java:95)
        at org.gradle.api.tasks.diagnostics.AbstractDependencyReportTask.generate(AbstractDependencyReportTask.java:65)
        at org.gradle.api.tasks.diagnostics.AbstractReportTask$2.generateReport(AbstractReportTask.java:75)
        at org.gradle.api.tasks.diagnostics.internal.ReportGenerator.generateReport(ReportGenerator.java:58)
        at org.gradle.api.tasks.diagnostics.AbstractReportTask.generate(AbstractReportTask.java:85)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:48)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:729)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:696)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:117)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:106)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:85)
        ... 33 more
Caused by: java.lang.RuntimeException: Problems reading data from Binary store in /private/var/folders/h8/61bdkq1515sbg4w1_23zk2xh0000gn/T/gradle585131709173203072.bin (exist: true)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.store.DefaultBinaryStore$SimpleBinaryData.read(DefaultBinaryStore.java:130)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.StreamingResolutionResultBuilder$RootFactory$1.create(StreamingResolutionResultBuilder.java:174)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.StreamingResolutionResultBuilder$RootFactory$1.create(StreamingResolutionResultBuilder.java:171)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.store.CachedStoreFactory$SimpleStore.load(CachedStoreFactory.java:99)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.StreamingResolutionResultBuilder$RootFactory.create(StreamingResolutionResultBuilder.java:171)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.StreamingResolutionResultBuilder$RootFactory.create(StreamingResolutionResultBuilder.java:146)
        at org.gradle.api.internal.artifacts.result.DefaultResolutionResult.getRoot(DefaultResolutionResult.java:43)
        at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver$ErrorHandlingResolutionResult.getRoot(ErrorHandlingConfigurationResolver.java:199)
        ... 53 more
Caused by: java.lang.NullPointerException
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.DefaultResolutionResultBuilder.visitOutgoingEdges(DefaultResolutionResultBuilder.java:77)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.StreamingResolutionResultBuilder$RootFactory.deserialize(StreamingResolutionResultBuilder.java:228)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.StreamingResolutionResultBuilder$RootFactory.access$400(StreamingResolutionResultBuilder.java:146)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.StreamingResolutionResultBuilder$RootFactory$1$1.read(StreamingResolutionResultBuilder.java:176)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.StreamingResolutionResultBuilder$RootFactory$1$1.read(StreamingResolutionResultBuilder.java:174)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.store.DefaultBinaryStore$SimpleBinaryData.read(DefaultBinaryStore.java:128)
        ... 60 more

I will share a complete example project privately because it contains internal metadata. It uses vanilla Gradle with our resolution plugin. I tried to make it as small as possible.

Interesting notes:

  • there are two unusual force declarations. When they are omitted error disappears. They are affecting 2 groups which should be aligned.
  • The example uses older nightly. With newer one this project works but I have seen other projects fail even with the new one. I assume the problem is still there.

Resolution time regression with alignments rules implemented with belongsTo

We have seen a difference in resolution times between our resolution rules and belongsTo implementation. I will gather more details but so far it looks like this 2 minutes with old implementation vs 11 minutes with the new one.

The first detail which might be related. I think engine is trying to resolve the artificial module created by belongsTo (aligned-platform:align-jackson-0:2.9.5) over and over:

11:04:35.830 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver] Attempting to resolve component for aligned-platform:align-jackson-0:2.9.5 using repositories [nfrepo-everythingRepo, local, nfrepo-everything-pomMavenRepo]
11:04:35.830 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository] Cached meta-data for missing module is expired: will perform fresh resolve of 'aligned-platform:align-jackson-0:2.9.5' in 'nfrepo-everythingRepo'
11:04:35.830 [DEBUG] [org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceArtifactResolver] Loading https://repo.test.netflix.net/artifactory/nfrepo-everything/aligned-platform/align-jackson-0/2.9.5/align-jackson-0-2.9.5-ivy.xml
11:04:35.831 [DEBUG] [org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor] Constructing external resource: https://repo.test.netflix.net/artifactory/nfrepo-everything/aligned-platform/align-jackson-0/2.9.5/align-jackson-0-2.9.5-ivy.xml
11:04:35.831 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Download https://repo.test.netflix.net/artifactory/nfrepo-everything/aligned-platform/align-jackson-0/2.9.5/align-jackson-0-2.9.5-ivy.xml' started
11:04:35.831 [DEBUG] [org.gradle.internal.resource.transport.http.HttpResourceAccessor] Constructing external resource: https://repo.test.netflix.net/artifactory/nfrepo-everything/aligned-platform/align-jackson-0/2.9.5/align-jackson-0-2.9.5-ivy.xml
11:04:35.831 [DEBUG] [org.gradle.internal.resource.transport.http.HttpClientHelper] Performing HTTP GET: https://repo.test.netflix.net/artifactory/nfrepo-everything/aligned-platform/align-jackson-0/2.9.5/align-jackson-0-2.9.5-ivy.xml
11:04:35.831 [DEBUG] [org.apache.http.client.protocol.RequestAddCookies] CookieSpec selected: default
11:04:35.831 [DEBUG] [org.apache.http.client.protocol.RequestAddCookies] Cookie [version: 0][name: AWSALB][value: NeYMxCDtWNSgWYrWrIQEfMFGcajmFoMAmmxDW7YcHQzfTzuyHPJZuQEkJ6AYnrsyL9Qri0i7MN3HqJdkJgSqSOVaz2w+VUN0jitfc8AKd7nTTu4carKMkO+GlDRm][domain: repo.test.netflix.net][path: /][expiry: Thu Aug 16 11:04:35 PDT 2018] match [(secure)repo.test.netflix.net:443/artifactory/nfrepo-everything/aligned-platform/align-jackson-0/2.9.5/align-jackson-0-2.9.5-ivy.xml]
11:04:35.831 [DEBUG] [org.apache.http.client.protocol.RequestAuthCache] Auth cache not set in the context
11:04:35.831 [DEBUG] [org.apache.http.impl.conn.PoolingHttpClientConnectionManager] Connection request: [route: {s}->https://repo.test.netflix.net:443][total kept alive: 8; route allocated: 8 of 20; total allocated: 8 of 20]
11:04:35.831 [DEBUG] [org.apache.http.impl.conn.PoolingHttpClientConnectionManager] Connection leased: [id: 125][route: {s}->https://repo.test.netflix.net:443][total kept alive: 7; route allocated: 8 of 20; total allocated: 8 of 20]
11:04:35.832 [DEBUG] [org.apache.http.impl.conn.DefaultManagedHttpClientConnection] http-outgoing-125: set socket timeout to 30000
11:04:35.832 [DEBUG] [org.apache.http.impl.conn.DefaultManagedHttpClientConnection] http-outgoing-125: set socket timeout to 30000
11:04:35.832 [DEBUG] [org.apache.http.impl.execchain.MainClientExec] Executing request GET /artifactory/nfrepo-everything/aligned-platform/align-jackson-0/2.9.5/align-jackson-0-2.9.5-ivy.xml HTTP/1.1
11:04:35.832 [DEBUG] [org.apache.http.impl.execchain.MainClientExec] Target auth state: UNCHALLENGED
11:04:35.832 [DEBUG] [org.apache.http.impl.execchain.MainClientExec] Proxy auth state: UNCHALLENGED
11:04:35.832 [DEBUG] [org.apache.http.impl.conn.DefaultHttpResponseParser] Garbage in response: 0
11:04:35.832 [DEBUG] [org.apache.http.impl.conn.DefaultHttpResponseParser] Garbage in response: 
11:04:35.886 [DEBUG] [org.apache.http.impl.execchain.MainClientExec] Connection can be kept alive indefinitely

Another possibly related thing: Implementation https://github.com/nebula-plugins/gradle-resolution-rules-plugin/blob/master/src/main/kotlin/nebula/plugin/resolutionrules/alignRule.kt#L42-L54. I wanted to avoid bigger changes so I keep using current infrastructure which applies rule with belongsTo not once but multiple times per each configuration.

Force to higher patch version doesn't bring the rest of aligned group up.

I have an alignment configured for all jackson libraries. The project set force to a specific version. The version is a patch version which doesn't exist for all modules e.g: force 'com.fasterxml.jackson.core:jackson-databind:2.8.11.1'. Unfortunately, it causes that rest of libraries which doesn't have this version are not included in the alignment.

Running ./gradlew dI --dependency jackson --configuration compile --singlepath has this output:

> Task :dependencyInsight
com.fasterxml.jackson.core:jackson-annotations:2.8.0
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]

com.fasterxml.jackson.core:jackson-annotations:2.8.0
\--- com.fasterxml.jackson.core:jackson-databind:2.8.11.1
     \--- com.amazonaws:aws-java-sdk-core:1.11.438
          \--- com.amazonaws:aws-java-sdk:1.11.438
               \--- compile

com.fasterxml.jackson.core:jackson-core:2.8.10
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By conflict resolution : between versions 2.8.10 and 2.6.7

com.fasterxml.jackson.core:jackson-core:2.8.10
\--- com.fasterxml.jackson.core:jackson-databind:2.8.11.1
     \--- com.amazonaws:aws-java-sdk-core:1.11.438
          \--- com.amazonaws:aws-java-sdk:1.11.438
               \--- compile

com.fasterxml.jackson.core:jackson-core:2.6.7 -> 2.8.10
\--- com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7
     \--- com.amazonaws:aws-java-sdk-core:1.11.438
          \--- com.amazonaws:aws-java-sdk:1.11.438
               \--- compile

com.fasterxml.jackson.core:jackson-databind:2.8.11.1
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - Forced
      - By constraint : belongs to platform aligned-platform:jackson:2.8.11.1

com.fasterxml.jackson.core:jackson-databind:2.6.7.1 -> 2.8.11.1
\--- com.amazonaws:aws-java-sdk-core:1.11.438
     \--- com.amazonaws:aws-java-sdk:1.11.438
          \--- compile

com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]

com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7
\--- com.amazonaws:aws-java-sdk-core:1.11.438
     \--- com.amazonaws:aws-java-sdk:1.11.438
          \--- compile

When force is changed to force 'com.fasterxml.jackson.core:jackson-databind:2.8.11' the output is aligned

> Task :dependencyInsight
com.fasterxml.jackson.core:jackson-annotations:2.8.11
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:jackson:2.8.11
      - Forced

com.fasterxml.jackson.core:jackson-annotations:2.8.0 -> 2.8.11
\--- com.fasterxml.jackson.core:jackson-databind:2.8.11
     \--- com.amazonaws:aws-java-sdk-core:1.11.438
          \--- com.amazonaws:aws-java-sdk:1.11.438
               \--- compile

com.fasterxml.jackson.core:jackson-core:2.8.11
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:jackson:2.8.11
      - Forced

com.fasterxml.jackson.core:jackson-core:2.8.11
\--- com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.8.11
     \--- com.amazonaws:aws-java-sdk-core:1.11.438
          \--- com.amazonaws:aws-java-sdk:1.11.438
               \--- compile

com.fasterxml.jackson.core:jackson-core:2.8.10 -> 2.8.11
\--- com.fasterxml.jackson.core:jackson-databind:2.8.11
     \--- com.amazonaws:aws-java-sdk-core:1.11.438
          \--- com.amazonaws:aws-java-sdk:1.11.438
               \--- compile

com.fasterxml.jackson.core:jackson-databind:2.8.11
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - Forced
      - By constraint : belongs to platform aligned-platform:jackson:2.8.11

com.fasterxml.jackson.core:jackson-databind:2.6.7.1 -> 2.8.11
\--- com.amazonaws:aws-java-sdk-core:1.11.438
     \--- com.amazonaws:aws-java-sdk:1.11.438
          \--- compile

com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.8.11
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:jackson:2.8.11
      - Forced

com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 -> 2.8.11
\--- com.amazonaws:aws-java-sdk-core:1.11.438
     \--- com.amazonaws:aws-java-sdk:1.11.438
          \--- compile

Complete project sample https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/force-breaks-alignment

Dependency insight: "Force" selection reason does not show up when there is a recommendation in place

Scenario

Given a build file containing a dependency with a recommendation and a force:

dependencies {
    compile 'sample:bom:1.0.0'
    compile 'com.google.guava:guava'
}

configurations.all {
    resolutionStrategy {
        force 'com.google.guava:guava:14.0.1'
    }
}

and a bom containing:

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>19.0</version>
      </dependency>
  </dependencyManagement>

when I run ./gradlew dependencyInsight --dependency guava
with Gradle 4.10-20180801000007+0000

then I should see the final version as 14.0.1 (which I do)
and I should see a selection reason as Forced (which I do not)
Note: See full output below

Example Project

Please see the whole example project at dependency-insight/docs/basic/rec-force/input


Current output for reference

> Task :dependencyInsight
com.google.guava:guava:14.0.1 (via constraint)
   variant "compile" [
      org.gradle.status = release (not requested)
      org.gradle.usage  = java-api
   ]

com.google.guava:guava -> 14.0.1
\--- compileClasspath

com.google.guava:guava:19.0 -> 14.0.1
\--- sample:bom:1.0.0
     \--- compileClasspath

Dependency insight: second order contributors are missing information

Scenario

Given a build file with simplified dependencies in a local repo:

repositories {
    maven { url { 'repo' } }
}

dependencies {
    compile 'planet:earth:3.0.0'
    compile 'planet:mars:4.0.0'
    compile 'planet:jupiter:5.0.0'
}

with dependencies represented as

> Task :dependencies
compile
+--- planet:earth:3.0.0
|    \--- planet:venus:2.0.0 -> 2.0.1
|         \--- planet:mercury:1.0.1 -> 1.0.2
+--- planet:mars:4.0.0
|    \--- planet:venus:2.0.1 (*)
\--- planet:jupiter:5.0.0
     \--- planet:mercury:1.0.2

when I run ./gradlew dependencyInsight --dependency mercury
and ./gradlew dependencyInsight --dependency venus
with Gradle 4.10-20180801000007+0000

then I would expect to see an indication or more information that second-order dependencies have been conflict resolved (which I do not)

This would be ideal when I am curious who brought in a particular version of my dependency. Currently, dependencyInsight provides information suggesting that earth and mars both intended to bring in venus:2.0.1 when running dependencyInsight --dependency mercury.

Note: See full output below

Example Project

Please see the whole example project at dependency-insight/docs/misc/second-order-contributor/input


Current output for reference

  • Tasks: dependencyInsight --dependency mercury
> Task :dependencyInsight
planet:mercury:1.0.2
   Selection reasons:
      - Was requested
      - By conflict resolution : between versions 1.0.2 and 1.0.1

planet:mercury:1.0.2
\--- planet:jupiter:5.0.0
     \--- compileClasspath

planet:mercury:1.0.1 -> 1.0.2
\--- planet:venus:2.0.1
     +--- planet:earth:3.0.0
     |    \--- compileClasspath
     \--- planet:mars:4.0.0
          \--- compileClasspath

(*) - dependencies omitted (listed previously)

and I would expect to see more information listed on the line about the conflict resolution of planet:earth and planet:mars near this line:

planet:mercury:1.0.1 -> 1.0.2
\--- planet:venus:2.0.1`
  • Tasks: dependencyInsight --dependency venus
> Task :dependencyInsight
planet:venus:2.0.1
   Selection reasons:
      - Was requested
      - By conflict resolution : between versions 2.0.0 and 2.0.1

planet:venus:2.0.1
\--- planet:mars:4.0.0
     \--- compileClasspath

planet:venus:2.0.0 -> 2.0.1
\--- planet:earth:3.0.0
     \--- compileClasspath

Dependencies which have transitive=false in ivy file are not included in alignment

I have a dependency which has transitive dependencies defined in ivy file. All of them are members of the same group for alignment. However, one of them is defined with transitive=false.
<dependency org="com.netflix.governator" name="governator-jetty" rev="1.14.4" conf="compile-&gt;default" transitive="false"/>

This dependency is not added to a platform for alignment.
./gradlew dI --dependency governator --configuration compile gives the following output.

> Task :dependencyInsight
com.netflix.governator:governator-api:1.17.5
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:governator:1.17.5

com.netflix.governator:governator-api:1.17.5
\--- com.netflix.governator:governator-core:1.17.5
     +--- netflix:library:1.173
     |    \--- compile
     +--- com.netflix.governator:governator-jersey:1.17.5
     |    +--- netflix:library:1.173 (*)
     |    \--- compile
     +--- com.netflix.governator:governator-servlet:1.17.5
     |    +--- netflix:library:1.173 (*)
     |    \--- compile
     \--- compile

com.netflix.governator:governator-core:1.17.5
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - Forced
      - By constraint : belongs to platform aligned-platform:governator:1.17.5

com.netflix.governator:governator-core:1.17.5
+--- com.netflix.governator:governator-jersey:1.17.5
|    +--- netflix:library:1.173
|    |    \--- compile
|    \--- compile
\--- com.netflix.governator:governator-servlet:1.17.5
     +--- netflix:library:1.173 (*)
     \--- compile

com.netflix.governator:governator-core:1.14.4 -> 1.17.5
\--- netflix:library:1.173
     \--- compile

com.netflix.governator:governator-jersey:1.17.5
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:governator:1.17.5
      - Forced

com.netflix.governator:governator-jersey:1.14.4 -> 1.17.5
\--- netflix:library:1.173
     \--- compile

com.netflix.governator:governator-jetty:1.14.4
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]

com.netflix.governator:governator-jetty:1.14.4
\--- netflix:library:1.173
     \--- compile

com.netflix.governator:governator-providers:1.17.5
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:governator:1.17.5

com.netflix.governator:governator-providers:1.17.5
\--- com.netflix.governator:governator-jersey:1.17.5
     +--- netflix:library:1.173
     |    \--- compile
     \--- compile

com.netflix.governator:governator-servlet:1.17.5
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:governator:1.17.5
      - Forced

com.netflix.governator:governator-servlet:1.14.4 -> 1.17.5
\--- netflix:library:1.173
     \--- compile

See com.netflix.governator:governator-jetty:1.14.4

Here is the full example project https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/transitive-false-not-aligned

Dependency from aligned group included in initscript classpath and project compile configuration is not aligned

When there is an init script which configures init script classpath with a library which should be aligned it will cause misalignment of that group later when project dependencies are resolved.

some-* modules should be aligned
some-decrypt is used in nebula.gradle init script. When init script is used. The project dependencies are missaligned.

./gradlew -I nebula.gradle dependencies --configuration compile with a result:

compile - Dependencies for source set 'main' (deprecated, use 'implementation' instead).
+--- netflix.bom:runtime-platform-recommendations:4.7.15
|    \--- netflix:some-ipc-common:1.187.0
\--- netflix:common-security:latest.release -> 1.23
     \--- netflix:some-decrypt:1.140.0
          +--- netflix:some-common:1.140.0
          \--- netflix:some-ipc-common:1.140.0 -> 1.187.0

./gradlew dependencies --configuration compile has expected result:

compile - Dependencies for source set 'main' (deprecated, use 'implementation' instead).
+--- netflix.bom:runtime-platform-recommendations:4.7.15
|    \--- netflix:some-ipc-common:1.187.0
\--- netflix:common-security:latest.release -> 1.23
     \--- netflix:some-decrypt:1.140.0 -> 1.187.0
          +--- netflix:some-common:1.187.0
          \--- netflix:some-ipc-common:1.187.0

The full example project is https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/initscript-classpath-breaks-alignment

Unexpected transitive dependency in a graph when using `belongsTo` alignment

I have this project https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/unexpected-module-with-alignment where I'm getting one more dependency in my graph when I start using alignment implemented through belongsTo

./gradlew -Dnebula.features.coreAlignmentSupport=true dI --dependency com.google.protobuf:protobuf-lite --configuration compile

Returns

> Task :dependencyInsight
com.google.protobuf:protobuf-lite:3.0.1
   variant "runtime" [
      org.gradle.status = release (not requested)
      org.gradle.usage  = java-runtime (not requested)
   ]

com.google.protobuf:protobuf-lite:3.0.1
\--- io.grpc:grpc-protobuf-lite:1.10.0
     +--- compile
     \--- io.grpc:grpc-protobuf:1.10.0
          +--- compile
          \--- compile

./gradlew -Dnebula.features.coreAlignmentSupport=false dI --dependency com.google.protobuf:protobuf-lite --configuration compile

Task :dependencyInsight
No dependencies matching given input were found in configuration ':compile'

IntelliJ IDEA import fails because it is not honoring gradle.properties

We are enabling experimental features via system properties which are set in gradle.properties Those properties are read in different places. One of them is in init script. However, when IntelliJ is importing gradle project it is setting properties from gradle.properties too late and init script is already executed. Example project showing this case https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/broken-intellij-import-with-native-lock

How to reproduce

  • Assuming that you are in project directory cp init.gradle ~/.gradle/init.d/
  • ./gradlew dependencies --write-locks
  • idea . (assuming that you have IntelliJ command line launcher)
  • Click OK to finish import.

Project import fails with:

Caused by: org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':resolutionRulesCopy'.
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.wrapException(ErrorHandlingConfigurationResolver.java:103)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:75)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$5.run(DefaultConfiguration.java:533)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:524)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:509)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1800(DefaultConfiguration.java:123)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getSelectedArtifacts(DefaultConfiguration.java:1037)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getFiles(DefaultConfiguration.java:1025)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getFiles(DefaultConfiguration.java:444)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getFiles(Unknown Source)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolve(DefaultConfiguration.java:434)
	at nebula.plugin.resolutionrules.CopiedConfiguration.resolve(configurations.kt)
	at nebula.plugin.resolutionrules.NebulaResolutionRulesExtension$ruleFiles$2.invoke(plugin.kt:172)
	at nebula.plugin.resolutionrules.NebulaResolutionRulesExtension$ruleFiles$2.invoke(plugin.kt:164)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at nebula.plugin.resolutionrules.NebulaResolutionRulesExtension.getRuleFiles(plugin.kt)
	at nebula.plugin.resolutionrules.NebulaResolutionRulesExtension.ruleFiles(plugin.kt:178)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin.rulesFromConfiguration(plugin.kt:105)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin.access$rulesFromConfiguration(plugin.kt:36)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin$ruleSet$2.invoke(plugin.kt:39)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin$ruleSet$2.invoke(plugin.kt:36)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin.getRuleSet(plugin.kt)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin.access$getRuleSet$p(plugin.kt:36)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin$apply$1$$special$$inlined$onExecute$1.execute(projects.kt:19)
	at nebula.plugin.resolutionrules.ResolutionRulesPlugin$apply$1$$special$$inlined$onExecute$1.execute(projects.kt)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1$1.run(DefaultListenerBuildOperationDecorator.java:155)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.reapply(DefaultUserCodeApplicationContext.java:58)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:152)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:149)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:91)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:80)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	... 105 more
Caused by: org.gradle.internal.locking.LockOutOfDateException: Dependency lock state for configuration 'resolutionRules' is out of date: Resolved 'io.spring.platform:platform-bom:1.0.1.RELEASE' which is not part of the lock state
	at org.gradle.internal.locking.LockOutOfDateException.createLockOutOfDateException(LockOutOfDateException.java:37)
	at org.gradle.internal.locking.DependencyLockingArtifactVisitor.throwLockOutOfDateException(DependencyLockingArtifactVisitor.java:153)
	at org.gradle.internal.locking.DependencyLockingArtifactVisitor.complete(DependencyLockingArtifactVisitor.java:159)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.CompositeDependencyArtifactsVisitor.complete(CompositeDependencyArtifactsVisitor.java:73)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:178)
	at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:89)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:73)
	... 148 more

Looking at IntelliJ IDEA import process logging shows that flag for coreBomSupport is false hence it didn't exclude resolutionRules from recommending and so recommender adds bom into it. Because lock was generated from command line where it was excluded it causes missmatch.

Flag read in init script false //read from system property nebula.features.coreBomSupport

> Configure project :
coreBomSupport feature enabled //read from system property nebula.features.coreBomSupport
example-project: coreAlignmentSupport feature enabled

Resolution strategy overrides effects of alignments when used `belongsTo`

Example of difference when resolution strategy is applied. The whole project is here https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/alignmentRulesAndResolutionStrategy

With nebula implementation, a group is aligned in the end a rule effect is overridden.

Call: ./gradlew dependencyInsight --configuration compile --dependency test.nebula

test.nebula:a:1.0.0
   variant "default" [
      org.gradle.status = release (not requested)
   ]
   Selection reasons:
      - Was requested
      - Selected by rule : aligned to 1.0.0 by rules
                with reasons: nebula.resolution-rules uses: rules.json

test.nebula:a:1.0.0
\--- compile

test.nebula:b:1.0.0
   variant "default" [
      org.gradle.status = release (not requested)
   ]
   Selection reasons:
      - Was requested
      - Selected by rule : aligned to 1.0.0 by rules
                with reasons: nebula.resolution-rules uses: rules.json

test.nebula:b:0.15.0 -> 1.0.0
\--- compile

test.nebula:c:1.0.0
   variant "default" [
      org.gradle.status = release (not requested)
   ]

test.nebula:c:1.0.0
\--- compile

With gradle core based implementation module a is brought down by a rule and it causes misaligned group.

Call: ./gradlew dependencyInsight --configuration compile --dependency test.nebula -Dnebula.features.coreAlignmentSupport=true

test.nebula:a:0.15.0
   variant "default" [
      org.gradle.status = release (not requested)
   ]
   Selection reasons:
      - Was requested
      - By constraint : belongs to platform aligned-platform:rules-0:1.0.0
      - Selected by rule

test.nebula:a:1.0.0 -> 0.15.0
\--- compile

test.nebula:b:1.0.0
   variant "default" [
      org.gradle.status = release (not requested)
   ]
   Selection reasons:
      - Was requested
      - By constraint : belongs to platform aligned-platform:rules-0:1.0.0
      - By conflict resolution : between versions 0.15.0 and 1.0.0

test.nebula:b:0.15.0 -> 1.0.0
\--- compile

test.nebula:c:1.0.0
   variant "default" [
      org.gradle.status = release (not requested)
   ]
   Selection reasons:
      - Was requested
      - By constraint : belongs to platform aligned-platform:rules-0:1.0.0

test.nebula:c:1.0.0
\--- compile

Interaction between substitution and alignment

I have a rule which should align guice and I have a rule which should bring guice to 4.1.0 if it is 4.2.+. When I run this ./gradlew dI --dependency guice --configuration compile I'm getting:

> Task :dependencyInsight
com.google.inject:guice:4.2.1
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:guice:4.2.1
      - Selected by rule
      - By conflict resolution : between versions 4.2.1 and 4.1.0

com.google.inject:guice:4.2.1
\--- com.google.inject.extensions:guice-grapher:4.2.1 (conflict resolution between versions 4.1.0 and 4.2.1)
     +--- sample:module:1.0
     |    \--- compile
     \--- compile

com.google.inject:guice:4.1.0 -> 4.2.1
\--- com.google.inject.extensions:guice-assistedinject:4.1.0
     +--- com.google.inject.extensions:guice-grapher:4.2.1 (conflict resolution between versions 4.1.0 and 4.2.1)
     |    +--- sample:module:1.0
     |    |    \--- compile
     |    \--- compile
     \--- compile

com.google.inject:guice:4.+ -> 4.2.1
\--- compile

com.google.inject.extensions:guice-assistedinject:4.1.0
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:guice:4.2.1
      - Selected by rule

com.google.inject.extensions:guice-assistedinject:4.2.1 -> 4.1.0
\--- com.google.inject.extensions:guice-grapher:4.2.1 (conflict resolution between versions 4.1.0 and 4.2.1)
     +--- sample:module:1.0
     |    \--- compile
     \--- compile

com.google.inject.extensions:guice-grapher:4.2.1
   variant "runtime" [
      org.gradle.status             = release (not requested)
      org.gradle.usage              = java-runtime (not requested)
      org.gradle.component.category = library (not requested)
   ]
   Selection reasons:
      - By constraint : belongs to platform aligned-platform:guice:4.2.1
      - Selected by rule
      - By conflict resolution : between versions 4.1.0 and 4.2.1

com.google.inject.extensions:guice-grapher:4.1.0 -> 4.2.1
\--- sample:module:1.0
     \--- compile

(*) - dependencies omitted (listed previously)

A web-based, searchable dependency report is available by adding the --scan option.

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

I would assume that all guice libraries should be at 4.1.0. Here is the full sample https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/alignment-substitution-missalignment

Not aligned jetty libraries in interaction with bom and force

After running our tests I discovered the following issue (more than 100 projects affected)

We apply our BOM to all configurations including configurations created by Gretty plugin. It has a configuration with dependencies for each server it provides. One of them is Jetty 8. The plugin forces a specific version of jetty libraries in those configurations. Our BOM contains a higher version of Jetty. I see most of all libraries forced down except jetty-util. I would expect all versions same because of alignment rule.

./gradlew dependencies --configuration grettyRunnerJetty8

Results to:

grettyRunnerJetty8
+--- example:bom:1.0
|    +--- org.eclipse.jetty:jetty-io:9.2.12.v20150709 -> 8.1.8.v20121106
|    +--- org.eclipse.jetty:jetty-xml:9.2.12.v20150709 -> 8.1.8.v20121106
|    \--- org.eclipse.jetty:jetty-util:9.2.12.v20150709
\--- org.gretty:gretty-runner-jetty8:2.1.0
     +--- org.gretty:gretty-runner-jetty:2.1.0
     |    \--- org.gretty:gretty-runner:2.1.0
     |         +--- org.codehaus.groovy:groovy:2.4.13
     |         +--- org.codehaus.groovy:groovy-json:2.4.13
     |         |    \--- org.codehaus.groovy:groovy:2.4.13
     |         +--- commons-cli:commons-cli:1.2
     |         +--- commons-io:commons-io:2.4
     |         \--- ch.qos.logback:logback-classic:1.1.3
     |              +--- ch.qos.logback:logback-core:1.1.3
     |              \--- org.slf4j:slf4j-api:1.7.7
     +--- javax.servlet:javax.servlet-api:3.0.1
     +--- org.eclipse.jetty:jetty-server:8.1.8.v20121106
     |    +--- org.eclipse.jetty:jetty-continuation:8.1.8.v20121106
     |    \--- org.eclipse.jetty:jetty-http:8.1.8.v20121106
     |         \--- org.eclipse.jetty:jetty-io:8.1.8.v20121106
     +--- org.eclipse.jetty:jetty-servlet:8.1.8.v20121106
     |    \--- org.eclipse.jetty:jetty-security:8.1.8.v20121106
     |         \--- org.eclipse.jetty:jetty-server:8.1.8.v20121106 (*)
     +--- org.eclipse.jetty:jetty-webapp:8.1.8.v20121106
     |    +--- org.eclipse.jetty:jetty-xml:8.1.8.v20121106
     |    \--- org.eclipse.jetty:jetty-servlet:8.1.8.v20121106 (*)
     +--- org.eclipse.jetty:jetty-security:8.1.8.v20121106 (*)
     +--- org.eclipse.jetty:jetty-jsp:8.1.8.v20121106
     |    +--- org.eclipse.jetty.orbit:javax.servlet.jsp:2.2.0.v201112011158
     |    +--- org.eclipse.jetty.orbit:org.apache.jasper.glassfish:2.2.2.v201112011158
     |    |    \--- org.eclipse.jetty.orbit:javax.servlet.jsp:2.2.0.v201112011158
     |    +--- org.eclipse.jetty.orbit:javax.servlet.jsp.jstl:1.2.0.v201105211821
     |    |    \--- org.eclipse.jetty.orbit:javax.servlet.jsp:2.1.0.v201105211820 -> 2.2.0.v201112011158
     |    +--- org.eclipse.jetty.orbit:org.apache.taglibs.standard.glassfish:1.2.0.v201112081803
     |    |    \--- org.eclipse.jetty.orbit:javax.servlet.jsp.jstl:1.2.0.v201105211821 (*)
     |    +--- org.eclipse.jetty.orbit:javax.el:2.2.0.v201108011116
     |    +--- org.eclipse.jetty.orbit:com.sun.el:2.2.0.v201108011116
     |    \--- org.eclipse.jetty.orbit:org.eclipse.jdt.core:3.7.1
     +--- org.eclipse.jetty:jetty-annotations:8.1.8.v20121106
     |    +--- org.eclipse.jetty:jetty-plus:8.1.8.v20121106
     |    |    +--- org.eclipse.jetty.orbit:javax.transaction:1.1.1.v201105210645
     |    |    +--- org.eclipse.jetty:jetty-webapp:8.1.8.v20121106 (*)
     |    |    \--- org.eclipse.jetty:jetty-jndi:8.1.8.v20121106
     |    |         +--- org.eclipse.jetty:jetty-server:8.1.8.v20121106 (*)
     |    |         \--- org.eclipse.jetty.orbit:javax.mail.glassfish:1.4.1.v201005082020
     |    |              \--- org.eclipse.jetty.orbit:javax.activation:1.1.0.v201105071233
     |    +--- org.eclipse.jetty:jetty-webapp:8.1.8.v20121106 (*)
     |    +--- org.eclipse.jetty.orbit:javax.annotation:1.1.0.v201108011116
     |    \--- org.eclipse.jetty.orbit:org.objectweb.asm:3.1.0.v200803061910
     \--- org.eclipse.jetty:jetty-plus:8.1.8.v20121106 (*)

This is not aligned down org.eclipse.jetty:jetty-util:9.2.12.v20150709. Also, it is interesting that there is no actual usage shown in the result the only definition in BOM. jetty-util is actually brought by jetty-xml or jetty-io but that is not shown.

Here is the full example project: https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/not-aligned-jetty

If I remove recommendation grettyRunnerJetty8 platform('example:bom:1.0') from build file. I'm getting the right result.
It works even if I try to sneak higher version directly like this grettyRunnerJetty8 'org.eclipse.jetty:jetty-util:9.2.12.v20150709'

Dependency insight: show 'critical path' in conflict resolution

Introduction

This is a request related to issue #9

When running dependencyInsight, a second-order contributor now shows it is conflict resolved, and it does this with --singlepath, as well.

However, for both the full dependencyInsight as well as the less noisy --singlepath, the 'critical path' or 'effective path' to the dependency that originally requested the conflict-resolved version does not stand out. It is useful to know who has introduced this dependency so that it may be dealt with when required.

Scenario

Given a build file with simplified dependencies in a local repo:

repositories {
    maven { url { 'repo' } }
}

dependencies {
    compile 'planet:earth:3.0.0'
    compile 'planet:mars:4.0.0'
    compile 'planet:jupiter:5.0.0'
}

with dependencies represented as

> Task :dependencies
compile
+--- planet:earth:3.0.0
|    \--- planet:venus:2.0.0 -> 2.0.1
|         \--- planet:mercury:1.0.1 -> 1.0.2
+--- planet:mars:4.0.0
|    \--- planet:venus:2.0.1 (*)
\--- planet:jupiter:5.0.0
     \--- planet:mercury:1.0.2

when I run ./gradlew dependencyInsight --dependency mercury
or ./gradlew dependencyInsight --dependency mercury --singlepath
with Gradle 4.11-20180816235912+0000

then I would expect to see an information that second-order dependencies have been conflict resolved with emphasis on the critical contributor

Note: See full output below

Example Project

Please see the whole example project at dependency-insight/docs/misc/second-order-contributor/input


Current output for reference

  • Tasks: dependencyInsight --dependency mercury
> Task :dependencyInsight
planet:mercury:1.0.2
   Selection reasons:
      - By conflict resolution : between versions 1.0.2 and 1.0.1

planet:mercury:1.0.2
\--- planet:jupiter:5.0.0
     \--- compileClasspath

planet:mercury:1.0.1 -> 1.0.2
\--- planet:venus:2.0.1 (conflict resolution between versions 2.0.0 and 2.0.1)
     +--- planet:earth:3.0.0
     |    \--- compileClasspath
     \--- planet:mars:4.0.0
          \--- compileClasspath

Where it is not clear which of earth or mars is the critical contributor of the conflict-resolved dependency

  • Tasks: dependencyInsight --dependency mercury --singlepath
> Task :dependencyInsight
planet:mercury:1.0.2
   Selection reasons:
      - By conflict resolution : between versions 1.0.2 and 1.0.1

planet:mercury:1.0.2
\--- planet:jupiter:5.0.0
     \--- compileClasspath

planet:mercury:1.0.1 -> 1.0.2
\--- planet:venus:2.0.1 (conflict resolution between versions 2.0.0 and 2.0.1)
     \--- planet:earth:3.0.0
          \--- compileClasspath

However earth is not the original requester of this dependency version, as seen below

  • Tasks: dependencyInsight --dependency venus
> Task :dependencyInsight
planet:venus:2.0.1
   Selection reasons:
      - By conflict resolution : between versions 2.0.0 and 2.0.1

planet:venus:2.0.1
\--- planet:mars:4.0.0
     \--- compileClasspath

planet:venus:2.0.0 -> 2.0.1
\--- planet:earth:3.0.0
     \--- compileClasspath

Deprecated libraries - Modules deprecated outside of .module file are not resolving correctly

The lifecycle plugin dependency-management-sample contains a demo on how modules can be selected based on their lifecycle status of alive, deprecated, or blacklisted.

In the demo, these attributes are added in the dependency's .module file.

Upon publishing, modules are not going to list themselves with a deprecated or blacklisted lifecycle, so I want to see what this looks like when these attributes are updated later (as through from an external service). There are some unexpected results in plugin-deprecation-insight-[alive/deprecated].sample.out in the fork dependency-management-samples with an update where the highest version available is requested, and then the build fails.

What else needs to be done to resolve the dependency when the attributes are updated outside of the module metadata?

Dependency is downgraded and breaks alignment

With core alignment implementation I see this com.amazonaws:aws-java-sdk-kms:1.11.315 -> 1.11.251 with nebula implementation it is com.amazonaws:aws-java-sdk-kms:1.11.315. The rule for alignment has following patern.

{
    "name": "align-aws-java-sdk",
    "group": "com.amazonaws",
    "includes": ["aws-java-sdk", "aws-java-sdk-.*"],
    "excludes": ["aws-java-sdk-(handwritten-samples|sample-extractor|samples-pom|generated-samples|samples|archetype|swf-libraries)"],
    "reason": "Align AWS Java SDK libraries",
    "author": "Danny Thomas <[email protected]>",
    "date": "2016-04-28T22:31:14.321Z"
}

The whole project example project: https://github.com/nebula-plugins/gradle-nebula-integration/tree/master/alignment-broken-by-downgrade-from-spring-bom

I guess it boils down to this issue #11. I wanted to highlight this case because it involves spring recommendations and there might a difference in opinions who should be the last.

Commands to reproduce

./gradlew -Dnebula.features.coreAlignmentSupport=true dependencies --configuration compile

compile - Dependencies for source set 'main' (deprecated, use 'implementation' instead).
\--- org.springframework.cloud:spring-cloud-aws-core -> 2.0.0.RC1
     +--- org.springframework:spring-beans:5.0.5.RELEASE
     |    \--- org.springframework:spring-core:5.0.5.RELEASE
     |         \--- org.springframework:spring-jcl:5.0.5.RELEASE
     +--- org.springframework:spring-aop:5.0.5.RELEASE
     |    +--- org.springframework:spring-beans:5.0.5.RELEASE (*)
     |    \--- org.springframework:spring-core:5.0.5.RELEASE (*)
     +--- com.amazonaws:aws-java-sdk-core:1.11.251 -> 1.11.315
     |    +--- org.apache.httpcomponents:httpclient:4.5.5
     |    |    +--- org.apache.httpcomponents:httpcore:4.4.9
     |    |    \--- commons-codec:commons-codec:1.10
     |    +--- software.amazon.ion:ion-java:1.0.2
     |    +--- com.fasterxml.jackson.core:jackson-databind:2.6.7.1 -> 2.9.3
     |    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0
     |    |    \--- com.fasterxml.jackson.core:jackson-core:2.9.3
     |    +--- com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 -> 2.9.3
     |    |    \--- com.fasterxml.jackson.core:jackson-core:2.9.3
     |    \--- joda-time:joda-time:2.8.1
     +--- com.amazonaws:aws-java-sdk-s3:1.11.251 -> 1.11.315
     |    +--- com.amazonaws:aws-java-sdk-kms:1.11.315 -> 1.11.251
     |    |    +--- com.amazonaws:aws-java-sdk-core:1.11.251 -> 1.11.315 (*)
     |    |    \--- com.amazonaws:jmespath-java:1.11.251
     |    |         \--- com.fasterxml.jackson.core:jackson-databind:2.6.7.1 -> 2.9.3 (*)
     |    +--- com.amazonaws:aws-java-sdk-core:1.11.315 (*)
     |    \--- com.amazonaws:jmespath-java:1.11.315 -> 1.11.251 (*)
     +--- com.amazonaws:aws-java-sdk-ec2:1.11.251 -> 1.11.315
     |    +--- com.amazonaws:aws-java-sdk-core:1.11.315 (*)
     |    \--- com.amazonaws:jmespath-java:1.11.315 -> 1.11.251 (*)
     +--- com.amazonaws:aws-java-sdk-cloudformation:1.11.251 -> 1.11.315
     |    +--- com.amazonaws:aws-java-sdk-core:1.11.315 (*)
     |    \--- com.amazonaws:jmespath-java:1.11.315 -> 1.11.251 (*)
     \--- org.slf4j:slf4j-api:1.7.25

./gradlew -Dnebula.features.coreAlignmentSupport=false dependencies --configuration compile

compile - Dependencies for source set 'main' (deprecated, use 'implementation' instead).
\--- org.springframework.cloud:spring-cloud-aws-core -> 2.0.0.RC1
     +--- org.springframework:spring-beans:5.0.5.RELEASE
     |    \--- org.springframework:spring-core:5.0.5.RELEASE
     |         \--- org.springframework:spring-jcl:5.0.5.RELEASE
     +--- org.springframework:spring-aop:5.0.5.RELEASE
     |    +--- org.springframework:spring-beans:5.0.5.RELEASE (*)
     |    \--- org.springframework:spring-core:5.0.5.RELEASE (*)
     +--- com.amazonaws:aws-java-sdk-core:1.11.251 -> 1.11.315
     |    +--- org.apache.httpcomponents:httpclient:4.5.5
     |    |    +--- org.apache.httpcomponents:httpcore:4.4.9
     |    |    \--- commons-codec:commons-codec:1.10
     |    +--- software.amazon.ion:ion-java:1.0.2
     |    +--- com.fasterxml.jackson.core:jackson-databind:2.6.7.1 -> 2.9.3
     |    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -> 2.9.3
     |    |    \--- com.fasterxml.jackson.core:jackson-core:2.9.3
     |    +--- com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 -> 2.9.3
     |    |    \--- com.fasterxml.jackson.core:jackson-core:2.9.3
     |    \--- joda-time:joda-time:2.8.1
     +--- com.amazonaws:aws-java-sdk-s3:1.11.251 -> 1.11.315
     |    +--- com.amazonaws:aws-java-sdk-kms:1.11.315
     |    |    +--- com.amazonaws:aws-java-sdk-core:1.11.315 (*)
     |    |    \--- com.amazonaws:jmespath-java:1.11.315 -> 1.11.251
     |    |         \--- com.fasterxml.jackson.core:jackson-databind:2.6.7.1 -> 2.9.3 (*)
     |    +--- com.amazonaws:aws-java-sdk-core:1.11.315 (*)
     |    \--- com.amazonaws:jmespath-java:1.11.315 -> 1.11.251 (*)
     +--- com.amazonaws:aws-java-sdk-ec2:1.11.251 -> 1.11.315
     |    +--- com.amazonaws:aws-java-sdk-core:1.11.315 (*)
     |    \--- com.amazonaws:jmespath-java:1.11.315 -> 1.11.251 (*)
     +--- com.amazonaws:aws-java-sdk-cloudformation:1.11.251 -> 1.11.315
     |    +--- com.amazonaws:aws-java-sdk-core:1.11.315 (*)
     |    \--- com.amazonaws:jmespath-java:1.11.315 -> 1.11.251 (*)
     \--- org.slf4j:slf4j-api:1.7.25

Native lock and IDE integration

IntelliJ IDEA is usually trying to refresh a project after a build file update. When you update a dependency and don't write the change into lock file, gradle fails that there is a mismatch between lock file and build file. Those two features together are causing a poor user experience because after the dependency update IDE calls Gradle which fails and project refresh fails.

Build-scans plugin 1.x breaks with gradle 5

Hi folks,

I noticed the following error when using build scans plugin 1.x

java.lang.NoClassDefFoundError: org/gradle/internal/operations/notify/BuildOperationNotificationListener2
        at com.gradle.scan.plugin.internal.i.i.a(SourceFile:19)
        at com.gradle.scan.plugin.internal.i.g.a(SourceFile:45)
        at com.gradle.scan.plugin.internal.i.g.a(SourceFile:25)
        at com.gradle.scan.plugin.BuildScanPlugin.a(SourceFile:448)
        at com.gradle.scan.plugin.BuildScanPlugin.a(SourceFile:416)
        at com.gradle.scan.plugin.BuildScanPlugin.apply(SourceFile:257)
        at com.gradle.scan.plugin.BuildScanPlugin.apply(SourceFile:130)
        at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:42)
        at org.gradle.api.internal.plugins.RuleBasedPluginTarget.applyImperative(RuleBasedPluginTarget.java:50)

Looks like the change was introduced on this pull request -> https://github.com/gradle/gradle/pull/7023/files

I guess is expected that gradle 5 uses build-scans 2.+ ?

Right now we can't introduce this RC as part of our workflow because it would break backwards compatibility since build scans 2.x is not compatible with Gradle 5. Specially if we introduce this in nebula plugin-plugin which is the base for multiple plugins and also provides build scan to projects using nebula

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.