diff --git a/README.md b/README.md
index 82938119e2be5410b1ba4ee9109842c9ce796e01..769d2999e9d455a2ed216bee1b27407cc124151e 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,6 @@ The framework can be developed in the `spring-boot` project plugin, plugin can b
- [spring-brick-example](https://gitee.com/starblues/springboot-plugin-framework-example)
### Contact
-QQ: 859570617(**After you like the framework, you can enter the group. Please note the Gitee/GitHub nickname before entering the group**)
+QQ: 859570617(QQ Group 1 is full), 536825438(QQ Group 2)(**After you like the framework, you can enter the group. Please note the Gitee/GitHub nickname before entering the group**)
diff --git a/README_zh.md b/README_zh.md
index fcd08f208b5b2860d1bcf62815d38e417a9a906e..a4b01036be933ef2f7c6f2fc3edf33063b33959a 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -57,7 +57,7 @@
- [spring-brick 功能测试+案例](https://gitee.com/starblues/springboot-plugin-framework-example)
### 交流 | Contact
-QQ交流群: 859570617
+QQ交流群: 859570617(群1, 已满), 536825438(群2)
### 支持 | Support
如果您觉得框架使用起来不错的, 或者想支持本框架继续维护, 开源不易, 您可以通过如下方式进行支持:
diff --git a/pom.xml b/pom.xml
index 9a9e053b048e23f346cc8b4cad80a8c04cc5c325..def3519d40d491351d9e97d9e8e7f2ed005abc3b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
com.gitee.starblues
spring-brick-parent
pom
- 3.1.1
+ 3.1.2
spring-brick-common
diff --git a/spring-brick-bootstrap/pom.xml b/spring-brick-bootstrap/pom.xml
index bb304105d883b017085f4a0b66cb9cc9c537376d..0bf2be4655e6981b09281a5a83a5cea5fff46913 100644
--- a/spring-brick-bootstrap/pom.xml
+++ b/spring-brick-bootstrap/pom.xml
@@ -7,7 +7,7 @@
spring-brick-parent
com.gitee.starblues
- 3.1.1
+ 3.1.2
spring-brick-bootstrap
diff --git a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/ConfigurePluginEnvironment.java b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/ConfigurePluginEnvironment.java
index 3a054091e7806b98228fed355c683cc587bfcd7b..0f53317bb149abe7631280f9cb1d72291af3a85b 100644
--- a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/ConfigurePluginEnvironment.java
+++ b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/ConfigurePluginEnvironment.java
@@ -40,7 +40,7 @@ import java.util.Map;
*
* @author starBlues
* @since 3.0.0
- * @version 3.1.1
+ * @version 3.1.2
*/
public class ConfigurePluginEnvironment {
private final Logger logger = LoggerFactory.getLogger(ConfigurePluginEnvironment.class);
diff --git a/spring-brick-common/pom.xml b/spring-brick-common/pom.xml
index e3b63b278259259942b13e6f88165658ba9fdb77..28acc18c50002f3572b88fdb9134d18dc8fcad27 100644
--- a/spring-brick-common/pom.xml
+++ b/spring-brick-common/pom.xml
@@ -7,7 +7,7 @@
spring-brick-parent
com.gitee.starblues
- 3.1.1
+ 3.1.2
spring-brick-common
diff --git a/spring-brick-common/src/main/java/com/gitee/starblues/common/ManifestKey.java b/spring-brick-common/src/main/java/com/gitee/starblues/common/ManifestKey.java
index 0a33924f7a452e64789dd93c773b8361abae0867..74b62676e77fa310a438702f2c617e92cb52d1b8 100644
--- a/spring-brick-common/src/main/java/com/gitee/starblues/common/ManifestKey.java
+++ b/spring-brick-common/src/main/java/com/gitee/starblues/common/ManifestKey.java
@@ -78,11 +78,6 @@ public class ManifestKey {
*/
public static final String MAIN_LIB_DIR = "Lib-Dir";
- /**
- * jar main lib indexes
- */
- public static final String MAIN_LIB_INDEXES = "Lib-Indexes";
-
/**
* main package type
diff --git a/spring-brick-common/src/main/java/com/gitee/starblues/utils/FilesUtils.java b/spring-brick-common/src/main/java/com/gitee/starblues/utils/FilesUtils.java
index 50c481dd4994f1de91f16b643d91300b40eabf0c..34fa6ce8cff6244b309c1b03a83071a14ac2f0c1 100644
--- a/spring-brick-common/src/main/java/com/gitee/starblues/utils/FilesUtils.java
+++ b/spring-brick-common/src/main/java/com/gitee/starblues/utils/FilesUtils.java
@@ -21,13 +21,15 @@ import com.gitee.starblues.common.PackageStructure;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
+import java.util.List;
/**
* 文件工具类
*
* @author starBlues
* @since 3.0.0
- * @version 3.1.0
+ * @version 3.1.2
*/
public class FilesUtils {
@@ -232,5 +234,62 @@ public class FilesUtils {
return path.startsWith(Constants.RELATIVE_SIGN);
}
+ /**
+ * 判断两文件是否在同一个目录下
+ * @param file1 文件1
+ * @param file2 文件2
+ * @return 所属目录
+ */
+ public static File sameParent(File file1, File file2){
+ if(file1 == null || file2 == null){
+ return null;
+ }
+ File parentFile = file1.getParentFile();
+ if(parentFile.equals(file2.getParentFile())){
+ return parentFile;
+ }
+ return null;
+ }
+
+ /**
+ * 判断某个目录是否存在于根目录下
+ * @param rootPath 根目录
+ * @param comparePath 比较的目录
+ * @return boolean
+ */
+ public static boolean includePath(Path rootPath, Path comparePath){
+ if(rootPath == null || comparePath == null){
+ return false;
+ }
+ return comparePath.toString().startsWith(rootPath.toString());
+ }
+
+ /**
+ * 是否为子文件
+ * @param rootFile rootFile
+ * @param childFile 子文件
+ * @return boolean
+ */
+ public static boolean isChildFile(List rootFile, File childFile){
+ if(ObjectUtils.isEmpty(rootFile) || childFile == null || !childFile.exists()){
+ return false;
+ }
+ for (String fileStr : rootFile) {
+ File file = new File(fileStr);
+ if(!file.exists()){
+ continue;
+ }
+ File[] files = file.listFiles();
+ if(files == null){
+ continue;
+ }
+ for (File f : files) {
+ if(f.equals(childFile)){
+ return true;
+ }
+ }
+ }
+ return false;
+ }
}
diff --git a/spring-brick-common/src/main/java/com/gitee/starblues/utils/ObjectUtils.java b/spring-brick-common/src/main/java/com/gitee/starblues/utils/ObjectUtils.java
index fede52009b99420940dc50fb38072eb3976a5fed..7e0172c4cde92f45bc7068964ecd7d46602e6e32 100644
--- a/spring-brick-common/src/main/java/com/gitee/starblues/utils/ObjectUtils.java
+++ b/spring-brick-common/src/main/java/com/gitee/starblues/utils/ObjectUtils.java
@@ -25,7 +25,7 @@ import java.util.*;
*
* @author starBlues
* @since 3.0.0
- * @version 3.0.0
+ * @version 3.1.2
*/
public class ObjectUtils {
@@ -270,6 +270,18 @@ public class ObjectUtils {
return false;
}
+ public static boolean equalsElement(Object element, Object... objects) {
+ if (element == null || objects == null) {
+ return false;
+ }
+ for (Object obj : objects) {
+ if (Objects.equals(element, obj)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public static boolean nullSafeEquals(Object o1, Object o2) {
if (o1 == o2) {
return true;
diff --git a/spring-brick-loader/pom.xml b/spring-brick-loader/pom.xml
index 2eee617fecace8772dc73b6e22f752e6039e6137..34b1da24f0e58d73de6449b25fbb9aff23f5a1d7 100644
--- a/spring-brick-loader/pom.xml
+++ b/spring-brick-loader/pom.xml
@@ -5,7 +5,7 @@
spring-brick-parent
com.gitee.starblues
- 3.1.1
+ 3.1.2
4.0.0
diff --git a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/LoaderConstant.java b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/LoaderConstant.java
index cf9da2c35fe4bdc8ad5cdcea566195f1028ca71e..bb7853e64d54997fa804d146ba148794ae6eb1b8 100644
--- a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/LoaderConstant.java
+++ b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/LoaderConstant.java
@@ -39,7 +39,6 @@ public class LoaderConstant {
* ================= Manifest Key =====================
*/
public static final String MAIN_LIB_DIR = "Lib-Dir";
- public static final String MAIN_LIB_INDEXES = "Lib-Indexes";
public static final String MAIN_LIB_INDEXES_SPLIT = " ";
public static final String START_CLASS = "Start-Class";
diff --git a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/PluginResourceStorage.java b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/PluginResourceStorage.java
index 7af081ca39cde513b3da6c32fcded1894c76c773..67ec8ece5cda7a7293d98b73ee9bff78af983313 100644
--- a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/PluginResourceStorage.java
+++ b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/PluginResourceStorage.java
@@ -25,6 +25,7 @@ import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -34,7 +35,7 @@ import java.util.concurrent.ConcurrentHashMap;
*
* @author starBlues
* @since 3.0.0
- * @version 3.0.0
+ * @version 3.1.2
*/
public class PluginResourceStorage {
@@ -45,11 +46,11 @@ public class PluginResourceStorage {
* @param pluginId 插件id
* @param pluginFileName 插件文件名称
*/
- public static void addPlugin(String pluginId, String pluginFileName){
+ public static void addPlugin(String pluginId, String pluginFileName, List libPath){
if(STORAGE_MAP.containsKey(pluginId)){
return;
}
- STORAGE_MAP.put(pluginId, new Storage(pluginFileName));
+ STORAGE_MAP.put(pluginId, new Storage(pluginFileName, libPath));
}
/**
@@ -80,7 +81,7 @@ public class PluginResourceStorage {
* @param file 插件文件
* @param jarFile 插件jar文件
*/
- public static void addRootJarFile(File file, JarFile jarFile){
+ public static void addRootJarFile(File file, JarFileWrapper jarFile){
STORAGE_MAP.forEach((k,v)->{
v.addRootJarFile(file, jarFile);
});
@@ -91,9 +92,9 @@ public class PluginResourceStorage {
* @param file 插件文件
* @return 插件jar文件
*/
- public static JarFile getRootJarFile(File file){
+ public static JarFileWrapper getRootJarFile(File file){
for (Storage value : STORAGE_MAP.values()) {
- JarFile jarFile = value.getRootJarFile(file);
+ JarFileWrapper jarFile = value.getRootJarFile(file);
if(jarFile != null){
return jarFile;
}
@@ -104,31 +105,37 @@ public class PluginResourceStorage {
private static class Storage implements Closeable {
private final String pluginFileName;
- private final Map rootJarFileMap = new ConcurrentHashMap<>();
+ private final List libPath;
+ private final Map rootJarFileMap = new ConcurrentHashMap<>();
private final Map> jarFileMap = new ConcurrentHashMap<>();
- public Storage(String pluginFileName) {
+ public Storage(String pluginFileName, List libPath) {
this.pluginFileName = pluginFileName;
+ if(libPath == null){
+ this.libPath = Collections.emptyList();
+ } else {
+ this.libPath = libPath;
+ }
}
public void addJarFile(String name, AbstractJarFile jarFile){
if(name == null || jarFile == null){
return;
}
- if(name.contains(pluginFileName)){
+ if(isAddFile(name)){
List jarFiles = jarFileMap.computeIfAbsent(name, k -> new ArrayList<>());
jarFiles.add(jarFile);
}
}
- public void addRootJarFile(File file, JarFile jarFile){
+ public void addRootJarFile(File file, JarFileWrapper jarFile){
String absolutePath = file.getAbsolutePath();
- if(absolutePath.contains(pluginFileName)){
+ if(isAddFile(absolutePath)){
rootJarFileMap.put(file, jarFile);
}
}
- public JarFile getRootJarFile(File file){
+ public JarFileWrapper getRootJarFile(File file){
return rootJarFileMap.get(file);
}
@@ -145,15 +152,29 @@ public class PluginResourceStorage {
IOUtils.closeQuietly(jarFile);
}
}
- for (JarFile jarFile : rootJarFileMap.values()) {
+ for (JarFileWrapper jarFile : rootJarFileMap.values()) {
if(jarFile == null){
continue;
}
+ jarFile.canClosed();
IOUtils.closeQuietly(jarFile);
}
jarFileMap.clear();
rootJarFileMap.clear();
}
+
+ private boolean isAddFile(String path){
+ if(path.contains(pluginFileName)){
+ return true;
+ }
+ for (String libPath : libPath) {
+ if(path.contains(libPath)){
+ return true;
+ }
+ }
+ return false;
+ }
+
}
diff --git a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/loader/BaseURLResourceLoader.java b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/loader/BaseURLResourceLoader.java
new file mode 100644
index 0000000000000000000000000000000000000000..5468cb8ac5d220eb44d89912989ffff8b306872e
--- /dev/null
+++ b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/loader/BaseURLResourceLoader.java
@@ -0,0 +1,36 @@
+package com.gitee.starblues.loader.classloader.resource.loader;
+
+import com.gitee.starblues.loader.classloader.resource.storage.ResourceStorage;
+
+import java.net.URL;
+
+/**
+ * 基本 URL 资源加载
+ *
+ * @author starBlues
+ * @since 3.1.2
+ * @version 3.1.2
+ */
+public class BaseURLResourceLoader implements ResourceLoader{
+
+ private final URL baseUrl;
+
+ public BaseURLResourceLoader(URL baseUrl) {
+ this.baseUrl = baseUrl;
+ }
+
+ @Override
+ public URL getBaseUrl() {
+ return baseUrl;
+ }
+
+ @Override
+ public void load(ResourceStorage resourceStorage) throws Exception {
+
+ }
+
+ @Override
+ public void close() throws Exception {
+
+ }
+}
diff --git a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/loader/JarResourceLoader.java b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/loader/JarResourceLoader.java
index 48c4132ac50c221208e3b2c115e8753fd823081c..69d374b8c560102ce9ee3ba7b9ef8787b5c4eaad 100644
--- a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/loader/JarResourceLoader.java
+++ b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/loader/JarResourceLoader.java
@@ -29,7 +29,7 @@ import java.util.jar.JarInputStream;
* jar 资源加载者
* @author starBlues
* @since 3.0.0
- * @version 3.1.1
+ * @version 3.1.2
*/
public class JarResourceLoader extends AbstractResourceLoader {
@@ -75,6 +75,7 @@ public class JarResourceLoader extends AbstractResourceLoader {
JarEntry jarEntry = null;
while ((jarEntry = jarInputStream.getNextJarEntry()) != null) {
if(excludeResource.exclude(jarEntry)){
+ jarInputStream.closeEntry();
continue;
}
if(includeResource.include(jarEntry)){
@@ -84,8 +85,8 @@ public class JarResourceLoader extends AbstractResourceLoader {
return getClassBytes(name, jarInputStream, false);
});
resourceStorage.add(cacheResource);
- jarInputStream.closeEntry();
}
+ jarInputStream.closeEntry();
}
} finally {
jarInputStream.close();
diff --git a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/storage/AbstractResourceStorage.java b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/storage/AbstractResourceStorage.java
index 924633d6050ff17789deff95231aea31c83d80f2..f915df5d3b44a20aec350dc570cfa157acaee362 100644
--- a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/storage/AbstractResourceStorage.java
+++ b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/storage/AbstractResourceStorage.java
@@ -32,7 +32,7 @@ import java.util.*;
*
* @author starBlues
* @since 3.0.0
- * @version 3.1.1
+ * @version 3.1.2
*/
public abstract class AbstractResourceStorage implements ResourceStorage {
@@ -69,6 +69,7 @@ public abstract class AbstractResourceStorage implements ResourceStorage {
IOUtils.closeQuietly(inputStream);
}
inputStreams.clear();
+ hotUrls.clear();
baseUrls.clear();
}
@@ -171,11 +172,9 @@ public abstract class AbstractResourceStorage implements ResourceStorage {
addResource(resource);
return resource;
} catch (Exception e) {
- e.printStackTrace();
return null;
}
}
-
return null;
}
@@ -211,6 +210,7 @@ public abstract class AbstractResourceStorage implements ResourceStorage {
resource = null;
return r;
}
+
private boolean next() {
if (resource != null) {
return true;
@@ -233,13 +233,20 @@ public abstract class AbstractResourceStorage implements ResourceStorage {
return null;
}
Resource resource = new DefaultResource(name, baseUrl, existUrl);
- try {
- addResource(resource);
- } catch (Exception e){
- // 忽略异常
- }
+ addResourceWrapper(resource);
return resource;
}
}
+ private void addResourceWrapper(Resource resource){
+ if(resource == null){
+ return;
+ }
+ try {
+ addResource(resource);
+ } catch (Exception e){
+ // 忽略异常
+ }
+ }
+
}
diff --git a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/storage/CacheFastResourceStorage.java b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/storage/CacheFastResourceStorage.java
index 121ded3396f067825e7dff9731fa707f6d0aaa1b..b6b162d01353fedd37756b0e8ed18b634479d1aa 100644
--- a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/storage/CacheFastResourceStorage.java
+++ b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/classloader/resource/storage/CacheFastResourceStorage.java
@@ -33,15 +33,13 @@ import java.util.concurrent.TimeUnit;
*
* @author starBlues
* @since 3.1.1
- * @version 3.1.1
+ * @version 3.1.2
*/
public class CacheFastResourceStorage extends AbstractResourceStorage {
protected final MultiCache resourceStorage;
private final ResourceStorage cacheResourceStorage;
- private final List inputStreams = new ArrayList<>();
-
private volatile boolean release = false;
@SuppressWarnings("all")
@@ -136,10 +134,8 @@ public class CacheFastResourceStorage extends AbstractResourceStorage {
@Override
public void close() throws Exception {
resourceStorage.clear(ResourceUtils::release);
- for (InputStream inputStream : inputStreams) {
- IOUtils.closeQuietly(inputStream);
- }
- inputStreams.clear();
+ IOUtils.closeQuietly(cacheResourceStorage);
+ super.close();
}
diff --git a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/jar/Handler.java b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/jar/Handler.java
index e8f61ed7c46876d462593e393036545e562f50e5..517893dcaa05c3474d5b66f3bb9ba20512f51101 100644
--- a/spring-brick-loader/src/main/java/com/gitee/starblues/loader/jar/Handler.java
+++ b/spring-brick-loader/src/main/java/com/gitee/starblues/loader/jar/Handler.java
@@ -64,12 +64,6 @@ public class Handler extends URLStreamHandler {
private static URL jarContextUrl;
- private static SoftReference