diff --git a/pf4j/src/main/java/org/pf4j/AbstractPluginManager.java b/pf4j/src/main/java/org/pf4j/AbstractPluginManager.java index e69acd3..d94b0c2 100644 --- a/pf4j/src/main/java/org/pf4j/AbstractPluginManager.java +++ b/pf4j/src/main/java/org/pf4j/AbstractPluginManager.java @@ -330,11 +330,14 @@ public abstract class AbstractPluginManager implements PluginManager { log.info("Start plugin '{}'", getPluginLabel(pluginWrapper.getDescriptor())); pluginWrapper.getPlugin().start(); pluginWrapper.setPluginState(PluginState.STARTED); + pluginWrapper.setFailedException(null); startedPlugins.add(pluginWrapper); - - firePluginStateEvent(new PluginStateEvent(this, pluginWrapper, pluginState)); } catch (Exception e) { + pluginWrapper.setPluginState(PluginState.FAILED); + pluginWrapper.setFailedException(e); log.error(e.getMessage(), e); + } finally { + firePluginStateEvent(new PluginStateEvent(this, pluginWrapper, pluginState)); } } } diff --git a/pf4j/src/main/java/org/pf4j/PluginState.java b/pf4j/src/main/java/org/pf4j/PluginState.java index 7b5037a..e28fc30 100644 --- a/pf4j/src/main/java/org/pf4j/PluginState.java +++ b/pf4j/src/main/java/org/pf4j/PluginState.java @@ -24,12 +24,12 @@ public enum PluginState { * The runtime knows the plugin is there. It knows about the plugin path, the plugin descriptor. */ CREATED("CREATED"), - + /** * The plugin cannot be used. */ DISABLED("DISABLED"), - + /** * The plugin is created. All the dependencies are created and resolved. * The plugin is ready to be started. @@ -44,7 +44,12 @@ public enum PluginState { /** * The {@link Plugin#stop()} has executed. */ - STOPPED("STOPPED"); + STOPPED("STOPPED"), + + /** + * Plugin failed to start. + */ + FAILED("FAILED"); private String status; diff --git a/pf4j/src/main/java/org/pf4j/PluginWrapper.java b/pf4j/src/main/java/org/pf4j/PluginWrapper.java index 0af0d93..8e472f8 100644 --- a/pf4j/src/main/java/org/pf4j/PluginWrapper.java +++ b/pf4j/src/main/java/org/pf4j/PluginWrapper.java @@ -32,6 +32,8 @@ public class PluginWrapper { private PluginState pluginState; private RuntimeMode runtimeMode; + private Exception failedException; + Plugin plugin; // cache public PluginWrapper(PluginManager pluginManager, PluginDescriptor descriptor, Path pluginPath, ClassLoader pluginClassLoader) { @@ -139,4 +141,16 @@ public class PluginWrapper { this.pluginFactory = pluginFactory; } + /** + * Returns the exception with which the plugin fails to start. + * See @{link PluginStatus#FAILED}. + */ + public Exception getFailedException() { + return failedException; + } + + public void setFailedException(Exception failedException) { + this.failedException = failedException; + } + }