pf4j zip 插件的处理
pf4j 对于zip 插件会先进行解压处理的,主要核心是基于PluginRepository 处理的
目前官方已经包含了不少实现
核心处理
- 参考代码
pf4j/src/main/java/org/pf4j/AbstractPluginManager.java - 方法
@Override
public void loadPlugins() {
log.debug("Lookup plugins in '{}'", pluginsRoots);
// check for plugins roots
if (pluginsRoots.isEmpty()) {
log.warn("No plugins roots configured");
return;
}
pluginsRoots.forEach(path -> {
if (Files.notExists(path) || !Files.isDirectory(path)) {
log.warn("No '{}' root", path);
}
});
// get all plugin paths from repository, 对于处理会调用createPluginRepository的repo ,后边介绍
List<Path> pluginPaths = pluginRepository.getPluginPaths();
// check for no plugins
if (pluginPaths.isEmpty()) {
log.info("No plugins");
return;
}
具体处理
- 默认PluginManager支持的repo
pf4j/src/main/java/org/pf4j/DefaultPluginManager.java
@Override
protected PluginRepository createPluginRepository() {
return new CompoundPluginRepository()
.add(new DevelopmentPluginRepository(getPluginsRoots()), this::isDevelopment)
.add(new JarPluginRepository(getPluginsRoots()), this::isNotDevelopment)
.add(new DefaultPluginRepository(getPluginsRoots()), this::isNotDevelopment);
}
- zip 插件处理的repo
主要基于DefaultPluginRepository
pf4j/src/main/java/org/pf4j/DefaultPluginRepository.java
public class DefaultPluginRepository extends BasePluginRepository {
private static final Logger log = LoggerFactory.getLogger(DefaultPluginRepository.class);
public DefaultPluginRepository(Path
this(Arrays.asList(pluginsRoots));
}
public DefaultPluginRepository(List<Path> pluginsRoots) {
super(pluginsRoots);
AndFileFilter pluginsFilter = new AndFileFilter(new DirectoryFileFilter());
pluginsFilter.addFileFilter(new NotFileFilter(createHiddenPluginFilter()));
setFilter(pluginsFilter);
}
@Override
public List<Path> getPluginPaths() {
extractZipFiles(); // 核心,先解压
return super.getPluginPaths();
}
说明
实际上默认会有一个pluginroot
pf4j/src/main/java/org/pf4j/AbstractPluginManager.java 的initialize 方法
if (pluginsRoots.isEmpty()) {
pluginsRoots.addAll(createPluginsRoot());
}
- createPluginsRoot处理代码
protected List<Path> createPluginsRoot() {
// 使用默认的路径(基于pf4j.pluginsDir 配置),支持配置多个,可以基于逗号分割
String pluginsDir = System.getProperty(PLUGINS_DIR_PROPERTY_NAME);
if (pluginsDir != null && !pluginsDir.isEmpty()) {
return Arrays.stream(pluginsDir.split(","))
.map(String::trim)
.map(Paths::get)
.collect(Collectors.toList());
}
pluginsDir = isDevelopment() ? DEVELOPMENT_PLUGINS_DIR : DEFAULT_PLUGINS_DIR;
return Collections.singletonList(Paths.get(pluginsDir));
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2021-02-17 unpkg docker 镜像
2021-02-17 degit 简单项目脚手架工具
2016-02-17 javascript 函数式编程