Commit 5fdb2ae2 authored by Andy Wilkinson's avatar Andy Wilkinson

Protect PluginApplicationActions against absent plugin classes

Closes gh-24526
parent 38e4c2a1
/* /*
* 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 @Override
@SuppressWarnings("unchecked")
public Class<? extends Plugin<? extends Project>> getPluginClass() { public Class<? extends Plugin<? extends Project>> getPluginClass() {
try { return KotlinPluginWrapper.class;
return (Class<? extends Plugin<? extends Project>>) Class
.forName("org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper");
}
catch (Throwable ex) {
return null;
}
} }
} }
/* /*
* 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 * 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. * this action.
* @return the plugin class or {@code null} * @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;
} }
...@@ -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.Arrays;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
import org.gradle.api.GradleException; import org.gradle.api.GradleException;
import org.gradle.api.Plugin; import org.gradle.api.Plugin;
...@@ -119,11 +120,19 @@ public class SpringBootPlugin implements Plugin<Project> { ...@@ -119,11 +120,19 @@ public class SpringBootPlugin implements Plugin<Project> {
new WarPluginAction(singlePublishedArtifact), new MavenPluginAction(bootArchives.getUploadTaskName()), new WarPluginAction(singlePublishedArtifact), new MavenPluginAction(bootArchives.getUploadTaskName()),
new DependencyManagementPluginAction(), new ApplicationPluginAction(), new KotlinPluginAction()); new DependencyManagementPluginAction(), new ApplicationPluginAction(), new KotlinPluginAction());
for (PluginApplicationAction action : actions) { for (PluginApplicationAction action : actions) {
Class<? extends Plugin<? extends Project>> pluginClass = action.getPluginClass(); withPluginClassOfAction(action,
if (pluginClass != null) { (pluginClass) -> project.getPlugins().withType(pluginClass, (plugin) -> action.execute(project)));
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.
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment