这是一个大问题。
我有一个结构良好但单一的代码库,它具有原始的模块化架构(所有模块都实现接口但共享相同的类路径)。我意识到这种方法的愚蠢以及当我在可能具有我的库的不同冲突版本的应用程序服务器上部署时它所代表的问题。
我现在依赖大约 30 个罐子,并且正在将它们捆绑起来。现在我的一些模块很容易声明版本依赖,例如我的网络组件。它们静态引用 JRE 和其他 BNDded 库中的类,但我的 JDBC 相关组件通过 Class.forName(...) 实例化,并且可以使用任意数量的驱动程序之一。
我按服务区将所有内容分解为 OSGi 包。
- 我的核心类/接口。
- 报告相关组件。
- 数据库访问相关组件(通过 JDBC)。
- ETC....
我希望我的代码仍然能够在没有 OSGi 的情况下通过具有我所有依赖项的单个 jar 文件使用,并且完全没有 OSGi(通过 JARJAR),并且还能够通过 OSGi 元数据和具有依赖项信息的粒度包实现模块化。
如何配置我的包和我的代码,以便它可以动态地利用类路径上和/或 OSGi 容器环境(Felix/Equinox/等)中的任何驱动程序?
是否有运行时方法来检测我是否在跨容器(Felix/Equinox/等)兼容的 OSGi 容器中运行?
如果我在 OSGi 容器中,是否需要使用不同的类加载机制?
我是否需要将 OSGi 类导入我的项目才能通过我的数据库模块加载一个在捆绑时间未知的 JDBC 驱动程序?
我还有第二种获取驱动程序的方法(通过 JNDI,仅在应用服务器中运行时才真正适用),我是否需要更改我的 OSGi 感知应用服务器的 JNDI 访问代码?