diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/ManagementConfigurationPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/ManagementConfigurationPlugin.java index c7aaefff..33e87dde 100644 --- a/buildSrc/src/main/java/org/springframework/shell/gradle/ManagementConfigurationPlugin.java +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/ManagementConfigurationPlugin.java @@ -52,6 +52,8 @@ public class ManagementConfigurationPlugin implements Plugin { configurations.getByName("testFixturesCompileClasspath").extendsFrom(management); configurations.getByName("testFixturesRuntimeClasspath").extendsFrom(management); }); + plugins.withType(OptionalDependenciesPlugin.class, (optionalDependencies) -> configurations + .getByName(OptionalDependenciesPlugin.OPTIONAL_CONFIGURATION_NAME).extendsFrom(management)); plugins.withType(MavenPublishPlugin.class, (mavenPublish) -> { PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class); publishing.getPublications().withType(MavenPublication.class, (mavenPublication -> { diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java index 1b6804f9..a6652f27 100644 --- a/buildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java @@ -30,6 +30,7 @@ class ModulePlugin implements Plugin { public final void apply(Project project) { PluginManager pluginManager = project.getPluginManager(); pluginManager.apply(JavaPlugin.class); + pluginManager.apply(OptionalDependenciesPlugin.class); pluginManager.apply(ManagementConfigurationPlugin.class); pluginManager.apply(JavaLibraryPlugin.class); pluginManager.apply(SpringMavenPlugin.class); diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/OptionalDependenciesPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/OptionalDependenciesPlugin.java new file mode 100644 index 00000000..84e504e4 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/OptionalDependenciesPlugin.java @@ -0,0 +1,45 @@ +/* + * Copyright 2022 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.shell.gradle; + +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.JavaPluginExtension; +import org.gradle.api.tasks.SourceSetContainer; + +public class OptionalDependenciesPlugin implements Plugin { + + public static final String OPTIONAL_CONFIGURATION_NAME = "optional"; + + @Override + public void apply(Project project) { + Configuration optional = project.getConfigurations().create(OPTIONAL_CONFIGURATION_NAME); + optional.setCanBeConsumed(false); + optional.setCanBeResolved(false); + project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> { + SourceSetContainer sourceSets = project.getExtensions().getByType(JavaPluginExtension.class) + .getSourceSets(); + sourceSets.all((sourceSet) -> { + project.getConfigurations().getByName(sourceSet.getCompileClasspathConfigurationName()) + .extendsFrom(optional); + project.getConfigurations().getByName(sourceSet.getRuntimeClasspathConfigurationName()) + .extendsFrom(optional); + }); + }); + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/PublishAllJavaComponentsPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/PublishAllJavaComponentsPlugin.java index 4545d637..d3f11241 100644 --- a/buildSrc/src/main/java/org/springframework/shell/gradle/PublishAllJavaComponentsPlugin.java +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/PublishAllJavaComponentsPlugin.java @@ -18,7 +18,6 @@ package org.springframework.shell.gradle; import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.component.SoftwareComponent; import org.gradle.api.plugins.JavaPlatformPlugin; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.publish.PublishingExtension; diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java index 2d4a9c1d..611f08b0 100644 --- a/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java @@ -21,6 +21,8 @@ import java.util.ListIterator; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.attributes.Usage; +import org.gradle.api.component.AdhocComponentWithVariants; +import org.gradle.api.component.ConfigurationVariantDetails; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.plugins.PluginManager; @@ -60,6 +62,35 @@ public class SpringMavenPlugin implements Plugin { private void customizeMavenPublication(MavenPublication publication, Project project) { customizePom(publication.getPom(), project); + project.getPlugins().withType(JavaPlugin.class) + .all((javaPlugin) -> customizeJavaMavenPublication(publication, project)); + suppressMavenOptionalFeatureWarnings(publication); + } + + private void customizeJavaMavenPublication(MavenPublication publication, Project project) { + addMavenOptionalFeature(project); + publication.versionMapping((strategy) -> strategy.usage(Usage.JAVA_API, (mappingStrategy) -> mappingStrategy + .fromResolutionOf(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME))); + publication.versionMapping( + (strategy) -> strategy.usage(Usage.JAVA_RUNTIME, VariantVersionMappingStrategy::fromResolutionResult)); + } + + private void suppressMavenOptionalFeatureWarnings(MavenPublication publication) { + publication.suppressPomMetadataWarningsFor("mavenOptionalApiElements"); + publication.suppressPomMetadataWarningsFor("mavenOptionalRuntimeElements"); + } + + private void addMavenOptionalFeature(Project project) { + JavaPluginExtension extension = project.getExtensions().getByType(JavaPluginExtension.class); + extension.registerFeature("mavenOptional", + (feature) -> feature.usingSourceSet(extension.getSourceSets().getByName("main"))); + AdhocComponentWithVariants javaComponent = (AdhocComponentWithVariants) project.getComponents() + .findByName("java"); + if (javaComponent != null) { + javaComponent.addVariantsFromConfiguration( + project.getConfigurations().findByName("mavenOptionalRuntimeElements"), + ConfigurationVariantDetails::mapToOptional); + } } private void customizePom(MavenPom pom, Project project) { diff --git a/spring-shell-core-test-support/spring-shell-core-test-support.gradle b/spring-shell-core-test-support/spring-shell-core-test-support.gradle index b2631849..b4063073 100644 --- a/spring-shell-core-test-support/spring-shell-core-test-support.gradle +++ b/spring-shell-core-test-support/spring-shell-core-test-support.gradle @@ -7,5 +7,5 @@ description = 'Spring Shell Core Test Support' dependencies { management platform(project(":spring-shell-management")) implementation project(':spring-shell-core') - api('org.assertj:assertj-core') + optional('org.assertj:assertj-core') }