我有一个庞大的应用程序和库生态系统,它们目前作为 .jar 集合部署在各种应用程序服务器(例如 JBoss AS)中,我正在尝试找出一套好的工具来管理依赖关系和生命周期各种包。
我认为这些包处于(至少)三种可能状态之一:“卸载”、“待处理”和“加载”,大致定义如下:
- Unloaded:该软件包目前不可用。
- Pending:包本身可用,但不是所有依赖项。因此,目前无法使用。
- Loaded:包可用并且所有依赖项都满足。如果它是一个应用程序,它可以运行 - 如果它是一个库,它可以被另一个包使用。
(可能还有更多状态,例如尝试加载但由于其他原因而失败的包的“失败”,而不是不满足依赖关系等...)
在包的生命周期中,许多事情可能会导致包在这三者之间改变状态:
- 一个没有依赖关系的包被加载,并且从unloaded变为loaded。
- 一个包试图加载,但并不是所有的依赖都得到满足;它从unloaded变为pending。
- 处于挂起状态的包突然满足了所有依赖项(因为其他一些包进入了已加载状态),并自动开始加载自己;从挂起过渡到加载。
- 一个包被卸载。依赖于现在卸载的包的所有已加载包从加载到挂起。
- 软件包更新到较新的版本。所有依赖包都会自动重新加载,以访问更新的版本。
我已经开始使用 OSGi 来定义依赖项——它与我们的构建系统很好地兼容并产生可靠的依赖项信息。但是,如果我将两个 OSGi 包加载A
到依赖于的B
JBoss 中,然后 unload ,似乎很高兴继续运行。我知道有一些钩子可以用来在低级别(框架事件)上控制它,但是我的蜘蛛感觉很刺痛,说必须有更好的方法来做到这一点。B
A
A
B
是否有一个很好的工具/框架/任何你想调用的东西,可以在这些方面补充 OSGi?