We have a number of microservices which all use several third-party plugins – spring-boot-gradle-plugin, gradle-git-properties, nebula-project-plugin, etc. This means in each project’s build.gradle, there is a duplicated buildscript closure which specifies a few repositories and a few dependencies. I would like to write a custom plugin that would take care of setting up those buildscript closure repositories and dependencies; it would be the only plugin applied to each of our projects.
So far, I’ve come up with this…
class CommonBuildPlugin implements Plugin<Project> {
void apply(final Project project) {
addPluginRepositories project
addPluginDependencies project
}
private static void addPluginRepositories(final Project project) {
final ScriptHandler buildscript = project.buildscript
final RepositoryHandler repositories = buildscript.repositories
repositories.maven(new Action<MavenArtifactRepository>() {
public void execute(final MavenArtifactRepository mavenArtifactRepository) {
mavenArtifactRepository.setUrl('https://plugins.gradle.org/m2/')
}
})
...
}
private static void addPluginDependencies(final Project project) {
final ScriptHandler buildscript = project.buildscript
final DependencyHandler dependencies = buildscript.dependencies
final String gradleGitPluginVersion = '1.4.16'
dependencies.add('classpath',
"gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties:${gradleGitPluginVersion}")
...
}
}
However, when I replace the various third-party plugins, in one of our projects, with this one the build fails with:
> Failed to apply plugin [class 'CommonBuildPlugin']
> Cannot change dependencies of configuration ':classpath' after it has been resolved.
Is what I’m trying to do possible?
If so, any help would be appreciated.
Thanks!
Jamie