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;
+ }
}