From 51db24fbf3d3f5cb2e7676dde64b7a10f335d538 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Sat, 28 May 2022 13:12:06 +0800 Subject: [PATCH] update to 3.0.3 --- .../bootstrap/ConfigurePluginEnvironment.java | 1 + .../EmptyMainApplicationContext.java | 4 +- .../bootstrap/PluginListableBeanFactory.java | 106 +++++++----- .../bootstrap/PluginSpringApplication.java | 2 +- .../bootstrap/annotation/AutowiredType.java | 46 ++++++ .../plugin/pack/AbstractPackagerMojo.java | 3 + .../plugin/pack/BasicRepackager.java | 3 +- .../gitee/starblues/plugin/pack/Constant.java | 8 +- .../starblues/plugin/pack/RepackageMojo.java | 1 - .../plugin/pack/main/JarOuterPackager.java | 4 +- .../plugin/pack/prod/DirProdRepackager.java | 13 +- .../plugin/pack/prod/ProdRepackager.java | 1 - .../plugin/pack/prod/ZipProdRepackager.java | 1 + .../plugin/pack/utils/CommonUtils.java | 22 +++ .../plugin/pack/utils/PackageJar.java | 3 +- .../plugin/pack/utils/PackageZip.java | 16 +- .../checker/DefaultPluginLauncherChecker.java | 7 +- .../classloader/CacheMainResourceMatcher.java | 4 +- .../ComposeMainResourceMatcher.java | 62 +++++++ .../DefaultMainResourceMatcher.java | 32 ++-- .../core/classloader/MainResourceMatcher.java | 4 +- .../core/classloader/PluginClassLoader.java | 19 +-- .../ProhibitMainResourceMatcher.java | 4 +- .../DefaultMainResourcePatternDefiner.java | 153 ++++++++++++++++++ .../core/launcher/plugin/PluginLauncher.java | 29 +++- .../PluginMainResourcePatternDefiner.java | 117 +------------- .../DefaultIntegrationConfiguration.java | 3 +- .../integration/ExtendPointConfiguration.java | 14 +- .../spring/MainApplicationContext.java | 7 +- .../spring/MainApplicationContextProxy.java | 12 +- update.md | 21 +-- 31 files changed, 482 insertions(+), 240 deletions(-) create mode 100644 spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/annotation/AutowiredType.java create mode 100644 spring-brick/src/main/java/com/gitee/starblues/core/classloader/ComposeMainResourceMatcher.java create mode 100644 spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/DefaultMainResourcePatternDefiner.java 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 c159c6e..67ba594 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 @@ -23,6 +23,7 @@ import com.gitee.starblues.utils.Assert; import com.gitee.starblues.utils.FilesUtils; import com.gitee.starblues.utils.ObjectUtils; import com.gitee.starblues.utils.PluginFileUtils; +import org.springframework.context.support.LiveBeansView; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; 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 e4ddb24..34c6c9c 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 @@ -47,8 +47,8 @@ public class EmptyMainApplicationContext implements MainApplicationContext { } @Override - public boolean isResolveDependency(String packageName) { - return false; + public Object resolveDependency(String requestingBeanName, Class dependencyType) { + return null; } @Override diff --git a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginListableBeanFactory.java b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginListableBeanFactory.java index 5d1a873..3aef325 100644 --- a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginListableBeanFactory.java +++ b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginListableBeanFactory.java @@ -16,24 +16,24 @@ package com.gitee.starblues.bootstrap; +import com.gitee.starblues.bootstrap.annotation.AutowiredType; +import com.gitee.starblues.bootstrap.processor.ProcessorContext; import com.gitee.starblues.bootstrap.utils.DestroyUtils; +import com.gitee.starblues.core.classloader.MainResourceMatcher; +import com.gitee.starblues.core.classloader.PluginClassLoader; import com.gitee.starblues.spring.MainApplicationContext; import com.gitee.starblues.spring.SpringBeanFactory; -import com.gitee.starblues.utils.ObjectUtils; import com.gitee.starblues.utils.ReflectionUtils; import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.TypeConverter; -import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.DependencyDescriptor; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.ScopeNotActiveException; -import org.springframework.core.ResolvableType; import org.springframework.lang.Nullable; import java.util.Map; @@ -49,12 +49,14 @@ import java.util.stream.Stream; */ public class PluginListableBeanFactory extends DefaultListableBeanFactory { - private final Logger logger = LoggerFactory.getLogger(PluginListableBeanFactory.class); + private static final Logger LOG = LoggerFactory.getLogger(PluginListableBeanFactory.class); private final MainApplicationContext applicationContext; + private final ClassLoader pluginClassLoader; - public PluginListableBeanFactory(MainApplicationContext applicationContext) { - this.applicationContext = applicationContext; + public PluginListableBeanFactory(ProcessorContext processorContext) { + this.applicationContext = processorContext.getMainApplicationContext(); + this.pluginClassLoader = processorContext.getResourceLoader().getClassLoader(); } @SuppressWarnings("unchecked") @@ -64,25 +66,45 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { @Nullable Set autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException { if(isDisabled(descriptor)){ - return resolveDependencyFromMain(descriptor, false); + // 插件被禁用的依赖Bean直接从主程序获取。 + return resolveDependencyFromMain(requestingBeanName, descriptor); } - try { - Object object = super.resolveDependency(descriptor, requestingBeanName, autowiredBeanNames, - typeConverter); - - if(object instanceof ObjectProvider){ - return new PluginObjectProviderWrapper((ObjectProvider) object, descriptor); + AutowiredType.Type autowiredType = getAutowiredType(descriptor); + if(autowiredType == AutowiredType.Type.MAIN){ + Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); + if(dependencyObj != null){ + return dependencyObj; } - return object; - } catch (BeansException e){ - if(e instanceof NoSuchBeanDefinitionException){ - Object dependencyBean = resolveDependencyFromMain(descriptor, true); - if(dependencyBean != null){ - return dependencyBean; + throw new NoSuchBeanDefinitionException(descriptor.getDependencyType()); + } else if(autowiredType == AutowiredType.Type.PLUGIN){ + return super.resolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter); + } else if(autowiredType == AutowiredType.Type.PLUGIN_MAIN){ + try { + Object object = super.resolveDependency(descriptor, requestingBeanName, autowiredBeanNames, + typeConverter); + + if(object instanceof ObjectProvider){ + return new PluginObjectProviderWrapper((ObjectProvider) object, requestingBeanName, descriptor); } + return object; + } catch (BeansException e){ + if(e instanceof NoSuchBeanDefinitionException){ + Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); + if(dependencyObj != null){ + return dependencyObj; + } + } + throw e; + } + } else if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ + Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); + if(dependencyObj != null){ + return dependencyObj; } - throw e; + return super.resolveDependency(descriptor, requestingBeanName, autowiredBeanNames, + typeConverter); } + throw new NoSuchBeanDefinitionException(descriptor.getDependencyType()); } @Override @@ -100,23 +122,33 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { return super.getBeanProvider(requiredType, allowEagerInit); } - - private Object resolveDependencyFromMain(DependencyDescriptor descriptor, boolean isResolveDependency){ - String packageName = descriptor.getDependencyType().getPackage().getName(); - if(isResolveDependency && !applicationContext.isResolveDependency(packageName)){ - return null; - } - String dependencyName = descriptor.getDependencyName(); - SpringBeanFactory springBeanFactory = applicationContext.getSpringBeanFactory(); - if(!ObjectUtils.isEmpty(dependencyName) && springBeanFactory.containsBean(dependencyName)){ - return springBeanFactory.getBean(dependencyName); + private AutowiredType.Type getAutowiredType(DependencyDescriptor descriptor){ + AutowiredType autowiredType = descriptor.getAnnotation(AutowiredType.class); + if(autowiredType != null){ + return autowiredType.value(); } else { - try { - return springBeanFactory.getBean(descriptor.getDependencyType()); - } catch (Exception e){ - throw new NoSuchBeanDefinitionException(descriptor.getDependencyType()); + return AutowiredType.Type.PLUGIN_MAIN; + } + } + + private Object resolveDependencyFromMain(String requestingBeanName, DependencyDescriptor descriptor){ + Object dependencyObj = null; + try { + if(pluginClassLoader instanceof PluginClassLoader){ + PluginClassLoader classLoader = (PluginClassLoader) pluginClassLoader; + MainResourceMatcher mainResourceMatcher = classLoader.getMainResourceMatcher(); + String className = descriptor.getDependencyType().getName(); + if(mainResourceMatcher.match(className)){ + dependencyObj = applicationContext.resolveDependency(requestingBeanName, + descriptor.getDependencyType()); + } + } else { + LOG.warn("Cannot get Bean from main program, plugin classLoader is not PluginClassLoader"); } + } catch (Exception e){ + return null; } + return dependencyObj; } private void destroyAll(){ @@ -141,12 +173,14 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { private class PluginObjectProviderWrapper implements ObjectProvider { private final ObjectProvider pluginObjectProvider; + + private final String requestingBeanName; private final DependencyDescriptor descriptor; @Override public Object getObject() throws BeansException { if(isDisabled(descriptor)){ - return resolveDependencyFromMain(descriptor, false); + return resolveDependencyFromMain(requestingBeanName, descriptor); } return pluginObjectProvider.getObject(); } diff --git a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginSpringApplication.java b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginSpringApplication.java index 8ac00e9..abdb79f 100644 --- a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginSpringApplication.java +++ b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginSpringApplication.java @@ -59,7 +59,7 @@ public class PluginSpringApplication extends SpringApplication { this.pluginProcessor = pluginProcessor; this.processorContext = processorContext; this.resourceLoader = processorContext.getResourceLoader(); - this.beanFactory = new PluginListableBeanFactory(processorContext.getMainApplicationContext()); + this.beanFactory = new PluginListableBeanFactory(processorContext); this.configurePluginEnvironment = new ConfigurePluginEnvironment(processorContext); this.applicationContext = getApplicationContext(); setDefaultPluginConfig(); diff --git a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/annotation/AutowiredType.java b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/annotation/AutowiredType.java new file mode 100644 index 0000000..af34b00 --- /dev/null +++ b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/annotation/AutowiredType.java @@ -0,0 +1,46 @@ +package com.gitee.starblues.bootstrap.annotation; + + +import java.lang.annotation.*; + +/** + * 注入类型 + * + * @author starBlues + * @version 3.0.3 + */ +@Target({ElementType.FIELD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface AutowiredType { + + /** + * 插件Bean注入类型 + * @return Type + */ + Type value() default Type.PLUGIN_MAIN; + + enum Type{ + /** + * Bean 注入类型(默认): 先插件后主程序 + */ + PLUGIN_MAIN, + + /** + * Bean 注入类型: 先主程序后插件 + */ + MAIN_PLUGIN, + + /** + * Bean 注入类型: 仅插件 + */ + PLUGIN, + + /** + * Bean 注入类型: 仅主程序 + */ + MAIN + } + + +} diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/AbstractPackagerMojo.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/AbstractPackagerMojo.java index b24c525..bfd4037 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/AbstractPackagerMojo.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/AbstractPackagerMojo.java @@ -48,6 +48,9 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo{ @Parameter(property = "spring-brick-packager.skip", defaultValue = "false") private boolean skip; + @Parameter + private String classifier; + @Parameter(property = "spring-brick-packager.pluginInfo") private PluginInfo pluginInfo; diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/BasicRepackager.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/BasicRepackager.java index 44bc3a5..7eee475 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/BasicRepackager.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/BasicRepackager.java @@ -17,6 +17,7 @@ package com.gitee.starblues.plugin.pack; import com.gitee.starblues.common.*; +import com.gitee.starblues.plugin.pack.utils.CommonUtils; import com.gitee.starblues.utils.FilesUtils; import com.gitee.starblues.utils.ObjectUtils; import lombok.Getter; @@ -120,7 +121,7 @@ public class BasicRepackager implements Repackager{ protected String createRootDir() throws MojoFailureException { String rootDirPath = getBasicRootDir(); File rootDir = new File(rootDirPath); - rootDir.deleteOnExit(); + CommonUtils.deleteFile(rootDir); if(rootDir.mkdir()){ return rootDirPath; } diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/Constant.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/Constant.java index a08d41b..b66fe5d 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/Constant.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/Constant.java @@ -31,6 +31,8 @@ public class Constant { public static final String SCOPE_SYSTEM = "system"; public static final String SCOPE_TEST = "test"; + public static final String MAVEN_POM_TYPE = "pom"; + public static final String MAVEN_MAIN_TYPE = "main"; public static final String MODE_MAIN = "main"; @@ -51,7 +53,7 @@ public class Constant { if(Constant.isSystemScope(artifact.getScope())){ return includeSystemScope == null || !includeSystemScope; } - return false; + return Constant.filterPomTypeArtifact(artifact); } public static boolean filterMainTypeArtifact(Artifact artifact){ @@ -59,6 +61,10 @@ public class Constant { return MAVEN_MAIN_TYPE.equalsIgnoreCase(artifact.getType()); } + public static boolean filterPomTypeArtifact(Artifact artifact){ + return MAVEN_POM_TYPE.equalsIgnoreCase(artifact.getType()); + } + public static boolean scopeFilter(String scope){ return SCOPE_PROVIDED.equalsIgnoreCase(scope) || SCOPE_TEST.equalsIgnoreCase(scope); diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/RepackageMojo.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/RepackageMojo.java index 0e6dbb7..1aa220a 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/RepackageMojo.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/RepackageMojo.java @@ -34,7 +34,6 @@ import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/main/JarOuterPackager.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/main/JarOuterPackager.java index 4d1e3ee..de5a493 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/main/JarOuterPackager.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/main/JarOuterPackager.java @@ -69,9 +69,7 @@ public class JarOuterPackager extends JarNestPackager { String fileName = mainConfig.getFileName(); String rootDirPath = FilesUtils.joiningFilePath(outputDirectory, fileName); File rootFile = new File(rootDirPath); - if(rootFile.exists()){ - rootFile.deleteOnExit(); - } + CommonUtils.deleteFile(rootFile); if(rootFile.mkdirs()){ return rootDirPath; } else { diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/DirProdRepackager.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/DirProdRepackager.java index 5a3bd8e..bd819f6 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/DirProdRepackager.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/DirProdRepackager.java @@ -68,18 +68,7 @@ public class DirProdRepackager extends DevRepackager { String fileName = prodConfig.getFileName(); String dirPath = FilesUtils.joiningFilePath(prodConfig.getOutputDirectory(), fileName); File dirFile = new File(dirPath); - if(dirFile.exists() && dirFile.isFile()){ - int i = 0; - while (true){ - dirFile = new File(dirPath + "_" + i); - if(dirFile.exists() && dirFile.isFile()){ - i = i + 1; - continue; - } - break; - } - } - dirFile.deleteOnExit(); + CommonUtils.deleteFile(dirFile); if(!dirFile.mkdirs()){ throw new MojoFailureException("Create package dir failure: " + dirFile.getPath()); } diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/ProdRepackager.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/ProdRepackager.java index 9db3b18..0ff7d34 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/ProdRepackager.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/ProdRepackager.java @@ -17,7 +17,6 @@ package com.gitee.starblues.plugin.pack.prod; import com.gitee.starblues.common.PackageType; -import com.gitee.starblues.plugin.pack.Constant; import com.gitee.starblues.plugin.pack.PluginInfo; import com.gitee.starblues.plugin.pack.RepackageMojo; import com.gitee.starblues.plugin.pack.Repackager; diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/ZipProdRepackager.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/ZipProdRepackager.java index dacd996..303fd54 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/ZipProdRepackager.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/prod/ZipProdRepackager.java @@ -25,6 +25,7 @@ import com.gitee.starblues.plugin.pack.RepackageMojo; import com.gitee.starblues.plugin.pack.dev.Dependency; import com.gitee.starblues.plugin.pack.dev.DevConfig; import com.gitee.starblues.plugin.pack.dev.DevRepackager; +import com.gitee.starblues.plugin.pack.utils.CommonUtils; import com.gitee.starblues.plugin.pack.utils.PackageZip; import com.gitee.starblues.utils.FilesUtils; import com.gitee.starblues.utils.ObjectUtils; 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 87b282e..09ac0a0 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 @@ -17,8 +17,11 @@ package com.gitee.starblues.plugin.pack.utils; import com.gitee.starblues.plugin.pack.filter.Exclude; +import org.apache.commons.io.FileUtils; import org.apache.maven.artifact.Artifact; +import org.apache.maven.plugin.MojoFailureException; +import java.io.File; import java.util.Objects; /** @@ -48,4 +51,23 @@ public class CommonUtils { return Objects.equals(artifact.getGroupId(), PLUGIN_FRAMEWORK_GROUP_ID) && Objects.equals(artifact.getArtifactId(), PLUGIN_FRAMEWORK_LOADER_ARTIFACT_ID); } + + public static void deleteFile(File rootFile) throws MojoFailureException { + try { + if(rootFile == null){ + return; + } + if(!rootFile.exists()){ + return; + } + if(rootFile.isFile()){ + FileUtils.delete(rootFile); + } else { + FileUtils.deleteDirectory(rootFile); + } + } catch (Exception e){ + e.printStackTrace(); + throw new MojoFailureException("Delete file '" + rootFile.getPath() + "' failure. " + e.getMessage()); + } + } } diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/PackageJar.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/PackageJar.java index d82a8f3..cf30122 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/PackageJar.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/PackageJar.java @@ -23,6 +23,7 @@ import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import java.io.File; import java.io.FileOutputStream; +import java.nio.file.Files; /** * jar 打包工具 @@ -45,7 +46,7 @@ public class PackageJar extends PackageZip{ @Override protected ArchiveOutputStream getOutputStream(File packFile) throws Exception { - return new JarArchiveOutputStream(new FileOutputStream(packFile)); + return new JarArchiveOutputStream(Files.newOutputStream(packFile.toPath())); } @Override diff --git a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/PackageZip.java b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/PackageZip.java index 7867941..f7aa974 100644 --- a/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/PackageZip.java +++ b/spring-brick-maven-packager/src/main/java/com/gitee/starblues/plugin/pack/utils/PackageZip.java @@ -28,6 +28,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import java.io.*; +import java.nio.file.Files; import java.util.Enumeration; import java.util.jar.Manifest; import java.util.zip.CRC32; @@ -73,18 +74,7 @@ public class PackageZip implements Closeable{ protected File getPackageFile(String rootPath) throws Exception { String fileSuffix = getPackageFileSuffix(); File file = new File(rootPath + "." + fileSuffix); - - if(file.exists()){ - int i = 0; - while (true){ - file = new File(rootPath + "_" + i + "." + fileSuffix); - if(file.exists()){ - i = i + 1; - continue; - } - break; - } - } + CommonUtils.deleteFile(file); if(file.createNewFile()){ return file; } @@ -96,7 +86,7 @@ public class PackageZip implements Closeable{ } protected ArchiveOutputStream getOutputStream(File packFile) throws Exception { - return new ZipArchiveOutputStream(new FileOutputStream(packFile)); + return new ZipArchiveOutputStream(Files.newOutputStream(packFile.toPath())); } public void copyDirToPackage(File rootDir, String packageDir) throws Exception { diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/checker/DefaultPluginLauncherChecker.java b/spring-brick/src/main/java/com/gitee/starblues/core/checker/DefaultPluginLauncherChecker.java index 052b74a..f2590e5 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/checker/DefaultPluginLauncherChecker.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/checker/DefaultPluginLauncherChecker.java @@ -77,6 +77,9 @@ public class DefaultPluginLauncherChecker implements PluginLauncherChecker { return; } String requires = pluginInfo.getPluginDescriptor().getRequires(); + if(ObjectUtils.isEmpty(requires)){ + return; + } boolean exactVersion = configuration.exactVersion(); int compareVersion = realizeProvider.getVersionInspector().compareTo(requires, version); PluginDescriptor descriptor = pluginInfo.getPluginDescriptor(); @@ -92,8 +95,4 @@ public class DefaultPluginLauncherChecker implements PluginLauncherChecker { } } - - - - } diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/CacheMainResourceMatcher.java b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/CacheMainResourceMatcher.java index 58ed42a..ff90653 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/CacheMainResourceMatcher.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/CacheMainResourceMatcher.java @@ -23,7 +23,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * 可缓存的 ResourceMatcher * @author starBlues - * @version 3.0.0 + * @version 3.0.3 */ public class CacheMainResourceMatcher extends DefaultMainResourceMatcher implements AutoCloseable { @@ -34,7 +34,7 @@ public class CacheMainResourceMatcher extends DefaultMainResourceMatcher impleme } @Override - public boolean match(String resourceUrl) { + public Boolean match(String resourceUrl) { Boolean match = resourceUrlMatchCache.get(resourceUrl); if(match == null){ match = super.match(resourceUrl); diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/ComposeMainResourceMatcher.java b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/ComposeMainResourceMatcher.java new file mode 100644 index 0000000..c993535 --- /dev/null +++ b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/ComposeMainResourceMatcher.java @@ -0,0 +1,62 @@ +/** + * Copyright [2019-2022] [starBlues] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.starblues.core.classloader; + +import com.gitee.starblues.utils.ObjectUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * 组合的 MainResourcePatternDefiner + * + * @author starBlues + * @version 3.0.3 + */ +public class ComposeMainResourceMatcher implements MainResourceMatcher{ + + private final List resourceMatchers; + + public ComposeMainResourceMatcher(){ + this(null); + } + + public ComposeMainResourceMatcher(List resourceMatchers) { + if(ObjectUtils.isEmpty(resourceMatchers)){ + this.resourceMatchers = new ArrayList<>(); + } else { + this.resourceMatchers = resourceMatchers; + } + } + + public void addMainResourceMatcher(MainResourceMatcher mainResourceMatcher){ + if(mainResourceMatcher == null){ + return; + } + resourceMatchers.add(mainResourceMatcher); + } + + @Override + public Boolean match(String resourceUrl) { + for (MainResourceMatcher resourceMatcher : resourceMatchers) { + if(resourceMatcher.match(resourceUrl)){ + return Boolean.TRUE; + } + } + return Boolean.FALSE; + } +} diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/DefaultMainResourceMatcher.java b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/DefaultMainResourceMatcher.java index 29c95de..8c82daa 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/DefaultMainResourceMatcher.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/DefaultMainResourceMatcher.java @@ -30,6 +30,11 @@ import java.util.Set; */ public class DefaultMainResourceMatcher implements MainResourceMatcher{ + private static final String DEFAULT_PATH_SEPARATOR = "/"; + + private final static String SEPARATOR_DOT = "."; + private final static String SEPARATOR_BACKSLASH = "\\"; + private final Set includePatterns; private final Set excludePatterns; @@ -42,13 +47,13 @@ public class DefaultMainResourceMatcher implements MainResourceMatcher{ } @Override - public boolean match(String resourceUrl) { + public Boolean match(String resourceUrl) { return match(includePatterns, resourceUrl); } - private boolean match(Collection patterns, String url){ + private Boolean match(Collection patterns, String url){ if(ObjectUtils.isEmpty(patterns) || ObjectUtils.isEmpty(url)){ - return false; + return Boolean.FALSE; } url = formatUrl(url); for (String pattern : patterns) { @@ -57,28 +62,33 @@ public class DefaultMainResourceMatcher implements MainResourceMatcher{ return !excludeMatch(excludePatterns, url); } } - return false; + return Boolean.FALSE; } - private boolean excludeMatch(Collection patterns, String url){ + private Boolean excludeMatch(Collection patterns, String url){ if(ObjectUtils.isEmpty(patterns) || ObjectUtils.isEmpty(url)){ - return false; + return Boolean.FALSE; } url = formatUrl(url); for (String pattern : patterns) { boolean match = pathMatcher.match(pattern, url); if(match){ - return true; + return Boolean.TRUE; } } - return false; + return Boolean.FALSE; } private String formatUrl(String url){ - url = url.replace("\\", AntPathMatcher.DEFAULT_PATH_SEPARATOR); - if(url.startsWith(AntPathMatcher.DEFAULT_PATH_SEPARATOR)){ - url = url.substring(url.indexOf(AntPathMatcher.DEFAULT_PATH_SEPARATOR) + 1); + if(url.contains(SEPARATOR_DOT)){ + url = url.replace(SEPARATOR_DOT, AntPathMatcher.DEFAULT_PATH_SEPARATOR); + } + if(url.contains(SEPARATOR_BACKSLASH)){ + url = url.replace(SEPARATOR_BACKSLASH, AntPathMatcher.DEFAULT_PATH_SEPARATOR); + } + if(url.startsWith(DEFAULT_PATH_SEPARATOR)){ + url = url.substring(url.indexOf(DEFAULT_PATH_SEPARATOR) + 1); } return url; } diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/MainResourceMatcher.java b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/MainResourceMatcher.java index 5977f35..9b94955 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/MainResourceMatcher.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/MainResourceMatcher.java @@ -19,7 +19,7 @@ package com.gitee.starblues.core.classloader; /** * 主程序资源匹配者 * @author starBlues - * @version 3.0.0 + * @version 3.0.3 */ public interface MainResourceMatcher { @@ -28,6 +28,6 @@ public interface MainResourceMatcher { * @param resourceUrl 主程序资源url * @return true 匹配成功, false 匹配失败 */ - boolean match(String resourceUrl); + Boolean match(String resourceUrl); } diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/PluginClassLoader.java b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/PluginClassLoader.java index 31f624f..c94681e 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/PluginClassLoader.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/PluginClassLoader.java @@ -38,27 +38,24 @@ import java.util.Set; /** * 插件 classLoader * @author starBlues - * @version 3.0.0 + * @version 3.0.3 */ @Slf4j public class PluginClassLoader extends GenericClassLoader { private final GenericClassLoader parentClassLoader; - private MainResourceMatcher mainResourceMatcher; + private final MainResourceMatcher mainResourceMatcher; - public PluginClassLoader(String name, GenericClassLoader parentClassLoader, MainResourcePatternDefiner patternDefiner, - ResourceLoaderFactory resourceLoaderFactory) { + public PluginClassLoader(String name, GenericClassLoader parentClassLoader, + ResourceLoaderFactory resourceLoaderFactory, + MainResourceMatcher mainResourceMatcher) { super(name, parentClassLoader, resourceLoaderFactory); this.parentClassLoader = parentClassLoader; - if(patternDefiner != null){ - setMainResourceMatcher(new CacheMainResourceMatcher(patternDefiner)); - } else { - setMainResourceMatcher(new ProhibitMainResourceMatcher()); - } + this.mainResourceMatcher = mainResourceMatcher; } - public void setMainResourceMatcher(MainResourceMatcher mainResourceMatcher){ - this.mainResourceMatcher = Assert.isNotNull(mainResourceMatcher, "参数 mainResourceMatcher 不能为空"); + public MainResourceMatcher getMainResourceMatcher() { + return mainResourceMatcher; } public void addResource(InsidePluginDescriptor descriptor) throws Exception { diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/ProhibitMainResourceMatcher.java b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/ProhibitMainResourceMatcher.java index 296dacf..cba6d62 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/classloader/ProhibitMainResourceMatcher.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/classloader/ProhibitMainResourceMatcher.java @@ -19,12 +19,12 @@ package com.gitee.starblues.core.classloader; /** * 禁止匹配所有主程序资源 * @author starBlues - * @version 3.0.0 + * @version 3.0.3 */ public class ProhibitMainResourceMatcher implements MainResourceMatcher{ @Override - public boolean match(String resourceUrl) { + public Boolean match(String resourceUrl) { return false; } diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/DefaultMainResourcePatternDefiner.java b/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/DefaultMainResourcePatternDefiner.java new file mode 100644 index 0000000..ac6014e --- /dev/null +++ b/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/DefaultMainResourcePatternDefiner.java @@ -0,0 +1,153 @@ +/** + * Copyright [2019-2022] [starBlues] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.starblues.core.launcher.plugin; + +import com.gitee.starblues.core.classloader.MainResourcePatternDefiner; +import com.gitee.starblues.core.launcher.JavaMainResourcePatternDefiner; +import com.gitee.starblues.utils.ObjectUtils; +import com.gitee.starblues.utils.SpringBeanUtils; +import org.springframework.context.ApplicationContext; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 主程序资源匹配定义 + * + * @author starBlues + * @version 3.0.3 + */ +public class DefaultMainResourcePatternDefiner extends JavaMainResourcePatternDefiner { + + private static final String FRAMEWORK = "com/gitee/starblues/**"; + + public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories"; + + private final String mainPackage; + private final ApplicationContext applicationContext; + + public DefaultMainResourcePatternDefiner(String mainPackage, ApplicationContext applicationContext) { + this.mainPackage = mainPackage; + this.applicationContext = applicationContext; + } + + @Override + public Set getIncludePatterns() { + Set includeResourcePatterns = super.getIncludePatterns(); + // add mainPackage + includeResourcePatterns.add(ObjectUtils.changePackageToMatch(mainPackage)); + // add framework + includeResourcePatterns.add(FRAMEWORK); + addWebIncludeResourcePatterns(includeResourcePatterns); + addApiDoc(includeResourcePatterns); + addDbDriver(includeResourcePatterns); + + addIdea(includeResourcePatterns); + + // add extension + List extensionPatternDefiners = getExtensionPatternDefiners(); + for (MainResourcePatternDefiner extensionPatternDefiner : extensionPatternDefiners) { + Set includePatterns = extensionPatternDefiner.getIncludePatterns(); + if(!ObjectUtils.isEmpty(includePatterns)){ + includeResourcePatterns.addAll(includePatterns); + } + } + + return includeResourcePatterns; + } + + @Override + public Set getExcludePatterns() { + Set excludeResourcePatterns = new HashSet<>(); + excludeResourcePatterns.add(FACTORIES_RESOURCE_LOCATION); + + // add extension + List extensionPatternDefiners = getExtensionPatternDefiners(); + for (MainResourcePatternDefiner extensionPatternDefiner : extensionPatternDefiners) { + Set excludePatterns = extensionPatternDefiner.getExcludePatterns(); + if(!ObjectUtils.isEmpty(excludePatterns)){ + excludeResourcePatterns.addAll(excludePatterns); + } + } + return excludeResourcePatterns; + } + + protected void addWebIncludeResourcePatterns(Set patterns) { + patterns.add("org/springframework/web/**"); + patterns.add("org/springframework/http/**"); + patterns.add("org/springframework/remoting/**"); + patterns.add("org/springframework/ui/**"); + + patterns.add("org/springframework/boot/autoconfigure/http/**"); + patterns.add("org/springframework/boot/autoconfigure/web/**"); + patterns.add("org/springframework/boot/autoconfigure/websocket/**"); + patterns.add("org/springframework/boot/autoconfigure/webservices/**"); + patterns.add("org/springframework/boot/autoconfigure/jackson/**"); + + patterns.add("com/fasterxml/jackson/**"); + } + + protected void addApiDoc(Set patterns) { + patterns.add("springfox/documentation/**"); + patterns.add("io/swagger/**"); + patterns.add("org/springdoc/**"); + } + + protected void addDbDriver(Set patterns) { + // mysql + patterns.add("com/mysql/**"); + // oracle + patterns.add("oracle/jdbc/**"); + // sqlserver + patterns.add("com/microsoft/jdbc/sqlserver/**"); + // DB2 + patterns.add("com/ibm/db2/jdbc/**"); + // DB2/AS400 + patterns.add("com/ibm/as400/**"); + // Informix + patterns.add("com/informix/jdbc/**"); + // Hypersonic + patterns.add("org/hsql/**"); + // MS SQL + patterns.add("com/microsoft/jdbc/**"); + // Postgres + patterns.add("org/postgresql/**"); + // Sybase + patterns.add("com/sybase/jdbc2/**"); + // Weblogic + patterns.add("weblogic/jdbc/**"); + // h2 + patterns.add("jdbc/h2/**"); + } + + private void addIdea(Set includeResourcePatterns) { + // idea debug agent + includeResourcePatterns.add("com/intellij/rt/debugger/agent/**"); + } + + + /** + * 获取扩展的 MainResourcePatternDefiner + * + * @return List + */ + private List getExtensionPatternDefiners() { + return SpringBeanUtils.getBeans(applicationContext, MainResourcePatternDefiner.class); + } + +} 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 9878c3d..8ff0e50 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 @@ -16,24 +16,28 @@ package com.gitee.starblues.core.launcher.plugin; +import com.gitee.starblues.core.classloader.*; import com.gitee.starblues.core.descriptor.InsidePluginDescriptor; -import com.gitee.starblues.core.classloader.PluginClassLoader; import com.gitee.starblues.core.launcher.plugin.involved.PluginLaunchInvolved; import com.gitee.starblues.loader.classloader.GenericClassLoader; import com.gitee.starblues.loader.classloader.resource.loader.DefaultResourceLoaderFactory; import com.gitee.starblues.loader.classloader.resource.loader.ResourceLoaderFactory; import com.gitee.starblues.loader.launcher.AbstractLauncher; import com.gitee.starblues.loader.launcher.LauncherContext; +import com.gitee.starblues.spring.MainApplicationContext; import com.gitee.starblues.spring.SpringPluginHook; import com.gitee.starblues.utils.MsgUtils; +import com.gitee.starblues.utils.SpringBeanCustomUtils; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.WeakHashMap; /** * 插件启动引导类 * @author starBlues - * @version 3.0.1 + * @version 3.0.3 */ public class PluginLauncher extends AbstractLauncher { @@ -41,7 +45,7 @@ public class PluginLauncher extends AbstractLauncher { protected final PluginInteractive pluginInteractive; protected final InsidePluginDescriptor pluginDescriptor; - protected final PluginMainResourcePatternDefiner mainResourcePatternDefiner; + protected final MainResourceMatcher mainResourceMatcher; protected final PluginLaunchInvolved pluginLaunchInvolved; @@ -49,10 +53,24 @@ public class PluginLauncher extends AbstractLauncher { PluginLaunchInvolved pluginLaunchInvolved) { this.pluginInteractive = pluginInteractive; this.pluginDescriptor = pluginInteractive.getPluginDescriptor(); - this.mainResourcePatternDefiner = new PluginMainResourcePatternDefiner(pluginInteractive); + this.mainResourceMatcher = getMainResourceMatcher(pluginInteractive); this.pluginLaunchInvolved = pluginLaunchInvolved; } + protected MainResourceMatcher getMainResourceMatcher(PluginInteractive pluginInteractive){ + MainApplicationContext mainApplicationContext = pluginInteractive.getMainApplicationContext(); + // 获取主程序定义的资源匹配 + List mainResourceMatchers = + SpringBeanCustomUtils.getBeans(mainApplicationContext, MainResourceMatcher.class); + + List resourceMatchers = new ArrayList<>(mainResourceMatchers); + // 新增插件定义的资源匹配 + resourceMatchers.add(new DefaultMainResourceMatcher( + new PluginMainResourcePatternDefiner(pluginInteractive) + )); + return new ComposeMainResourceMatcher(resourceMatchers); + } + @Override protected ClassLoader createClassLoader(String... args) throws Exception { PluginClassLoader pluginClassLoader = getPluginClassLoader(); @@ -68,8 +86,7 @@ public class PluginLauncher extends AbstractLauncher { return classLoader; } PluginClassLoader pluginClassLoader = new PluginClassLoader( - pluginId, getParentClassLoader(), mainResourcePatternDefiner, - getResourceLoaderFactory() + pluginId, getParentClassLoader(), getResourceLoaderFactory(), mainResourceMatcher ); CLASS_LOADER_CACHE.put(key, pluginClassLoader); return pluginClassLoader; diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/PluginMainResourcePatternDefiner.java b/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/PluginMainResourcePatternDefiner.java index e74dfce..f32c6b0 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/PluginMainResourcePatternDefiner.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/PluginMainResourcePatternDefiner.java @@ -16,12 +16,9 @@ package com.gitee.starblues.core.launcher.plugin; +import com.gitee.starblues.core.classloader.MainResourcePatternDefiner; import com.gitee.starblues.core.descriptor.InsidePluginDescriptor; -import com.gitee.starblues.core.launcher.JavaMainResourcePatternDefiner; -import com.gitee.starblues.spring.MainApplicationContext; -import com.gitee.starblues.utils.Assert; import com.gitee.starblues.utils.ObjectUtils; -import com.gitee.starblues.utils.SpringBeanCustomUtils; import java.util.HashSet; import java.util.Set; @@ -29,51 +26,23 @@ import java.util.Set; /** * 定义插件从主程序加载资源的匹配 * @author starBlues - * @version 3.0.0 + * @version 3.0.3 */ -public class PluginMainResourcePatternDefiner extends JavaMainResourcePatternDefiner { +public class PluginMainResourcePatternDefiner implements MainResourcePatternDefiner { - private static final String FRAMEWORK = "com/gitee/starblues/**"; - - public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories"; - - private final String mainPackage; private final InsidePluginDescriptor descriptor; - private final BasicMainResourcePatternDefiner basicPatternDefiner; public PluginMainResourcePatternDefiner(PluginInteractive pluginInteractive) { - mainPackage = pluginInteractive.getConfiguration().mainPackage(); this.descriptor = pluginInteractive.getPluginDescriptor(); - basicPatternDefiner = getPatternDefiner(pluginInteractive); } @Override public Set getIncludePatterns() { - Set includeResourcePatterns = super.getIncludePatterns(); - Set includePatterns = basicPatternDefiner.getIncludePatterns(); - if(!ObjectUtils.isEmpty(includePatterns)){ - includeResourcePatterns.addAll(includePatterns); - } else { - includeResourcePatterns.add(ObjectUtils.changePackageToMatch(mainPackage)); - } - includeResourcePatterns.add(FRAMEWORK); - addWebIncludeResourcePatterns(includeResourcePatterns); - addApiDoc(includeResourcePatterns); - addDbDriver(includeResourcePatterns); - - addIdea(includeResourcePatterns); - + Set includeResourcePatterns = new HashSet<>(); // 配置插件自定义从主程序加载的资源匹配 Set includeMainResourcePatterns = descriptor.getIncludeMainResourcePatterns(); - if(ObjectUtils.isEmpty(includeMainResourcePatterns)){ - return includeResourcePatterns; - } - - for (String includeMainResourcePattern : includeMainResourcePatterns) { - if(ObjectUtils.isEmpty(includeMainResourcePattern)){ - continue; - } - includeResourcePatterns.add(includeMainResourcePattern); + if(!ObjectUtils.isEmpty(includeMainResourcePatterns)){ + includeResourcePatterns.addAll(includeMainResourcePatterns); } return includeResourcePatterns; } @@ -81,87 +50,13 @@ public class PluginMainResourcePatternDefiner extends JavaMainResourcePatternDef @Override public Set getExcludePatterns() { Set excludeResourcePatterns = new HashSet<>(); - Set excludePatterns = basicPatternDefiner.getExcludePatterns(); - if(!ObjectUtils.isEmpty(excludePatterns)){ - excludeResourcePatterns.addAll(excludePatterns); - } Set excludeMainResourcePatterns = descriptor.getExcludeMainResourcePatterns(); if(!ObjectUtils.isEmpty(excludeMainResourcePatterns)){ excludeResourcePatterns.addAll(excludeMainResourcePatterns); } - excludeResourcePatterns.add(FACTORIES_RESOURCE_LOCATION); return excludeResourcePatterns; } - protected void addWebIncludeResourcePatterns(Set patterns){ - patterns.add("org/springframework/web/**"); - patterns.add("org/springframework/http/**"); - patterns.add("org/springframework/remoting/**"); - patterns.add("org/springframework/ui/**"); - - patterns.add("org/springframework/boot/autoconfigure/http/**"); - patterns.add("org/springframework/boot/autoconfigure/web/**"); - patterns.add("org/springframework/boot/autoconfigure/websocket/**"); - patterns.add("org/springframework/boot/autoconfigure/webservices/**"); - patterns.add("org/springframework/boot/autoconfigure/jackson/**"); - - patterns.add("com/fasterxml/jackson/**"); - } - - protected void addApiDoc(Set patterns){ - patterns.add("springfox/documentation/**"); - patterns.add("io/swagger/**"); - patterns.add("org/springdoc/**"); - } - - protected void addDbDriver(Set patterns){ - // mysql - patterns.add("com/mysql/**"); - // oracle - patterns.add("oracle/jdbc/**"); - // sqlserver - patterns.add("com/microsoft/jdbc/sqlserver/**"); - // DB2 - patterns.add("com/ibm/db2/jdbc/**"); - // DB2/AS400 - patterns.add("com/ibm/as400/**"); - // Informix - patterns.add("com/informix/jdbc/**"); - // Hypersonic - patterns.add("org/hsql/**"); - // MS SQL - patterns.add("com/microsoft/jdbc/**"); - // Postgres - patterns.add("org/postgresql/**"); - // Sybase - patterns.add("com/sybase/jdbc2/**"); - // Weblogic - patterns.add("weblogic/jdbc/**"); - // h2 - patterns.add("jdbc/h2/**"); - } - - private void addIdea(Set includeResourcePatterns) { - // idea debug agent - includeResourcePatterns.add("com/intellij/rt/debugger/agent/**"); - } - - /** - * 获取基本的 MainResourcePatternDefiner - * @param pluginInteractive PluginInteractive - * @return BasicMainResourcePatternDefiner - */ - private BasicMainResourcePatternDefiner getPatternDefiner(PluginInteractive pluginInteractive){ - final MainApplicationContext mainApplicationContext = pluginInteractive.getMainApplicationContext(); - BasicMainResourcePatternDefiner definer = SpringBeanCustomUtils.getExistBean( - mainApplicationContext, BasicMainResourcePatternDefiner.class); - if(definer == null){ - return new BasicMainResourcePatternDefiner(mainPackage); - } else { - return definer; - } - } - } diff --git a/spring-brick/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java b/spring-brick/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java index 42a8557..b99e55e 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java +++ b/spring-brick/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java @@ -16,6 +16,7 @@ package com.gitee.starblues.integration; +import com.gitee.starblues.common.Constants; import com.gitee.starblues.integration.decrypt.DecryptConfiguration; import com.gitee.starblues.utils.Assert; @@ -83,7 +84,7 @@ public abstract class DefaultIntegrationConfiguration implements IntegrationConf @Override public String version() { - return "0.0.0"; + return Constants.ALLOW_VERSION; } @Override diff --git a/spring-brick/src/main/java/com/gitee/starblues/integration/ExtendPointConfiguration.java b/spring-brick/src/main/java/com/gitee/starblues/integration/ExtendPointConfiguration.java index cd7944e..79f43b5 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/integration/ExtendPointConfiguration.java +++ b/spring-brick/src/main/java/com/gitee/starblues/integration/ExtendPointConfiguration.java @@ -18,15 +18,19 @@ package com.gitee.starblues.integration; import com.gitee.starblues.core.DefaultRealizeProvider; import com.gitee.starblues.core.RealizeProvider;; +import com.gitee.starblues.core.classloader.CacheMainResourceMatcher; +import com.gitee.starblues.core.classloader.MainResourceMatcher; import com.gitee.starblues.core.descriptor.decrypt.DefaultPluginDescriptorDecrypt; import com.gitee.starblues.core.descriptor.decrypt.PluginDescriptorDecrypt; import com.gitee.starblues.core.launcher.plugin.BasicMainResourcePatternDefiner; +import com.gitee.starblues.core.launcher.plugin.DefaultMainResourcePatternDefiner; import com.gitee.starblues.integration.operator.DefaultPluginOperator; import com.gitee.starblues.integration.operator.PluginOperator; import com.gitee.starblues.integration.operator.PluginOperatorWrapper; import com.gitee.starblues.integration.user.DefaultPluginUser; import com.gitee.starblues.integration.user.PluginUser; import com.gitee.starblues.spring.extract.ExtractFactory; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.*; import org.springframework.context.annotation.Bean; import org.springframework.context.support.GenericApplicationContext; @@ -34,7 +38,7 @@ import org.springframework.context.support.GenericApplicationContext; /** * 系统Bean配置 * @author starBlues - * @version 3.0.1 + * @version 3.0.3 */ public class ExtendPointConfiguration { @@ -78,9 +82,11 @@ public class ExtendPointConfiguration { } @Bean - @ConditionalOnMissingBean - public BasicMainResourcePatternDefiner mainResourcePatternDefiner(){ - return new BasicMainResourcePatternDefiner(configuration.mainPackage()); + public MainResourceMatcher mainResourceMatcher(){ + return new CacheMainResourceMatcher(new DefaultMainResourcePatternDefiner( + configuration.mainPackage(), + applicationContext + )); } @Bean 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 24b2df3..d985065 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 @@ -33,12 +33,13 @@ public interface MainApplicationContext extends ApplicationContext { Map> getConfigurableEnvironment(); /** - * If Resolve the specified main dependency against the beans defined in this factory. + * 从主程序获取依赖 * - * @param packageName 当前依赖包名称 + * @param requestingBeanName 依赖Bean名称 + * @param dependencyType 依赖类型 * @return boolean */ - boolean isResolveDependency(String packageName); + Object resolveDependency(String requestingBeanName, Class dependencyType); /** * 是否为web环境 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 27e5f25..30d9f41 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 @@ -17,6 +17,7 @@ package com.gitee.starblues.spring; import com.gitee.starblues.integration.IntegrationConfiguration; +import com.gitee.starblues.utils.ObjectUtils; import org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext; import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext; import org.springframework.context.support.GenericApplicationContext; @@ -80,8 +81,15 @@ public class MainApplicationContextProxy extends ApplicationContextProxy impleme } @Override - public boolean isResolveDependency(String packageName) { - return packageName.startsWith(configuration.mainPackage()); + public Object resolveDependency(String requestingBeanName, Class dependencyType) { + if(!ObjectUtils.isEmpty(requestingBeanName) && applicationContext.containsBean(requestingBeanName)){ + return applicationContext.getBean(requestingBeanName); + } + try { + return applicationContext.getBean(dependencyType); + } catch (Exception e){ + return null; + } } @Override diff --git a/update.md b/update.md index 06ba901..daa8885 100644 --- a/update.md +++ b/update.md @@ -1,12 +1,15 @@ -1. 【新增[#I58CDB]([#I58CDB](https://gitee.com/starblues/springboot-plugin-framework-parent/issues/I58CDB))】 +1. 【新增[#I58CDB]([#I58CDB](https://gitee.com/starblues/springboot-plugin-framework-parent/issues/I58CDB))】 插件可触发`WebServerInitializedEvent`类型的事件 -2. 【新增】插件`dev`模式打包, 新增`localJars`配置(配置本地`jar`依赖文件) -3. 【支持】支持插件`Controller`可不配置地址前缀(配置后会影响插件拦截器和静态资源访问) -4. 【修复】`enablePluginIdRestPathPrefix`不生效问题 -5. 【修复】插件无法注入`ObjectProvider`、`ObjectFactory`类型为主程序的`Bean` -6. 【修复[#I58CDB](https://gitee.com/starblues/springboot-plugin-framework-parent/issues/I58CDB)】 +2. 【新增】插件`dev`模式打包, 新增`localJars`配置(配置本地`jar`依赖文件) +3. 【新增】插件新增`@AutowiredType`注解, 可指定依赖注入类型 +4. 【新增】支持插件`Controller`可不配置地址前缀(配置后会影响插件拦截器和静态资源访问) +5. 【优化】优化静态资源文件加载问题 +6. 【优化】优化插件在某些版本的`idea`中缺失`debug`包, 导致无法`debug` +7. 【优化】优化从主程序依赖加载`Class`资源模块 +8. 【修复】`enablePluginIdRestPathPrefix`不生效问题 +9. 【修复】插件无法注入`ObjectProvider`、`ObjectFactory`类型为主程序的`Bean` +10. 【修复[#I58CDB](https://gitee.com/starblues/springboot-plugin-framework-parent/issues/I58CDB)】 插件`Controller`使用`Aop`后, 获取不到参数 -7. 【修复[#I58GCI](https://gitee.com/starblues/springboot-plugin-framework-parent/issues/I58GCI)】 +11. 【修复[#I58GCI](https://gitee.com/starblues/springboot-plugin-framework-parent/issues/I58GCI)】 主程序打包参数`libDir`不生效问题 -8. 【优化】优化静态资源文件加载问题 -9. 【优化】优化插件在某些版本的`idea`中缺失`debug`包, 导致无法`debug` \ No newline at end of file +12. 【修复】修复主程序配置`version`, 插件未配置`requires`导致出现版本校验失败的问题 -- Gitee