From 0afa950f79fa2927d609c0d790800277d81e02a1 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Wed, 23 Mar 2022 10:47:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=AE=89=E8=A3=85=E6=8F=92=E4=BB=B6=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README_zh.md | 2 +- pom.xml | 2 +- spring-brick-bootstrap/pom.xml | 2 +- .../EmptyMainApplicationContext.java | 13 ++-- spring-brick-common/pom.xml | 2 +- spring-brick-loader/pom.xml | 2 +- .../loader/launcher/AbstractLauncher.java | 10 +-- spring-brick-maven-packager/pom.xml | 2 +- .../plugin-help.xml | 2 +- .../main/resources/META-INF/maven/plugin.xml | 2 +- spring-brick/pom.xml | 2 +- .../starblues/core/DefaultPluginManager.java | 72 ++++++++++++++----- .../starblues/core/PluginLauncherManager.java | 5 +- .../core/launcher/plugin/PluginLauncher.java | 2 +- .../operator/DefaultPluginOperator.java | 6 +- .../spring/MainApplicationContext.java | 8 +++ .../spring/MainApplicationContextProxy.java | 9 +++ 17 files changed, 99 insertions(+), 44 deletions(-) diff --git a/README_zh.md b/README_zh.md index 0d7e119..90a58e9 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 4847d11..6c59803 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 c5a7505..2c7d6aa 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 53a5536..8a15ab6 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 90be99f..460059e 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 8159265..b340b56 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 573ce90..e1d1c35 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 0aebe4d..9a5b4c6 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/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 b3fd627..923cc05 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 b3fd627..923cc05 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 e32cc26..55b844b 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 50b3e55..ec4027c 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 432fcf6..678fa6e 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 4c5ba78..1783a51 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 0a8c6b1..af9d919 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 070e04a..d9fd8e7 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 a430ae8..a6c98fa 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; + } } -- Gitee From 085327e0fcb1081484e2ece5a60ee8ccbc26dec7 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Thu, 31 Mar 2022 16:02:14 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8C=85Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/starblues/plugin/pack/utils/CommonUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 f9d7229..90c4898 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(){} -- Gitee