diff --git a/README_zh.md b/README_zh.md index 0d7e1192a791ded73416e990515ec7234b3238eb..90a58e98f6d2bf0846219f0b1a2659ba3875eeaa 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,4 +1,4 @@ -# springboot插件式开发框架 +# Spring-Boot插件式开发框架 - 全新`3.0.0`版本上线啦,为动态扩展系统而生的框架。 diff --git a/pom.xml b/pom.xml index 4847d111bc7296a71288fe4cc467b8cd5b75f303..6c59803a875e5e60ca30b4297b7699f354cddbb3 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues spring-brick-parent pom - 3.0.0 + 3.0.1 spring-brick-common diff --git a/spring-brick-bootstrap/pom.xml b/spring-brick-bootstrap/pom.xml index c5a750570d8a8765a23f58a32700c1297eb4cd84..2c7d6aa13ffa73ae5f1fae1045055d570029ac62 100644 --- a/spring-brick-bootstrap/pom.xml +++ b/spring-brick-bootstrap/pom.xml @@ -7,7 +7,7 @@ spring-brick-parent com.gitee.starblues - 3.0.0 + 3.0.1 spring-brick-bootstrap diff --git a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/EmptyMainApplicationContext.java b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/EmptyMainApplicationContext.java index 53a55368e9971b990a1ed3c039d4ede5e69f721f..8a15ab69990e366b902de8ce247e6cf48e48703b 100644 --- a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/EmptyMainApplicationContext.java +++ b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/EmptyMainApplicationContext.java @@ -18,12 +18,6 @@ package com.gitee.starblues.bootstrap; import com.gitee.starblues.spring.MainApplicationContext; import com.gitee.starblues.spring.SpringBeanFactory; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.core.ResolvableType; - -import java.lang.annotation.Annotation; import java.util.Collections; import java.util.Map; import java.util.Set; @@ -51,4 +45,11 @@ public class EmptyMainApplicationContext implements MainApplicationContext { public Map> getConfigurableEnvironment() { return Collections.emptyMap(); } + + @Override + public ClassLoader getClassLoader() { + return EmptyMainApplicationContext.class.getClassLoader(); + } + + } diff --git a/spring-brick-common/pom.xml b/spring-brick-common/pom.xml index 90be99fd61909125b5a3fd5b325a14af3153afbb..460059ed32d30789ca04b514ff564f7a3c4ac4db 100644 --- a/spring-brick-common/pom.xml +++ b/spring-brick-common/pom.xml @@ -7,7 +7,7 @@ spring-brick-parent com.gitee.starblues - 3.0.0 + 3.0.1 spring-brick-common diff --git a/spring-brick-loader/pom.xml b/spring-brick-loader/pom.xml index 8159265ea799e8d748a4d58b16bfab6e58b57a71..b340b56ef1a4357900b58340351a20a0295fb546 100644 --- a/spring-brick-loader/pom.xml +++ b/spring-brick-loader/pom.xml @@ -5,7 +5,7 @@ spring-brick-parent com.gitee.starblues - 3.0.0 + 3.0.1 4.0.0 diff --git a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/launcher/AbstractLauncher.java b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/launcher/AbstractLauncher.java index 573ce907e2dfd0a0deb2d1b4c91527c66e8cb91f..e1d1c35208cc2c21be3aeb45fa54f447b3872fb5 100644 --- a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/launcher/AbstractLauncher.java +++ b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/launcher/AbstractLauncher.java @@ -27,17 +27,13 @@ public abstract class AbstractLauncher implements Launcher { public R run(String... args) throws Exception { ClassLoader classLoader = createClassLoader(args); Thread thread = Thread.currentThread(); - ClassLoader oldClassLoader = thread.getContextClassLoader(); - try { - thread.setContextClassLoader(classLoader); - return launch(classLoader, args); - } finally { - thread.setContextClassLoader(oldClassLoader); - } + thread.setContextClassLoader(classLoader); + return launch(classLoader, args); } /** * 创建classloader + * @param args 参数 * @return ClassLoader * @throws Exception 创建异常 */ diff --git a/spring-brick-maven-packager/pom.xml b/spring-brick-maven-packager/pom.xml index 0aebe4dc57a63dfc15963cc40a36572a9faae75c..9a5b4c68396b9526a51ed31a0f005b9c2e98ec33 100644 --- a/spring-brick-maven-packager/pom.xml +++ b/spring-brick-maven-packager/pom.xml @@ -7,7 +7,7 @@ spring-brick-parent com.gitee.starblues - 3.0.0 + 3.0.1 spring-brick-maven-packager diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/CommonUtils.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/CommonUtils.java index f9d722906ba44e311dc1e7600c489cd1782e14c5..90c48982c2d12a8be72a2872857060f51c70835f 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/CommonUtils.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/CommonUtils.java @@ -29,9 +29,9 @@ import java.util.Objects; public class CommonUtils { public final static String PLUGIN_FRAMEWORK_GROUP_ID = "com.gitee.starblues"; - public final static String PLUGIN_FRAMEWORK_ARTIFACT_ID = "springboot-plugin-framework"; + public final static String PLUGIN_FRAMEWORK_ARTIFACT_ID = "spring-brick"; - public final static String PLUGIN_FRAMEWORK_LOADER_ARTIFACT_ID = "springboot-plugin-framework-loader"; + public final static String PLUGIN_FRAMEWORK_LOADER_ARTIFACT_ID = "spring-brick-loader"; private CommonUtils(){} diff --git a/spring-brick-maven-packager/src/main/resources/META-INF/maven/com.gitee.starblues.springboot-plugin-maven-packager/plugin-help.xml b/spring-brick-maven-packager/src/main/resources/META-INF/maven/com.gitee.starblues.springboot-plugin-maven-packager/plugin-help.xml index b3fd6271d4fe96579d2303ea62cfdea7e0deda74..923cc051f41e63a1de62cc756f06bae0b2b05a8f 100644 --- a/spring-brick-maven-packager/src/main/resources/META-INF/maven/com.gitee.starblues.springboot-plugin-maven-packager/plugin-help.xml +++ b/spring-brick-maven-packager/src/main/resources/META-INF/maven/com.gitee.starblues.springboot-plugin-maven-packager/plugin-help.xml @@ -6,7 +6,7 @@ Spring Boot Plugin Maven Packager com.gitee.starblues spring-brick-maven-packager - 3.0.0 + 3.0.1 spring-brick-packager false true diff --git a/spring-brick-maven-packager/src/main/resources/META-INF/maven/plugin.xml b/spring-brick-maven-packager/src/main/resources/META-INF/maven/plugin.xml index b3fd6271d4fe96579d2303ea62cfdea7e0deda74..923cc051f41e63a1de62cc756f06bae0b2b05a8f 100644 --- a/spring-brick-maven-packager/src/main/resources/META-INF/maven/plugin.xml +++ b/spring-brick-maven-packager/src/main/resources/META-INF/maven/plugin.xml @@ -6,7 +6,7 @@ Spring Boot Plugin Maven Packager com.gitee.starblues spring-brick-maven-packager - 3.0.0 + 3.0.1 spring-brick-packager false true diff --git a/spring-brick/pom.xml b/spring-brick/pom.xml index e32cc26352fabe264d35cac840b23bc2f085fef3..55b844bd9337ef63eb4eb594505e12f39720ac5f 100644 --- a/spring-brick/pom.xml +++ b/spring-brick/pom.xml @@ -7,7 +7,7 @@ spring-brick-parent com.gitee.starblues - 3.0.0 + 3.0.1 spring-brick diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java b/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java index 50b3e555289776fdd2ffbb45608fa352a85e0b6e..ec4027cf1be6acad147e9a344b3c0656245b1093 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java @@ -117,7 +117,7 @@ public class DefaultPluginManager implements PluginManager{ @Override public synchronized List loadPlugins() { if(loaded.get()){ - throw new RuntimeException("已经加载过了插件, 不能在重复调用: loadPlugins"); + throw new PluginException("不能重复调用: loadPlugins"); } try { if(ObjectUtils.isEmpty(pluginRootDirs)){ @@ -126,18 +126,7 @@ public class DefaultPluginManager implements PluginManager{ } List scanPluginPaths = provider.getPluginScanner().scan(pluginRootDirs); if(ObjectUtils.isEmpty(scanPluginPaths)){ - StringBuilder warn = new StringBuilder("以下路径未发现插件: \n"); - for (int i = 0; i < pluginRootDirs.size(); i++) { - warn.append(i + 1).append(". ").append(pluginRootDirs.get(i)).append("\n"); - } - warn.append("请检查路径是否合适.\n"); - warn.append("请检查配置[plugin.runMode]是否合适.\n"); - if(provider.getRuntimeMode() == RuntimeMode.DEV){ - warn.append("请检查插件包是否编译.\n"); - } else { - warn.append("请检查插件是否合法.\n"); - } - log.warn(warn.toString()); + printOfNotFoundPlugins(); return Collections.emptyList(); } pluginListenerFactory = createPluginListenerFactory(); @@ -156,6 +145,9 @@ public class DefaultPluginManager implements PluginManager{ log.error("加载插件包失败: {}. {}", path, e.getMessage(), e); } } + if(pluginInfoMap.isEmpty()){ + printOfNotFoundPlugins(); + } return getSortPlugin(pluginInfoMap); } finally { loaded.set(true); @@ -228,8 +220,13 @@ public class DefaultPluginManager implements PluginManager{ @Override public synchronized void unLoad(String pluginId) { Assert.isNotNull(pluginId, "参数pluginId不能为空"); - PluginInsideInfo pluginInsideInfo = resolvedPlugins.remove(pluginId); + PluginInsideInfo pluginInsideInfo = resolvedPlugins.get(pluginId); + if(!resolvedPlugins.containsKey(pluginId)){ + throw new PluginException("没有发现插件: " + pluginId); + } + resolvedPlugins.remove(pluginId); pluginListenerFactory.unLoadSuccess(pluginInsideInfo.toPluginInfo()); + LogUtils.info(log, pluginInsideInfo.getPluginDescriptor(), "卸载成功"); } @Override @@ -515,13 +512,22 @@ public class DefaultPluginManager implements PluginManager{ */ protected void start(PluginInsideInfo pluginInsideInfo) throws Exception{ Assert.isNotNull(pluginInsideInfo, "pluginInsideInfo 参数不能为空"); - String pluginId = pluginInsideInfo.getPluginId(); launcherChecker.checkCanStart(pluginInsideInfo); pluginInsideInfo.setPluginState(PluginState.STARTED); + startFinish(pluginInsideInfo); + } + + /** + * 启动完成后的操作 + * @param pluginInsideInfo pluginInsideInfo + */ + protected void startFinish(PluginInsideInfo pluginInsideInfo){ + String pluginId = pluginInsideInfo.getPluginId(); startedPlugins.put(pluginId, pluginInsideInfo); resolvedPlugins.remove(pluginId); } + /** * 统一停止插件操作 * @param pluginInsideInfo PluginInsideInfo @@ -529,8 +535,16 @@ public class DefaultPluginManager implements PluginManager{ */ protected void stop(PluginInsideInfo pluginInsideInfo) throws Exception{ launcherChecker.checkCanStop(pluginInsideInfo); - String pluginId = pluginInsideInfo.getPluginId(); pluginInsideInfo.setPluginState(PluginState.STOPPED); + stopFinish(pluginInsideInfo); + } + + /** + * 停止完成操作 + * @param pluginInsideInfo pluginInsideInfo + */ + protected void stopFinish(PluginInsideInfo pluginInsideInfo){ + String pluginId = pluginInsideInfo.getPluginId(); resolvedPlugins.put(pluginId, pluginInsideInfo); startedPlugins.remove(pluginId); } @@ -541,6 +555,9 @@ public class DefaultPluginManager implements PluginManager{ * @return 排序的插件信息 */ protected List getSortPlugin(Map pluginInfos){ + if(ObjectUtils.isEmpty(pluginInfos)){ + return Collections.emptyList(); + } if (ObjectUtils.isEmpty(sortedPluginIds)) { return new ArrayList<>(pluginInfos.values()); } @@ -607,5 +624,28 @@ public class DefaultPluginManager implements PluginManager{ } } + /** + * 没有扫描到插件时的日志打印 + */ + private void printOfNotFoundPlugins(){ + StringBuilder warn = new StringBuilder(); + warn.append("以下路径未发现插件: \n"); + if(pluginRootDirs.size() == 1){ + warn.append(pluginRootDirs.get(0)).append("\n"); + } else { + for (int i = 0; i < pluginRootDirs.size(); i++) { + warn.append(i + 1).append(". ").append(pluginRootDirs.get(i)).append("\n"); + } + } + warn.append("请检查路径是否合适.\n"); + warn.append("请检查配置[plugin.runMode]是否合适.\n"); + if(provider.getRuntimeMode() == RuntimeMode.DEV){ + warn.append("请检查插件包是否编译.\n"); + } else { + warn.append("请检查插件是否合法.\n"); + } + log.warn(warn.toString()); + } + } diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/PluginLauncherManager.java b/spring-brick/src/main/java/com/gitee/starblues/core/PluginLauncherManager.java index 432fcf62d4c2491517c7f42f5ffe67eea0441b3d..678fa6ea1eec88676b6de2a9e97dee4e57ba7698 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/PluginLauncherManager.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/PluginLauncherManager.java @@ -89,7 +89,7 @@ public class PluginLauncherManager extends DefaultPluginManager{ @Override protected void start(PluginInsideInfo pluginInsideInfo) throws Exception { - super.start(pluginInsideInfo); + launcherChecker.checkCanStart(pluginInsideInfo); try { InsidePluginDescriptor pluginDescriptor = pluginInsideInfo.getPluginDescriptor(); PluginInteractive pluginInteractive = new DefaultPluginInteractive(pluginDescriptor, @@ -98,6 +98,8 @@ public class PluginLauncherManager extends DefaultPluginManager{ SpringPluginHook springPluginHook = pluginLauncher.run(); RegistryPluginInfo registryPluginInfo = new RegistryPluginInfo(pluginDescriptor, springPluginHook); registryInfo.put(pluginDescriptor.getPluginId(), registryPluginInfo); + pluginInsideInfo.setPluginState(PluginState.STARTED); + super.startFinish(pluginInsideInfo); } catch (Exception e){ // 启动失败, 进行停止 pluginInsideInfo.setPluginState(PluginState.STARTED_FAILURE); @@ -126,6 +128,7 @@ public class PluginLauncherManager extends DefaultPluginManager{ } } + static class RegistryPluginInfo{ private final PluginDescriptor descriptor; private final SpringPluginHook springPluginHook; diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/PluginLauncher.java b/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/PluginLauncher.java index 4c5ba7882c61a19393266e00b1a4770cf7db5724..1783a51d2650eef5efea24883192cbf830654ffc 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/PluginLauncher.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/PluginLauncher.java @@ -78,7 +78,7 @@ public class PluginLauncher extends AbstractLauncher { } protected GenericClassLoader getParentClassLoader() throws Exception { - ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + ClassLoader contextClassLoader = pluginInteractive.getMainApplicationContext().getClassLoader(); if(contextClassLoader instanceof GenericClassLoader){ return (GenericClassLoader) contextClassLoader; } else { diff --git a/spring-brick/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java b/spring-brick/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java index 0a8c6b12c2e1223c89797a6c29f1e570129f4952..af9d919caa012e8a5f8dccef498f2bf841615be8 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java +++ b/spring-brick/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java @@ -90,12 +90,8 @@ public class DefaultPluginOperator implements PluginOperator { return true; } initBeforeLogPrint(); - // 触发插件初始化监听器 - pluginInitializerListenerFactory.before(); if(!configuration.enable()){ log.info("插件功能已被禁用!"); - // 如果禁用的话, 直接返回 - pluginInitializerListenerFactory.complete(); return false; } // 开始加载插件 @@ -103,6 +99,8 @@ public class DefaultPluginOperator implements PluginOperator { if(ObjectUtils.isEmpty(pluginInfos)){ return false; } + // 触发插件初始化监听器 + pluginInitializerListenerFactory.before(); boolean isFoundException = false; for (PluginInfo pluginInfo : pluginInfos) { try { diff --git a/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContext.java b/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContext.java index 070e04a6b4f0d567069f32925f772b48cad0eb1e..d9fd8e717fca00aa8f8cba04b49760df41f50dc9 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContext.java +++ b/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContext.java @@ -16,6 +16,8 @@ package com.gitee.starblues.spring; +import com.gitee.starblues.loader.classloader.GenericClassLoader; + import java.util.Map; /** @@ -32,4 +34,10 @@ public interface MainApplicationContext extends ApplicationContext { */ Map> getConfigurableEnvironment(); + /** + * 得到主程序的 ClassLoader + * @return ClassLoader + */ + ClassLoader getClassLoader(); + } diff --git a/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContextProxy.java b/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContextProxy.java index a430ae8a831491cd595ffc4b39d603bfee909f97..a6c98fa0d684927d21df729f9ffef575dd39d793 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContextProxy.java +++ b/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContextProxy.java @@ -16,6 +16,7 @@ package com.gitee.starblues.spring; +import com.gitee.starblues.loader.classloader.GenericClassLoader; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.EnumerablePropertySource; @@ -35,15 +36,18 @@ import java.util.Map; public class MainApplicationContextProxy extends ApplicationContextProxy implements MainApplicationContext{ private final GenericApplicationContext applicationContext; + private final ClassLoader classLoader; public MainApplicationContextProxy(GenericApplicationContext applicationContext) { super(applicationContext.getBeanFactory()); this.applicationContext = applicationContext; + this.classLoader = Thread.currentThread().getContextClassLoader(); } public MainApplicationContextProxy(GenericApplicationContext applicationContext, AutoCloseable autoCloseable) { super(applicationContext.getBeanFactory(), autoCloseable); this.applicationContext = applicationContext; + this.classLoader = Thread.currentThread().getContextClassLoader(); } @Override @@ -67,4 +71,9 @@ public class MainApplicationContextProxy extends ApplicationContextProxy impleme } return environmentMap; } + + @Override + public ClassLoader getClassLoader() { + return classLoader; + } }