java - OSGi 和...?我用什么来控制包的加载/卸载/重新加载?

标签 java osgi

我有一个大型的应用程序和库生态系统,它们目前作为 .jars 的集合部署在各种应用程序服务器(例如 JBoss AS)中,我正在尝试找出一套好的工具来管理依赖关系和生命周期-各种包的循环。

我认为包处于(至少)三种可能状态之一:“卸载”、“待定”和“加载”,大致定义如下:

  • Unloaded:包目前不可用。
  • Pending:包本身可用,但不是所有依赖项。因此,目前无法使用。
  • 已加载:包可用并且所有依赖项都已满足。如果它是一个应用程序,它可以运行 - 如果它是一个库,它就可以被另一个包使用。

(可能还有更多状态,例如“失败”表示尝试加载但由于依赖项未满足等其他原因而失败的包,等等)

在一个包的生命周期中,许多事情可能会导致包在这三个之间改变状态:

  • 加载了一个没有依赖项的包,并从卸载加载
  • 尝试加载包,但并非所有依赖项都得到满足;它从卸载变为待处理
  • 处于pending 状态的包突然满足其所有依赖项(因为其他一些包进入状态loaded),并自动开始加载自身;从待定已加载的过渡。
  • 卸载了一个包。所有依赖于现在卸载包的已加载包都从已加载变为待处理
  • 包已更新到较新的版本。所有依赖包都会自动重新加载,以访问更新版本。

我已经开始着手使用 OSGi 来定义依赖项 - 它与我们的构建系统配合得很好,并生成可靠的依赖项信息。但是,如果我将两个 OSGi 包 AB 加载到 JBoss 中,其中 B 依赖于 A,并且然后卸载 A,看起来 B 一直在愉快地运行。我知道我可以使用一些 Hook 在低级别(框架事件)上控制它,但我的蜘蛛感觉很刺痛,说必须有更好的方法来做到这一点 .

是否有一个很好的工具/框架/无论你想怎么调用它都可以在这些方面对 OSGi 进行补充?

最佳答案

在 OSGi 中,现有的类加载器将保持 Activity 状态,直到您刷新 框架。因此,如果您卸载 B(其中 A 依赖于 B),那么 A 将继续快乐地搅拌直到您刷新。您可以刷新整个框架或仅刷新受给定包影响的包(例如刷新 B)。

刷新的目的是更新/卸载/安装一组包,然后在“原子”操作中应用更改。

旧的(也是最常用的模型)是获取 PackageAdmin 服务,然后对其调用 refreshPackages(null) (osgi.org/javadoc/r4v43/core/org/osgi/service/包管理员/…)。 但是,此服务已弃用。所以目前的做法是:

 FrameworkWiring fw = context
     .getBundle(0)
     .adapt(FrameworkWiring.class);
 fw.refreshBundles(null);

已更新

关于java - OSGi 和...?我用什么来控制包的加载/卸载/重新加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17170279/

相关文章:

java - 我的带有内置 ssl 证书的库如何也允许使用默认证书

java - 有没有办法用唯一的配置文件编译类并以其他方式排除它?

spring - OSGI 类不可见,即使所需的 JAR 位于 Bundle-classpath 中

android - 完整的Android对OSGi bundle 的支持

osgi - 在 Felix.missing requirement [5.0] osgi.wiring.package 中启动 bundle 时出现问题; (osgi.wiring.package=com.sun.jersey.api.core)

java - 如何计算算术表达式(字符串)并返回结果?

java - System.Nanotime 粒度和延迟?

maven - 尝试了解 OSGi 解析错误

java - Eclipse rcp 类加载器 hell : moved class still visible at compiletime but not at runtime anymore

java - 在 3 个不同的类别上使用可比较的