gpt4 book ai didi

java - JDBC/OSGi 以及如何动态加载驱动程序而无需在包中明确声明依赖关系?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:39 25 4
gpt4 key购买 nike

这是一个大问题。

我有一个结构良好但单一的代码库,它有一个原始的模块化架构(所有模块实现接口(interface)但共享相同的类路径)。当我在应用程序服务器上进行部署时,我意识到这种方法的愚蠢以及它所代表的问题,这些应用程序服务器可能具有我的库的不同冲突版本。

我现在依赖大约 30 个 jar ,并且正在中途将它们捆绑在一起。现在我的一些模块很容易声明版本化的依赖关系,比如我的网络组件。它们在 JRE 和其他 BNDded 库中静态引用类,但我的 JDBC 相关组件通过 Class.forName(...) 实例化,并且可以使用任意数量的驱动程序之一。

我正在按服务区域将所有内容分解为 OSGi 包。

  • 我的核心类/接口(interface)。
  • 报告相关组件。
  • 数据库访问相关组件(通过 JDBC)。
  • 等....

我希望我的代码仍然能够在没有 OSGi 的情况下通过带有我所有依赖项的单个 jar 文件使用,并且完全没有 OSGi(通过 JARJAR),并且还可以通过 OSGi 元数据和具有依赖项的粒度包实现模块化信息。

  • 如何配置我的 bundle 以及我的代码,这样它就可以动态地利用任何驱动程序类路径和/或在 OSGi 中容器环境(Felix/Equinox/等)?

  • 是否有运行时方法来检测我是否在跨容器(Felix/Equinox 等)兼容的 OSGi 容器中运行?

  • 如果我在 OSGi 容器中,是否需要使用不同的类加载机制?

  • 我是否需要将 OSGi 类导入到我的项目中才能通过我的数据库模块加载 at-bundle-time-unknown JDBC 驱动程序?

  • 我还有第二种获取驱动程序的方法(通过 JNDI,它仅在应用服务器中运行时才真正适用),我是否需要为支持 OSGi 的应用服务器更改我的 JNDI 访问代码?

最佳答案

  • 在 OSGi 环境中使用任何驱动程序都需要您使用 DynamicImport-Package: * 语句,以便您的包可以在您使用 Class.forName(..) 加载驱动程序时解析这些包。
  • 可能最简单的方法是尝试访问 org.osgi.framework 包中的类。这些至少应该始终存在于 OSGi 环境中(参见下面的代码片段)。还有更复杂的机制,所以如果您需要更高级的东西,请告诉我。此外,请查看 OSGi R4.2 核心规范第 3.8.9 段,其中显示了一些查找类的 Bundle 和 BundleContext 的方法,因此间接有助于确定您是否在框架中。
  • 这取决于您在做什么,这里没有通用的"is"或“否”答案。 OSGi 使用类加载器,并且以一种对于标准 Java 应用程序而言不是“典型”的方式执行此操作,但根据您正在执行的操作,您可能不会注意到。
  • 没有。
  • 查看最近发布的 OSGi 企业规范。他们有一章介绍 OSGi 中的 JNDI 集成,这可能允许您(大部分)不修改代码。

一个简单的示例片段:

 public static boolean inOSGi() {
try {
Class.forName("org.osgi.framework.FrameworkUtil");
return true;
}
catch (ClassNotFoundException e) {
return false;
}
}

只要确保如果将这段代码放在一个包中,该包应该导入 org.osgi.framework(否则它将永远找不到那个类)。

关于java - JDBC/OSGi 以及如何动态加载驱动程序而无需在包中明确声明依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2707567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com