/**
* Copyright [2019-Present] [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;
import com.gitee.starblues.core.checker.ComposePluginLauncherChecker;
import com.gitee.starblues.core.checker.DefaultPluginLauncherChecker;
import com.gitee.starblues.core.checker.DependencyPluginLauncherChecker;
import com.gitee.starblues.core.checker.PluginBasicChecker;
import com.gitee.starblues.core.descriptor.InsidePluginDescriptor;
import com.gitee.starblues.core.descriptor.PluginDescriptor;
import com.gitee.starblues.core.descriptor.PluginDescriptorLoader;
import com.gitee.starblues.core.exception.PluginDisabledException;
import com.gitee.starblues.core.exception.PluginException;
import com.gitee.starblues.core.scanner.ComposePathResolve;
import com.gitee.starblues.core.scanner.DevPathResolve;
import com.gitee.starblues.core.scanner.PathResolve;
import com.gitee.starblues.core.scanner.ProdPathResolve;
import com.gitee.starblues.integration.IntegrationConfiguration;
import com.gitee.starblues.integration.listener.DefaultPluginListenerFactory;
import com.gitee.starblues.integration.listener.PluginListenerFactory;
import com.gitee.starblues.utils.*;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
* 抽象的插件管理者
* @author starBlues
* @since 3.0.0
* @version 3.1.0
*/
public class DefaultPluginManager implements PluginManager{
private final Logger log = LoggerFactory.getLogger(DefaultPluginManager.class);
private final RealizeProvider provider;
private final IntegrationConfiguration configuration;
private final List<String> pluginRootDirs;
private final PathResolve pathResolve;
private final PluginBasicChecker basicChecker;
protected final ComposePluginLauncherChecker launcherChecker;
private final AtomicBoolean loaded = new AtomicBoolean(false);
private final Map<String, PluginInsideInfo> startedPlugins = new ConcurrentHashMap<>();
private final Map<String, PluginInsideInfo> resolvedPlugins = new ConcurrentHashMap<>();
protected PluginListenerFactory pluginListenerFactory;
private List<String> sortedPluginIds;
public DefaultPluginManager(RealizeProvider realizeProvider, IntegrationConfiguration configuration) {
this.provider = Assert.isNotNull(realizeProvider, "参数 realizeProvider 不能为空");
this.configuration = Assert.isNotNull(configuration, "参数 configuration 不能为空");
this.pluginRootDirs = resolvePath(configuration.pluginPath());
this.pathResolve = getComposePathResolve();
this.basicChecker = realizeProvider.getPluginBasicChecker();
this.launcherChecker = getComposeLauncherChecker(realizeProvider);
setSortedPluginIds(configuration.sortInitPluginIds());
}
protected ComposePluginLauncherChecker getComposeLauncherChecker(RealizeProvider realizeProvider){
ComposePluginLauncherChecker checker = new ComposePluginLauncherChecker();
checker.add(new DefaultPluginLauncherChecker(realizeProvider, configuration));
checker.add(new DependencyPluginLauncherChecker(this));
return checker;
}
protected ComposePathResolve getComposePathResolve(){
return new ComposePathResolve(new DevPathResolve(), new ProdPathResolve());
}
public void setSortedPluginIds(List<String> sortedPluginIds) {
this.sortedPluginIds = sortedPluginIds;
}
@Override
public List<String> getPluginsRoots() {
return new ArrayList<>(pluginRootDirs);
}
@Override
public String getDefaultPluginRoot() {
if(pluginRootDirs == null){
return null;
}
return pluginRootDirs.stream().findFirst().orElseThrow(()->{
return new PluginException("插件根路径未配置");
});
}
@Override
public synchronized List<PluginInfo> loadPlugins() {
if(loaded.get()){
throw new PluginException("不能重复调用: loadPlugins");
}
try {
pluginListenerFactory = createPluginListenerFactory();
if(ObjectUtils.isEmpty(pluginRootDirs)){
log.warn("插件根目录为空, 无法加载插件.");
return Collections.emptyList();
}
List<Path> scanPluginPaths = provider.getPluginScanner().scan(pluginRootDirs);
if(ObjectUtils.isEmpty(scanPluginPaths)){
printOfNotFoundPlugins();
return Collections.emptyList();
}
Map<String, PluginInfo> pluginInfoMap = new LinkedHashMap<>(scanPluginPaths.size());
boolean findException = false;
for (Path path : scanPluginPaths) {
try {
PluginInsideInfo pluginInfo = loadPlugin(path, false);
if(pluginInfo != null){
pluginInfo.setFollowSystem();
PluginInfo pluginInfoFace = pluginInfo.toPluginInfo();
pluginListenerFactory.loadSuccess(pluginInfoFace);
pluginInfoMap.put(pluginInfo.getPluginId(), pluginInfoFace);
}
} catch (Throwable e) {
pluginListenerFactory.loadFailure(path, e);
log.error("加载插件包失败: {}. {}", path, e.getMessage(), e);
findException = true;
}
}
if(!findException && pluginInfoMap.isEmpty()){
printOfNotFoundPlugins();
}
return getSortPlugin(pluginInfoMap);
} finally {
loaded.set(true);
}
}
protected PluginListenerFactory createPluginListenerFactory(){
return new DefaultPluginListenerFactory();
}
@Override
public boolean verify(Path pluginPath) {
Assert.isNotNull(pluginPath, "参数pluginPath不能为空");
try (PluginDescriptorLoader pluginDescriptorLoader = provider.getPluginDescriptorLoader()){
basicChecker.checkPath(pluginPath);
PluginDescriptor pluginDescriptor = pluginDescriptorLoader.load(pluginPath);
return pluginDescriptor != null;
} catch (Throwable e) {
log.error("插件包校验失败: {}" , pluginPath, e);
return false;
}
}
@Override
public PluginInfo parse(Path pluginPath) throws PluginException {
PluginInsideInfo pluginInsideInfo = loadFromPath(pluginPath);
if(pluginInsideInfo == null){
throw new PluginException("非法插件包: " + pluginPath);
}
pluginInsideInfo.setPluginState(PluginState.PARSED);
return pluginInsideInfo.toPluginInfo();
}
@Override
public synchronized PluginInfo load(Path pluginPath, boolean unpackPlugin) throws PluginException {
Assert.isNotNull(pluginPath, "参数pluginPath不能为空");
String sourcePluginPath = pluginPath.toString();
try {
// 解析插件
PluginInfo pluginInfo = parse(pluginPath);
// 检查是否存在当前插件
PluginInside
没有合适的资源?快使用搜索试试~ 我知道了~
Spring-Boot插件式开发框架,为动态扩展系统而生的插件开发框架
共382个文件
java:366个
xml:8个
factories:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 107 浏览量
2023-06-01
09:52:47
上传
评论 1
收藏 742KB ZIP 举报
温馨提示
为动态扩展系统而生的插件开发框架。它在SpringBoot基础上可以快速开发出插件,并对插件提供不同打包方式,在不重启主程序的情况下,可以动态部署、更新插件,达到动态插拔的效果
资源推荐
资源详情
资源评论
收起资源包目录
Spring-Boot插件式开发框架,为动态扩展系统而生的插件开发框架 (382个子文件)
spring.factories 322B
spring.factories 122B
.gitignore 885B
DefaultPluginManager.java 28KB
Handler.java 16KB
DefaultPluginOperator.java 16KB
PluginListableBeanFactory.java 15KB
BasicRepackager.java 14KB
JarFile.java 14KB
JarFileEntries.java 14KB
ObjectUtils.java 14KB
PluginStaticResourceResolver.java 14KB
JarURLConnection.java 13KB
PluginControllerProcessor.java 11KB
GenericClassLoader.java 10KB
AbstractPluginDescriptorLoader.java 10KB
ExplodedArchive.java 10KB
JarFileArchive.java 9KB
CentralDirectoryEndRecord.java 9KB
ReflectionUtils.java 9KB
LRUMultiMapListCache.java 8KB
SwaggerListener.java 8KB
InvokeProxyHandler.java 8KB
PackageZip.java 8KB
PluginFileUtils.java 8KB
LRUMultiMapUnifiedListCache.java 8KB
DefaultOpExtractFactory.java 8KB
ComposeSpringPluginProcessor.java 8KB
RandomAccessDataFile.java 8KB
ResourceUtils.java 8KB
AsciiBytes.java 7KB
PluginLauncherManager.java 7KB
ZipProdRepackager.java 7KB
AbstractResourceStorage.java 7KB
PluginOperator.java 7KB
FilesUtils.java 7KB
ConfigurePluginEnvironment.java 7KB
AutoIntegrationConfiguration.java 7KB
PluginInterceptorsProcessor.java 7KB
CentralDirectoryFileHeader.java 6KB
MainApplicationContextProxy.java 6KB
DefaultPluginApplication.java 6KB
DefaultPluginUser.java 6KB
PluginResourceLoaderFactoryProxy.java 6KB
DefaultMainResourcePatternDefiner.java 6KB
ResourceUtils.java 6KB
LRUMapCache.java 6KB
PluginDisableAutoConfiguration.java 6KB
PluginInterceptorRegistration.java 6KB
InvokeOtherPluginProcessor.java 6KB
DirProdRepackager.java 5KB
PluginThymeleafInvolved.java 5KB
IntegrationConfiguration.java 5KB
MainRepackager.java 5KB
JarOuterPackager.java 5KB
NestedPluginJarResourceLoader.java 5KB
ScanUtils.java 5KB
ProdPackagePluginDescriptorLoader.java 5KB
SpringBeanCustomUtils.java 5KB
DefaultPluginDescriptorDecrypt.java 5KB
DependencyPluginLauncherChecker.java 5KB
PluginResource.java 5KB
CacheLowMemoryResourceStorage.java 5KB
JarNestPackager.java 5KB
PluginOperatorWrapper.java 5KB
ProdLauncher.java 5KB
PluginLaunchInvolvedFactory.java 5KB
JarFileWrapper.java 5KB
EmptySpringBeanFactory.java 5KB
PluginSpringApplication.java 5KB
PluginIsolationLauncher.java 5KB
PluginResourceStorage.java 5KB
ProdDirPluginDescriptorLoader.java 5KB
JarOutClasspathResource.java 5KB
DefaultProcessorContext.java 5KB
DefaultSpringPluginHook.java 5KB
DefaultRealizeProvider.java 5KB
CacheFastResourceStorage.java 5KB
RepackageMojo.java 4KB
SpringBeanUtils.java 4KB
PluginSpringDocControllerProcessor.java 4KB
StringSequence.java 4KB
CoexistBootstrapLauncher.java 4KB
ZipOuterProdRepackager.java 4KB
ClassUtils.java 4KB
PluginConfigUtils.java 4KB
ConfigureMainPluginEnvironment.java 4KB
AbstractDependencyFilterMojo.java 4KB
PluginOneselfInteractive.java 4KB
Archive.java 4KB
DefaultPluginListenerFactory.java 4KB
SpringPluginBootstrap.java 4KB
UrlUtils.java 4KB
PluginManager.java 4KB
DefaultResourceLoaderFactory.java 4KB
PluginInterceptorRegistry.java 4KB
DefaultPluginLauncherChecker.java 4KB
ExtendPointWebConfiguration.java 4KB
PluginClassLoader.java 4KB
MethodRunner.java 4KB
共 382 条
- 1
- 2
- 3
- 4
资源评论
- qq_280142412023-09-06感谢资源主的分享,这个资源对我来说很有用,内容描述详尽,值得借鉴。
- m0_729442052023-07-24资源很受用,资源主总结的很全面,内容与描述一致,解决了我当下的问题。
- liuxiaoxiao0202023-11-23这个资源总结的也太全面了吧,内容详实,对我帮助很大。
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6651
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功