Protect PluginApplicationActions against absent plugin classes

Closes gh-24526
pull/24597/head
Andy Wilkinson 4 years ago
parent 38e4c2a179
commit 5fdb2ae2fd

@ -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"); * 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 {
} }
@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;
}
} }
} }

@ -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"); * 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> {
/** /**
* 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;
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> {
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.
}
} }
} }

Loading…
Cancel
Save