From 0260d79092fa1ce8aae8e609eac09872312d2654 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 1 May 2020 07:39:23 +0100 Subject: [PATCH] Add OptionalDependenciesPlugin --- .gitignore | 4 +- .../optional/OptionalDependenciesPlugin.java | 64 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 buildSrc/src/main/java/org/springframework/build/optional/OptionalDependenciesPlugin.java diff --git a/.gitignore b/.gitignore index 56ff9020..97ac1d34 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,9 @@ build.sh integration-repo ivy-cache .gradle -build +/build +buildSrc/build +/spring-*/build target # Eclipse metadata diff --git a/buildSrc/src/main/java/org/springframework/build/optional/OptionalDependenciesPlugin.java b/buildSrc/src/main/java/org/springframework/build/optional/OptionalDependenciesPlugin.java new file mode 100644 index 00000000..55537c2d --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/build/optional/OptionalDependenciesPlugin.java @@ -0,0 +1,64 @@ +/* + * Copyright 2002-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.build.optional; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.SourceSetContainer; +import org.gradle.plugins.ide.eclipse.EclipsePlugin; +import org.gradle.plugins.ide.eclipse.model.EclipseModel; + +/** + * A {@code Plugin} that adds support for Maven-style optional dependencies. Creates a new + * {@code optional} configuration. The {@code optional} configuration is part of the + * project's compile and runtime classpath's but does not affect the classpath of + * dependent projects. + * + * @author Andy Wilkinson + */ +public class OptionalDependenciesPlugin implements Plugin { + + /** + * Name of the {@code optional} configuration. + */ + public static final String OPTIONAL_CONFIGURATION_NAME = "optional"; + + @Override + public void apply(Project project) { + Configuration optional = project.getConfigurations().create("optional"); + project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> { + SourceSetContainer sourceSets = project.getConvention() + .getPlugin(JavaPluginConvention.class).getSourceSets(); + sourceSets.all((sourceSet) -> { + sourceSet.setCompileClasspath( + sourceSet.getCompileClasspath().plus(optional)); + sourceSet.setRuntimeClasspath( + sourceSet.getRuntimeClasspath().plus(optional)); + }); + }); + project.getPlugins().withType(EclipsePlugin.class, (eclipePlugin) -> { + project.getExtensions().getByType(EclipseModel.class) + .classpath((classpath) -> { + classpath.getPlusConfigurations().add(optional); + }); + }); + } + +} \ No newline at end of file