JExten:基于Java模块系统(JPMS)构建健壮的插件架构

news/2026/1/23 16:07:56/文章来源:https://www.cnblogs.com/icodewalker/p/19522838

JExten:基于Java模块系统(JPMS)构建健壮的插件架构

1. 动机:通往模块化隔离之路

在Java中构建可扩展应用程序时,开发者常常从一个简单的问题开始:"如何让用户无需重新编译核心应用程序就能添加功能?" 旅程通常始于标准的 java.util.ServiceLoader,它提供了一种发现接口实现的简单机制。

然而,随着应用程序的增长,一个关键问题出现了:"类路径地狱"。

想象一下,你有一个使用 library-v1 的主机应用程序。你创建了一个插件系统,有人写了一个需要 library-v2 的 "Twitter 插件"。如果所有东西都在同一个扁平的类路径上运行,就会产生冲突。要么主机因为得到错误的库版本而崩溃,要么插件失败。你无法在类路径上同时存在同一个库的两个版本而不面临运行时异常(如 ClassDefNotFoundErrorNoSuchMethodError)的风险。

这正是JExten背后的核心驱动力。我需要一种能够严格封装插件的方式,使得每个插件都可以定义自己的依赖,而不影响主机或其他插件。

引入JPMS(Java平台模块系统)

Java 9引入了模块系统(JPMS),它提供了强封装和显式的依赖关系图。它允许我们创建隔离的模块"层"。

  • 启动层:JVM和平台模块。
  • 主机层:核心应用程序及其依赖。
  • 插件层:在主机层之上动态创建的层。

通过利用JPMS的ModuleLayers,JExten允许插件A依赖于Jackson 2.14,而插件B依赖于Jackson 2.10,两者可以在同一个运行的应用程序中和睦共存。

2. 架构与设计

JExten设计为轻量级且基于注解驱动,抽象了原始ModuleLayers的复杂性,同时提供了依赖注入(DI)和生命周期管理等强大功能。

架构基于三个主要支柱:

扩展模型

核心在于,JExten在"契约"(API)和"实现"之间进行了清晰分离。

    1. 扩展点 (@ExtensionPoint):在主机应用程序(或共享API模块)中定义的接口,规定了哪些功能可以被扩展。
@ExtensionPoint(version = "1.0")
public interface PaymentGateway {void process(double amount);
}
    1. 扩展 (@Extension):由插件提供的具体实现。
@Extension(priority = Priority.HIGH)
public class StripeGateway implements PaymentGateway {// ...
}
注意,你可以在没有`PluginManager`的情况下使用`ExtensionManager`。这在测试中或当你希望在非插件环境中使用JExten,且所有扩展都已经在模块路径中可用时非常有用。

管理器分离

为了分离关注点,该库将职责划分到两个不同的管理器:

  1. PluginManager("物理层")
    • 该组件处理原始工件(JAR/ZIP文件)。
    • 它使用SHA-256校验和验证完整性,确保插件未被篡改。
    • 它构建JPMS ModuleLayer 图。它读取 plugin.yaml 清单,解析依赖项(从本地缓存或Maven仓库),并构建类加载环境。
  2. ExtensionManager("逻辑层")
    • 一旦层构建完成,该组件接管。
    • 它在各个层中扫描带有 @Extension 注解的类。
    • 它管理这些扩展的生命周期(单例、会话或原型作用域)。
    • 它处理依赖注入。

依赖注入

由于插件在隔离的层中运行,标准的DI框架(如Spring或Guice)有时可能"太重"或在动态模块边界间配置起来很棘手。JExten包含一个内置的、轻量级的DI系统。

你可以简单地使用 @Inject 将扩展连接在一起:

@Extension
public class MyPluginService {@Injectprivate PaymentGateway gateway; // 自动注入最高优先级的实现
}

这在模块边界之间可以无缝工作。一个插件可以注入由主机提供的服务,甚至可以注入由另一个插件提供的服务(如果模块关系图允许的话)。

3. 使用示例

下面快速了解一下如何定义扩展点,在插件中实现它,并在应用程序中使用。

I. 定义一个扩展点

创建一个接口并用 @ExtensionPoint 注解。这是插件将实现的契约。

@ExtensionPoint(version = "1.0")
public interface Greeter {void greet(String name);
}

II. 实现一个扩展

在你的插件模块中,实现该接口并用 @Extension 注解。

@Extension
public class FriendlyGreeter implements Greeter {@Overridepublic void greet(String name) {System.out.println("Hello, " + name + "!");}
}

III. 发现与使用

在你的主机应用程序中,使用 ExtensionManager 来发现和调用扩展。

public class Main {public static void main(String[] args) {// 初始化管理器ExtensionManager manager = ExtensionManager.create(pluginManager);// 获取Greeter扩展点的所有扩展manager.getExtensions(Greeter.class).forEach(greeter -> greeter.greet("World"));}
}

IV. 将你的扩展打包为插件

最后,使用 jexten-maven-plugin Maven插件在编译时检查你的 module-info.java,并将你的扩展打包成一个包含所有依赖项和生成的 plugin.yaml 清单的ZIP包。

<plugin><groupId>org.myjtools.jexten</groupId><artifactId>jexten-maven-plugin</artifactId><version>1.0.0</version><executions><execution><goals><goal>generate-manifest</goal><goal>assemble-bundle</goal></goals></execution></executions><configuration><hostModule>com.example.app</hostModule></configuration>
</plugin>

然后,你可以将生成的ZIP包安装到你的主机应用程序中:

public class Application {public static void main(String[] args) throws IOException {Path pluginDir = Path.of("plugins");// 创建插件管理器PluginManager pluginManager = new PluginManager("org.myjtools.jexten.example.app", // 应用程序IDApplication.class.getClassLoader(),pluginDir);// 从ZIP包安装插件pluginManager.installPluginFromBundle(pluginDir.resolve("my-plugin-1.0.0.zip"));// 创建支持插件的扩展管理器ExtensionManager extensionManager = ExtensionManager.create(pluginManager);// 从插件获取扩展extensionManager.getExtensions(Greeter.class).forEach(greeter -> greeter.greet("World"));}
}

4. 与其他解决方案的比较

选择合适的插件框架取决于你的具体需求。以下是JExten与一些成熟替代方案的对比:

PF4J (Plugin Framework for Java)

PF4J是一个成熟的、轻量级的插件框架,依赖于ClassLoader隔离。

  • 隔离性:PF4J使用自定义ClassLoader隔离插件。JExten使用JPMS ModuleLayers。后者是自Java 9以来处理隔离的"原生"Java方式,在JVM级别严格执行封装。
  • 现代性:虽然PF4J非常优秀,但JExten是专门为现代模块化Java生态系统(Java 21+)设计的,利用模块描述符(module-info.java)来定义依赖关系,而不是自定义清单。

OSGi

OSGi是模块化的黄金标准,为Eclipse等IDE提供支持。

  • 复杂性:OSGi功能强大,但学习曲线陡峭且样板代码多(Manifest头、Activators、复杂的服务动态)。JExten通过专注于80%的用例——具有简单依赖注入的严格隔离扩展——提供了远低于OSGi的复杂性("精简版OSGi"),且不需要完整的OSGi容器。
  • 运行时:OSGi带来沉重的运行时。JExten是一个轻量级库,构建在标准JVM特性之上。

Layrry

Layrry是一个用于执行模块化Java应用程序的启动器和API。

  • 关注点:Layrry非常侧重于模块层的配置和组装(通常通过YAML/TOML),并充当运行器。JExten则侧重于这些层内的编程模型
  • 特性:Layrry擅长构建层,但它不提供固化的应用框架。JExten提供了"粘合"代码——扩展点、依赖注入和生命周期管理——这些是你在使用原始模块层或Layrry时必须自己编写的东西。
特性 JExten PF4J OSGi Layrry
隔离 JPMS 模块层 文件/类加载器 Bundle类加载器 JPMS 模块层
配置 Java 注解 属性/清单 Manifest 头部 YAML/TOML
依赖注入 内置 (@Inject) 外部 (Spring/Guice) 声明式服务 无 (ServiceLoader)
学习曲线

5. 结论

JExten是一个轻量级、基于注解驱动的插件框架,它利用JPMS模块层来提供隔离和依赖管理。其设计目标是易于使用和理解,注重简洁性和易用性。

最后,请记住JExten仍处于早期阶段,有很大的改进空间。欢迎在GitHub上为项目做贡献和/或在issue部分参与讨论。项目仓库链接在此处。


【注】本文译自:JExten: Building a Robust Plugin Architecture with Java Modules (JPMS) - DEV Community

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1205612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年上海盐雾试验箱厂商综合实力排行榜单,砂尘试验箱/高低温交变量热试验箱,盐雾试验箱源头厂家口碑推荐榜

在制造业加速向智能化、精密化转型的背景下,盐雾试验箱作为环境可靠性测试的核心设备,其性能稳定性与技术服务能力直接影响产品质量验证的准确性。当前行业面临技术同质化严重、售后服务响应滞后等痛点,企业需通过技…

全渠道融合能力突出 这些知名呼叫中心品牌值得选

随着企业数字化转型的深入推进,呼叫中心已从单一的电话接听渠道,演进为集语音、在线客服、社交媒体、AI智能于一体的全渠道客户互动中枢。在激烈的市场竞争中,一个稳定、智能、易扩展的呼叫中心系统,已成为企业提升…

2026山东最新资产评估_房地产评估_股权评估_损失评估_数据资产评估机构首选推荐山东卓越全程土地房地产评估有限公司:山东专业机构,全方位服务值得信赖.

在经济活动日益复杂、资产类型不断丰富的今天,专业的评估服务成为企业决策、资产处置、金融信贷等领域不可或缺的关键环节。2026年,在山东及周边地区,山东卓越全程土地房地产评估有限公司(简称“卓越全程评估”)凭…

遇到MWORKS建模问题啦?来MoHub帮你快速解决

模型刚跑起来&#xff0c;然后——叒报错了。 你盯着那行神秘提示看了三秒&#xff1a; ber&#xff0c;怎么还不行&#xff1f; 翻文档&#xff1f;试参数&#xff1f;再跑一遍&#xff1f; 到底是为什么啊&#xff1f; 有没有人管管&#xff01; ——有的。 但&#x…

全方位解析球机摄像头七大核心规格

球机摄像头规格齐全&#xff0c;主要体现在以下七个方面&#xff1a; • 外形尺寸&#xff1a;常见规格有 4。5英寸、6.5英寸等&#xff0c;适配多样化的安装空间与监控覆盖需求。 • 分辨率&#xff1a;涵盖200万像素&#xff08;19201080&#xff09;、500万像素&#xff…

基于Java的工厂车辆智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 工厂车辆智慧管理系统结合了现代信息技术&#xff0c;针对传统管理方式中数据分散、效率低下等痛点进行了优化。该系统涵盖了车辆管理、客户管理、司机管理等多个模块&#xff0c;并引入GPS设备和驾驶行为管理等功能进行实时监控与数据分…

基于Java的工厂进度智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 工厂进度智慧管理系统旨在提供一个全面的信息化管理平台&#xff0c;涵盖从会员管理到生产任务管理等多个功能模块。与传统选题相比&#xff0c;该系统不仅涵盖了丰富的业务场景&#xff0c;还具备高度定制化和扩展性优势&#xff0c;能够…

基于Java的工厂食堂餐饮智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 工厂食堂餐饮智慧管理系统摒弃传统系统&#xff0c;创新性地引入了精细化管理和数据分析功能。它不仅涵盖了菜单菜品管理、原材料供应与订单处理等基本模块&#xff0c;还进一步深化至会员充值、促销活动及库存监控等方面&#xff0c;提高…

市面上常见的呼叫中心系统有哪些 靠谱款盘点可作参考

在当今数字化沟通日益重要的商业环境中,呼叫中心系统已成为企业与客户建立联系、提升服务质量、优化运营效率的关键工具。面对市场上琳琅满目的呼叫中心解决方案,企业如何选择一款既稳定可靠又功能强大的系统?本文将…

CF1290C Prefix Enlightenment 题解

Solution 不难注意到“任意三个子集的交集为空”等价于每盏灯最多同时出现于 \(2\) 个集合中。 设第 \(i\) 盏灯出现在第 \(p_i,q_i\) 两个集合中,若没有则为 \(0\)。设 \(f_k\in \{0,1\}\) 表示是否选集合 \(A_k\)。…

◆comfyUI教程◆第2章11节 Latent基础与应用控制 - 实践

◆comfyUI教程◆第2章11节 Latent基础与应用控制 - 实践2026-01-23 16:01 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

2026山东最新山东卓越全程土地房地产评估有限公司资产评估_房地产评估_股权评估_损失评估_数据资产评估机构首选推荐:山东专业机构,全方位服务值得信赖.

在经济活动日益复杂、资产类型不断丰富的今天,专业的评估服务成为企业决策、资产处置、金融信贷等领域不可或缺的关键环节。2026年,在山东及周边地区,山东卓越全程土地房地产评估有限公司(简称“卓越全程评估”)凭…

Matlab调用downloadCIFARData和loadCIFARData出错

问题 使用的代码 % ImageLearn.m datadir = tempdir; downloadCIFARData(datadir); [XTrain,TTrain,XValidation,TValidation] = loadCIFARData(datadir);调用downloadCIFARData和loadCIFARData出现以下错误 >>…

顶刊中的“水刊”!IEEE Trans系列,含金量拉满,3天初审,中一篇可躺平!

&#x1f525; &#x1f525; &#x1f525; &#x1f525;本期&#xff0c;小编给大家推荐的是一本【计算机合作刊】&#xff0c;其创刊于2014年&#xff0c;由IEEE出版社出版&#xff0c;目前位于JCR1区&#xff0c;中科院2区&#xff0c;小类位于中科院1区&#xff0c…

springboot基于微信小程序的高校毕业生公考助手管理系统

背景分析高校毕业生公考助手管理系统基于SpringBoot和微信小程序开发&#xff0c;旨在解决公考备考信息分散、效率低下的问题。随着公务员考试竞争加剧&#xff08;2023年国考报名人数超250万&#xff09;&#xff0c;传统备考方式存在资源整合不足、个性化服务缺失等痛点&…

从黑土到云端,富裕县年货节开启乡村振兴数字新篇

当龙江大地仍被冰雪覆盖&#xff0c;一场连接乡土与全国的年货盛宴已在哈尔滨温情启幕。2026年1月15日&#xff0c;“云购年货乐购富裕”网上年货节在哈尔滨新区数字贸易产业园区正式举办&#xff0c;作为活动核心组成部分的展厅环节&#xff0c;不仅是“富裕优品”的集中亮相&…

2026年国产控油粉底液专业深度测评:排名前五品牌权威发布

2026年国产控油粉底液专业深度测评:排名前五品牌权威发布 随着国内美妆研发实力的崛起与消费者需求的精细化,国产控油粉底液市场已进入技术驱动、功效为先的新阶段。面对琳琅满目的产品,如何选择一款兼具长效控油、…

mysql二进制日志清理

-- 查看binlog保留策略 SHOW VARIABLES LIKE expire_logs_days; -- 手动清理7天前的binlog(保留近期日志) PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY); -- 配置自动清理(修改my.cnf,避免再次堆积)…

2026年租车厂家权威推荐榜:免押金租车、商务租车、四川租车公司、团体租车、成都汽车租赁、成都汽车租赁公司、成都租车选择指南

2026诚信商务租车公司推荐适配异地差旅一、行业背景与筛选依据据《2026中国汽车租赁行业发展白皮书》显示,2026年国内商务租车市场规模突破800亿元,年复合增长率达12.7%,其中异地差旅场景需求占比超40%。随着商务出…

2026年专业深度测评:国产控油粉底液排名前五权威榜单

2026年专业深度测评:国产控油粉底液排名前五权威榜单 一、开篇(定调 + 公示 + 声明) 随着美妆行业精细化与成分科学化发展,消费者对底妆产品的控油持妆与养肤功效需求持续攀升。面对市场上琳琅满目的国产控油粉底液…