/* * Copyright 2012-2017 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 * * http://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.boot.gradle.plugin; import java.util.Arrays; import java.util.List; import org.gradle.api.GradleException; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.component.SoftwareComponent; import org.gradle.util.GradleVersion; import org.springframework.boot.gradle.dsl.SpringBootExtension; import org.springframework.boot.gradle.tasks.bundling.BootJar; import org.springframework.boot.gradle.tasks.bundling.BootWar; /** * Gradle plugin for Spring Boot. * * @author Phillip Webb * @author Dave Syer * @author Andy Wilkinson */ public class SpringBootPlugin implements Plugin<Project> { /** * The name of the {@link Configuration} that contains Spring Boot archives. * * @since 2.0.0 */ public static final String BOOT_ARCHIVES_CONFIGURATION_NAME = "bootArchives"; /** * The name of the {@link SoftwareComponent} for a Spring Boot Java application. * * @since 2.0.0 */ public static final String BOOT_JAVA_SOFTWARE_COMPONENT_NAME = "bootJava"; /** * The name of the {@link SoftwareComponent} for a Spring Boot Web application. * * @since 2.0.0 */ public static final String BOOT_WEB_SOFTWARE_COMPONENT_NAME = "bootWeb"; /** * The name of the default {@link BootJar} task. * * @since 2.0.0 */ public static final String BOOT_JAR_TASK_NAME = "bootJar"; /** * The name of the default {@link BootWar} task. * * @since 2.0.0 */ public static final String BOOT_WAR_TASK_NAME = "bootWar"; @Override public void apply(Project project) { verifyGradleVersion(); createExtension(project); Configuration bootArchives = createBootArchivesConfiguration(project); registerPluginActions(project, bootArchives); unregisterUnresolvedDependenciesAnalyzer(project); } private void verifyGradleVersion() { if (GradleVersion.current().compareTo(GradleVersion.version("3.4")) < 0) { throw new GradleException("Spring Boot plugin requires Gradle 3.4 or later." + " The current version is " + GradleVersion.current()); } } private void createExtension(Project project) { project.getExtensions().create("springBoot", SpringBootExtension.class, project); } private Configuration createBootArchivesConfiguration(Project project) { Configuration bootArchives = project.getConfigurations() .create(BOOT_ARCHIVES_CONFIGURATION_NAME); bootArchives.setDescription("Configuration for Spring Boot archive artifacts."); return bootArchives; } private void registerPluginActions(Project project, Configuration bootArchives) { SinglePublishedArtifact singlePublishedArtifact = new SinglePublishedArtifact( bootArchives.getArtifacts()); List<PluginApplicationAction> actions = Arrays.asList( new JavaPluginAction(singlePublishedArtifact), new WarPluginAction(singlePublishedArtifact), new MavenPluginAction(bootArchives.getUploadTaskName()), new DependencyManagementPluginAction(), new ApplicationPluginAction()); for (PluginApplicationAction action : actions) { project.getPlugins().withType(action.getPluginClass(), plugin -> action.execute(project)); } } private void unregisterUnresolvedDependenciesAnalyzer(Project project) { UnresolvedDependenciesAnalyzer unresolvedDependenciesAnalyzer = new UnresolvedDependenciesAnalyzer(); project.getConfigurations().all(configuration -> configuration.getIncoming() .afterResolve(resolvableDependencies -> unresolvedDependenciesAnalyzer .analyze(configuration.getResolvedConfiguration() .getLenientConfiguration() .getUnresolvedModuleDependencies()))); project.getGradle().buildFinished( buildResult -> unresolvedDependenciesAnalyzer.buildFinished(project)); } }