【发布时间】:2013-06-18 13:33:29
【问题描述】:
我有一个庞大的应用程序和库生态系统,它们目前作为 .jar 集合部署在各种应用程序服务器(例如 JBoss AS)中,我正在尝试找出一套好的工具来管理依赖项和生命周期-各种包的循环。
我认为包处于(至少)三种可能状态之一:“卸载”、“待处理”和“加载”,大致定义如下:
- 卸载:该包目前不可用。
- 待处理:包本身可用,但不是所有依赖项。因此,暂时无法使用。
- 已加载:包可用且所有依赖项都已满足。如果它是一个应用程序,它可以运行 - 如果它是一个库,它可以被另一个包使用。
(可能还有更多状态,例如尝试加载但由于其他原因而失败的包的“失败”,而不是依赖项不满足等...)
在包的生命周期中,许多事情可能会导致包在这三者之间改变状态:
- 一个没有依赖的包被加载,从unloaded到loaded。
- 一个包试图加载,但不是所有的依赖都满足;它从 unloaded 变为 pending。
- 一个处于pending状态的包突然满足了它的所有依赖(因为其他一些包进入状态loaded),并自动开始加载自己;从 pending 到 loaded 的过渡。
- 卸载了一个包。依赖于现在卸载的包的所有已加载包从 loaded 变为 pending。
- 软件包已更新到较新的版本。所有依赖包都会自动重新加载,以访问更新的版本。
我已经开始使用 OSGi 来定义依赖项——它可以很好地与我们的构建系统配合使用并生成可靠的依赖项信息。但是,如果我将A 和B 这两个OSGi 捆绑包加载到JBoss 中,其中B 依赖于A,然后卸载A,看起来B 似乎愉快地继续运行。我知道有一些钩子可以用来在低级别(框架事件)上控制它,但我的蜘蛛感觉很刺痛,说必须有更好的方法来做到这一点 .
是否有一个很好的工具/框架/任何你想要调用的东西,可以在这些方面补充 OSGi?
【问题讨论】:
-
将此作为评论而不是答案输入,因为问题中有许多活动部分,我没有时间完整回答。但是:卸载捆绑软件不会影响依赖捆绑软件直到您执行刷新操作。刷新允许 OSGi 重新计算包连接,此时缺少依赖项的包将无法解析。这个单独的刷新操作的原因是解析很昂贵,所以一系列更新/安装/卸载应该一起批处理。
-
对于更高级别的工具,我建议您阅读有关 OSGi R5 存储库和解析器规范的信息。您应该专注于配置 groups 包,而 Resolver 规范可帮助您计算出这些组的正确内容。您可以使用Bndtools 2.1 版试用解析器。