Exciting new Buildship Features coming up

##Composite Build Support in Buildship

We are currently working on a new Buildship release that will include support for
composite builds. This will allow Buildship to substitute dependencies and
de-duplicate project names across the whole workspace.

###What is a Composite Build?

The new composite build feature in Gradle will allow you to handle several distinct
Gradle builds as if they were one big multi-project build. This shortens the turnaround
when you need to work on several projects which are normally developed separately.

Letā€™s assume you have written a Java library lib, used by many of your applications.
You find a bug which only manifests itself in the special-app. The current workflow
would be to change some code in lib and install a snapshot into the local repository.
Then you would have to change the build script of special-app to use that new
snapshot and check if the bug is actually fixed.

With composite builds you can tell Gradle to treat both of these projects as one.
This will let special-app depend directly on the output of the lib project.

###What does that mean for Buildship?

Buildship will be the first tool to benefit from the new composite build API. Once
implemented, Buildship will automatically replace external dependencies with project
dependencies. The matching will be done based on the projectā€™s publications. So if
you have a project called lib which publishes an artifact with the coordinates
my.org:lib and you have a project special-app which has a dependency
on my.org:lib, then special-app will depend on the lib project if it is also in the Eclipse workspace.

Apart from dependency substitution, Buildship will also de-duplicate project names
across all Gradle builds in the workspace. So if you have two projects called foo and bar
and both of them have a subproject called api, then the corresponding Eclipse projects
will be called foo-api and bar-api.

As a nice side effect of this work, Buildship will also detect if the name of a Gradle
project has changed and rename the corresponding Eclipse project in the workspace.

###How can I give it a try?

The composite build feature is currently incubating. We are planning to release
it as part of Eclipse Neon. Your feedback is highly appreciated. It will help us
make this feature rock solid, so it can be activated by default.

We have set up a milestone update site from which you can consume the current state
of Buildship 2.0. So far we have implemented name de-duplication and project renaming.
We will follow up in this thread once dependency substitution is in place.

1 Like

This is great news and sounds akin to the resolve workspace artifacts feature in m2e

Exactly what I was thinking, something that visibly provides more parity with M2E, outside of Gradle-specific functionality. Now perhaps the ability to search for artifact names in defined repositories is the only remaining reason to keep a Maven project in my workspace. :slight_smile:

1 Like

Canā€™t say Iā€™ve ever used that feature. The killer feature Iā€™m missing from M2E is the dependency hierarchy tab

1 Like

Nice, Iā€™ve been waiting this for a long time. Actually I implemented ā€œComposite Buildā€ 13 months ago ( Build fails when root project includes subprojects of another multi-module project ), but back then i needed 2 hacks/workarounds to accomplish it. I was glad to see, that Dependency Substitution feature was implemented 6 months after that and now the final piece for IDE is about to arrive (my workaround for the IDE required setting system property through eclipse plugin that the build script used to decide if project dependency is added through eclipse classpath or should it be included from another rootproject). Nice work!

1 Like

This is great news ! Will the dependency substitution also work for WARs ? That is will the Eclipse deployment also pick up the project?

Yes that should work just the same. The substitution happens in Gradle
Core, so it will behave just as if you replaced the external depenency with
a project dependency.

Hi,
I downloaded Eclipse Neon M1 and installed the buildship milestone to try it out.

I created a sample webapp and added a dependency on an artifact (my.org:lib). When I then imported the project for ā€˜my.org:libā€™ and re-ran the eclipse task, my JRE lib became unbound.

So next I decided to delete the projects and import ā€˜my.org:libā€™ project first and then my war project (special-app). But the classpath still uses the jar artifact from my repository and not the project.

Am I performing the steps in the right order?
Thanks in advance for any pointers !

Dependency substitution is not yet implemented. See my original post for details of what is there and what isnā€™t yet.

Ok, got it ! Need to be patient for a while longer ā€¦

Will this allow m2e Maven projects to be substituted as dependencies of Gradle projects too?

No, it will not support Maven projects. The composite feature only works with Gradle builds. The heavy-lifting will be done on the Gradle core side which is unaware of Maven projects.

The general architecture of the composite build feature would allow other kinds of projects, e.g. Maven projects. We briefly discussed this internally, but have no concrete plans for it at the moment.

1 Like

We have decided that these exciting new features are worth a major version update, with Buildship 2.0 to be released within the next two weeks. This version will provide name de-duplication across all imported Gradle builds. Dependency substitution will soon follow in a Buildship 2.1 release.

The 2.x releases will not be part of Eclipse Neon this summer. Instead, we will be contributing Buildship 1.0.15 to Neon. Buildship 2.x will be available through the market place and our update sites. We will add it to the Neon.1 update in autumn.

This will give our great community some time to battle-test the new features and give us valuable feedback. We are especially keen on hearing about the performance of Buildship 2.0 in your environment, since composite build requires all project models to be fetched together. We have put a lot of effort into optimizing this both on the Gradle Core and on the Buildship side.

Please change your update site to try out the latest milestone. For optimum performance, we recommend you also try out the latest Gradle release candidate. Please let us know how you liked the new Buildship milestone in this thread.

Hi,
I tried the current Milestone, but until I have to import all projects from a multibuild project you wonā€™t get me!

Regards,
Jan

We have added the dependency substitution feature to the latest 2.0 milestone. If a project has a binary dependency on another project and both are in the workspace, then the binary dependency will be replaced with a project dependency.

Please note that for this to work, all the builds in the workspace need to

  • have exactly the same Gradle version
  • use Gradle >= 2.14-rc-1

The substitution is currently based on project.name and project.group.

Any chance we are getting a similar feature for IntelliJ, or as an IDE-agnostic plugin?

This would solve a major pain point for my team who is working on a micro-service application where each service is a different gradle project residing in a different git repo.

It would be awesome to get automatic dependency substitution for non-eclipse developers.
Canā€™t this be done by an IDE-agnostic gradle plugin which creates a composite project?

I am trying the latest milestone in my current setup but I am still not getting the project dependencies being set up. Is there any documentation/example to test composite builds?

There will be a possibility to define composite builds in a settings.gradle file and import those into Eclipse and IntelliJ.

Have you made sure that all projects are using the same Gradle version >= 2.14?

Hi
Iā€™ve just tried the buildship 2.0 from milestone update site and with gradle 2.14

We have an in-house plugin that resolves dependencies that is read from the file.
Now, if I have a project1 that contains file with dependencies, and a project 2 that uses our in house plugin and refers to the file in the following way:

dependencyManagement {
  importConf "com.xebialabs.xl-platform:xl-rence:${xlPlatformVersion}"
}

I get the following exception:

Synchronize Gradle projects with workspace failed due to multiple errors.
Could not fetch models of type 'EclipseProject' using Gradle daemon composite connection.

Build file '/Users/ilx/work/xebialabs/xl-release/build.gradle' line: 43
A problem occurred evaluating root project 'xl-release'.
Could not resolve all dependencies for configuration 'detachedConfiguration1'.
Could not find xl-reference.conf (com.xebialabs.xl-platform:xl-reference:2016.2.0-SNAPSHOT).
org.gradle.tooling.BuildException: Could not fetch models of type 'EclipseProject' using Gradle daemon composite connection.
	at org.gradle.tooling.internal.consumer.ExceptionTransformer.transform(ExceptionTransformer.java:51)
	at org.gradle.tooling.internal.consumer.connection.CompositeAwareModelProducer$CompositeExceptionTransformer.transform(CompositeAwareModelProducer.java:120)
	at org.gradle.tooling.internal.consumer.connection.CompositeAwareModelProducer.produceModels(CompositeAwareModelProducer.java:78)
	at org.gradle.tooling.internal.consumer.connection.CompositeAwareConsumerConnection.buildModels(CompositeAwareConsumerConnection.java:51)
	at org.gradle.tooling.internal.connection.DefaultCompositeModelBuilder$1.run(DefaultCompositeModelBuilder.java:92)
	at org.gradle.tooling.internal.connection.DefaultCompositeModelBuilder$1.run(DefaultCompositeModelBuilder.java:86)
	at org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.run(LazyConsumerActionExecutor.java:79)
	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:54)
	at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
	at org.gradle.tooling.internal.connection.DefaultCompositeModelBuilder.get(DefaultCompositeModelBuilder.java:77)
	at org.gradle.tooling.internal.connection.DefaultCompositeModelBuilder.get(DefaultCompositeModelBuilder.java:40)
	at com.gradleware.tooling.toolingclient.internal.deduplication.DelegatingModelBuilder.get(DelegatingModelBuilder.java:141)
	at com.gradleware.tooling.toolingclient.internal.deduplication.DeduplicatingGradleConnection$DeduplicatingEclipseModelBuilder.get(DeduplicatingGradleConnection.java:93)
	at com.gradleware.tooling.toolingclient.internal.deduplication.DeduplicatingGradleConnection$DeduplicatingEclipseModelBuilder.get(DeduplicatingGradleConnection.java:85)
	at com.gradleware.tooling.toolingclient.internal.DefaultToolingClient.executeAndWait(DefaultToolingClient.java:210)
	at com.gradleware.tooling.toolingclient.internal.DefaultCompositeBuildModelRequest.executeAndWait(DefaultCompositeBuildModelRequest.java:47)
	at com.gradleware.tooling.toolingclient.internal.DefaultCompositeBuildModelRequest.executeAndWait(DefaultCompositeBuildModelRequest.java:31)
	at com.gradleware.tooling.toolingmodel.repository.internal.BaseModelRepository$1.get(BaseModelRepository.java:95)
	at com.gradleware.tooling.toolingmodel.repository.internal.BaseModelRepository.executeAndWait(BaseModelRepository.java:163)
	at com.gradleware.tooling.toolingmodel.repository.internal.BaseModelRepository.access$000(BaseModelRepository.java:41)
	at com.gradleware.tooling.toolingmodel.repository.internal.BaseModelRepository$2.call(BaseModelRepository.java:121)
	at com.google.common.cache.LocalCache$LocalManualCache$1.load(LocalCache.java:4724)
	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3522)
	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2315)
	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2278)
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2193)
	at com.google.common.cache.LocalCache.get(LocalCache.java:3932)
	at com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.java:4721)
	at com.gradleware.tooling.toolingmodel.repository.internal.BaseModelRepository.getFromCache(BaseModelRepository.java:138)
	at com.gradleware.tooling.toolingmodel.repository.internal.BaseModelRepository.executeRequest(BaseModelRepository.java:117)
	at com.gradleware.tooling.toolingmodel.repository.internal.BaseModelRepository.executeRequest(BaseModelRepository.java:88)
	at com.gradleware.tooling.toolingmodel.repository.internal.DefaultCompositeModelRepository.executeRequest(DefaultCompositeModelRepository.java:99)
	at com.gradleware.tooling.toolingmodel.repository.internal.DefaultCompositeModelRepository.fetchEclipseProjects(DefaultCompositeModelRepository.java:63)
	at org.eclipse.buildship.core.workspace.internal.DefaultCompositeModelprovider.fetchEclipseProjects(DefaultCompositeModelprovider.java:39)
	at org.eclipse.buildship.core.workspace.internal.SynchronizeCompositeBuildJob.fetchEclipseProjects(SynchronizeCompositeBuildJob.java:72)
	at org.eclipse.buildship.core.workspace.internal.SynchronizeCompositeBuildJob.runToolingApiJob(SynchronizeCompositeBuildJob.java:65)
	at org.eclipse.buildship.core.util.progress.ToolingApiJob$1.run(ToolingApiJob.java:73)
	at org.eclipse.buildship.core.util.progress.ToolingApiInvoker.invoke(ToolingApiInvoker.java:63)
	at org.eclipse.buildship.core.util.progress.ToolingApiJob.run(ToolingApiJob.java:70)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Caused by: org.gradle.internal.exceptions.LocationAwareException: Build file '/Users/ilx/work/xebialabs/xl-release/build.gradle' line: 43
A problem occurred evaluating root project 'xl-release'.
	at org.gradle.initialization.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:74)
	at org.gradle.initialization.MultipleBuildFailuresExceptionAnalyser.transform(MultipleBuildFailuresExceptionAnalyser.java:47)
	at org.gradle.initialization.StackTraceSanitizingExceptionAnalyser.transform(StackTraceSanitizingExceptionAnalyser.java:30)
	at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:100)
	at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:92)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:63)
	at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:92)
	at org.gradle.initialization.DefaultGradleLauncher.getBuildAnalysis(DefaultGradleLauncher.java:88)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.configure(InProcessBuildActionExecuter.java:107)
	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:48)
	at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:58)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:48)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
	at org.gradle.tooling.internal.provider.runner.CompositeBuildModelActionRunner.fetchCompositeModelsInProcess(CompositeBuildModelActionRunner.java:99)
	at org.gradle.tooling.internal.provider.runner.CompositeBuildModelActionRunner.run(CompositeBuildModelActionRunner.java:62)
	at org.gradle.launcher.exec.ChainingCompositeBuildActionRunner.run(ChainingCompositeBuildActionRunner.java:37)
	at org.gradle.launcher.exec.CompositeBuildActionExecuter.execute(CompositeBuildActionExecuter.java:35)
	at org.gradle.launcher.exec.CompositeBuildActionExecuter.execute(CompositeBuildActionExecuter.java:25)
	at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:76)
	at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:46)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:237)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
	at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: org.gradle.api.GradleScriptException: A problem occurred evaluating root project 'xl-release'.
	at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:93)
	at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl$2.run(DefaultScriptPluginFactory.java:177)
	at org.gradle.configuration.ProjectScriptTarget.addConfiguration(ProjectScriptTarget.java:77)
	at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:182)
	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:38)
	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:25)
	at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:55)
	at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:540)
	at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:93)
	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:42)
	at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:35)
	at org.gradle.initialization.DefaultGradleLauncher$2.run(DefaultGradleLauncher.java:124)
	at org.gradle.internal.Factories$1.create(Factories.java:22)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:53)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:121)
	at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
	at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:98)
	... 45 more
Caused by: org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration 'detachedConfiguration1'.
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.wrapException(ErrorHandlingConfigurationResolver.java:70)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.access$000(ErrorHandlingConfigurationResolver.java:33)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver$ErrorHandlingResolvedConfiguration.getFiles(ErrorHandlingConfigurationResolver.java:199)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getFiles(DefaultConfiguration.java:671)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getFiles(DefaultConfiguration.java:293)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolve(DefaultConfiguration.java:289)
	at org.gradle.api.artifacts.Configuration$resolve.call(Unknown Source)
	at com.xebialabs.gradle.dependency.supplier.DependencySupplier.getConfig(DependencySupplier.groovy:21)
	at com.xebialabs.gradle.dependency.supplier.MasterDependencyConfigSupplier.addConfig(MasterDependencyConfigSupplier.groovy:41)
	at com.xebialabs.gradle.dependency.supplier.MasterDependencyConfigSupplier$addConfig.call(Unknown Source)
	at com.xebialabs.gradle.dependency.supplier.MasterDependencyConfigSupplier$addConfig.call(Unknown Source)
	at com.xebialabs.gradle.dependency.DependencyManagementContainer.addSupplier(DependencyManagementContainer.groovy:39)
	at com.xebialabs.gradle.dependency.DependencyManagementContainer$addSupplier.call(Unknown Source)
	at com.xebialabs.gradle.dependency.DependencyManagementExtension.importConf(DependencyManagementExtension.groovy:33)
	at build_2y9moj1da3r1bq2wftwmfkd91$_run_closure1.doCall(/Users/ilx/work/xebialabs/xl-release/build.gradle:43)
	at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:67)
	at org.gradle.api.internal.plugins.ExtensionsStorage$ExtensionHolder.configure(ExtensionsStorage.java:145)
	at org.gradle.api.internal.plugins.ExtensionsStorage.configureExtension(ExtensionsStorage.java:69)
	at org.gradle.api.internal.plugins.DefaultConvention$ExtensionsDynamicObject.invokeMethod(DefaultConvention.java:215)
	at org.gradle.internal.metaobject.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:96)
	at org.gradle.internal.metaobject.MixInClosurePropertiesAsMethodsDynamicObject.invokeMethod(MixInClosurePropertiesAsMethodsDynamicObject.java:30)
	at org.gradle.internal.metaobject.AbstractDynamicObject.invokeMethod(AbstractDynamicObject.java:163)
	at org.gradle.groovy.scripts.BasicScript.methodMissing(BasicScript.java:79)
	at build_2y9moj1da3r1bq2wftwmfkd91.run(/Users/ilx/work/xebialabs/xl-release/build.gradle:42)
	at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:91)
	... 63 more
Caused by: org.gradle.internal.resolve.ArtifactNotFoundException: Could not find xl-reference.conf (com.xebialabs.xl-platform:xl-reference:2016.2.0-SNAPSHOT).
	at org.gradle.internal.resolve.result.DefaultBuildableArtifactResolveResult.notFound(DefaultBuildableArtifactResolveResult.java:38)
	at org.gradle.api.internal.artifacts.ivyservice.projectmodule.ProjectDependencyResolver.resolveArtifact(ProjectDependencyResolver.java:106)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.ComponentResolversChain$ArtifactResolverChain.resolveArtifact(ComponentResolversChain.java:98)
	at org.gradle.api.internal.artifacts.ivyservice.ContextualArtifactResolver$3.execute(ContextualArtifactResolver.java:61)
	at org.gradle.api.internal.artifacts.ivyservice.ContextualArtifactResolver$3.execute(ContextualArtifactResolver.java:59)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:61)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:39)
	at org.gradle.api.internal.artifacts.ivyservice.ContextualArtifactResolver$4.run(ContextualArtifactResolver.java:69)
	at org.gradle.internal.Factories$1.create(Factories.java:22)
	at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:192)
	at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:175)
	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:106)
	at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.useCache(DefaultCacheFactory.java:187)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManager.useCache(DefaultCacheLockingManager.java:64)
	at org.gradle.api.internal.artifacts.ivyservice.ContextualArtifactResolver.executeInContext(ContextualArtifactResolver.java:67)
	at org.gradle.api.internal.artifacts.ivyservice.ContextualArtifactResolver.resolveArtifact(ContextualArtifactResolver.java:59)
	at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingArtifactResolver.resolveArtifact(ErrorHandlingArtifactResolver.java:53)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.DefaultArtifactSet$LazyArtifactSource.create(DefaultArtifactSet.java:93)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.DefaultArtifactSet$LazyArtifactSource.create(DefaultArtifactSet.java:80)
	at org.gradle.api.internal.artifacts.DefaultResolvedArtifact.getFile(DefaultResolvedArtifact.java:90)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$2.run(DefaultLenientConfiguration.java:122)
	at org.gradle.internal.Factories$1.create(Factories.java:22)
	at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:192)
	at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:175)
	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:106)
	at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.useCache(DefaultCacheFactory.java:187)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManager.useCache(DefaultCacheLockingManager.java:64)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration.getFiles(DefaultLenientConfiguration.java:119)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration.getFilesStrict(DefaultLenientConfiguration.java:91)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfiguration.getFiles(DefaultResolvedConfiguration.java:45)
	at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyConfigurationResolver$FilesAggregatingResolvedConfiguration.getFiles(SelfResolvingDependencyConfigurationResolver.java:87)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver$ErrorHandlingResolvedConfiguration.getFiles(ErrorHandlingConfigurationResolver.java:197)
	... 85 more

the plugin just does something like:

  def importConf(String dependency) {
    project.logger.info("Added dependency management artifact: $dependency")
    container.addSupplier(new DependencySupplier(this.project, dependency))
  }

with DependencySupplier code that resolves it:

  Config getConfig() {
    if (!config) {
      def dependency = project.dependencies.create(dependency + "@conf")
      def resolve = project.configurations.detachedConfiguration(dependency).resolve()
      assert resolve.size() == 1: "Dependency ${dependency} resulted in more than 1 file: $resolve"
      config = ConfigFactory.parseFile(resolve.find()).resolve()
    }
    return config
  }
}

so, how to implement this and at the same time make buildship work?