Browse Source

Protect PluginApplicationActions against absent plugin classes

Closes gh-24526
pull/24597/head
Andy Wilkinson 5 years ago
parent
commit
5fdb2ae2fd
  1. 11
      spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java
  2. 10
      spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/PluginApplicationAction.java
  3. 17
      spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java

11
spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 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.
@ -47,15 +47,8 @@ class KotlinPluginAction implements PluginApplicationAction { @@ -47,15 +47,8 @@ class KotlinPluginAction implements PluginApplicationAction {
}
@Override
@SuppressWarnings("unchecked")
public Class<? extends Plugin<? extends Project>> getPluginClass() {
try {
return (Class<? extends Plugin<? extends Project>>) Class
.forName("org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper");
}
catch (Throwable ex) {
return null;
}
return KotlinPluginWrapper.class;
}
}

10
spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/PluginApplicationAction.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 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.
@ -30,9 +30,11 @@ interface PluginApplicationAction extends Action<Project> { @@ -30,9 +30,11 @@ interface PluginApplicationAction extends Action<Project> {
/**
* The class of the {@code Plugin} that, when applied, will trigger the execution of
* this action. May return {@code null} if the plugin class is not on the classpath.
* @return the plugin class or {@code null}
* this action.
* @return the plugin class
* @throws ClassNotFoundException if the plugin class cannot be found
* @throws NoClassDefFoundError if an error occurs when defining the plugin class
*/
Class<? extends Plugin<? extends Project>> getPluginClass();
Class<? extends Plugin<? extends Project>> getPluginClass() throws ClassNotFoundException, NoClassDefFoundError;
}

17
spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java

@ -18,6 +18,7 @@ package org.springframework.boot.gradle.plugin; @@ -18,6 +18,7 @@ package org.springframework.boot.gradle.plugin;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import org.gradle.api.GradleException;
import org.gradle.api.Plugin;
@ -119,10 +120,18 @@ public class SpringBootPlugin implements Plugin<Project> { @@ -119,10 +120,18 @@ public class SpringBootPlugin implements Plugin<Project> {
new WarPluginAction(singlePublishedArtifact), new MavenPluginAction(bootArchives.getUploadTaskName()),
new DependencyManagementPluginAction(), new ApplicationPluginAction(), new KotlinPluginAction());
for (PluginApplicationAction action : actions) {
Class<? extends Plugin<? extends Project>> pluginClass = action.getPluginClass();
if (pluginClass != null) {
project.getPlugins().withType(pluginClass, (plugin) -> action.execute(project));
}
withPluginClassOfAction(action,
(pluginClass) -> project.getPlugins().withType(pluginClass, (plugin) -> action.execute(project)));
}
}
private void withPluginClassOfAction(PluginApplicationAction action,
Consumer<Class<? extends Plugin<? extends Project>>> consumer) {
try {
consumer.accept(action.getPluginClass());
}
catch (Throwable ex) {
// Plugin class unavailable. Continue.
}
}

Loading…
Cancel
Save