【问题标题】:Non-osgi library usage in an osgi application在 osgi 应用程序中使用非 osgi 库
【发布时间】:2011-06-23 07:26:37
【问题描述】:

是否可以在 OSGi 应用程序中使用非 osgi 库?

例如,我正在开发一个基于语义的搜索引擎,并为此使用第三方自然语言处理库 (http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor)。

是否可以将这样一个不支持 OSGi 的库作为几个 jar 文件与我的 OSGi 应用程序接口?

【问题讨论】:

    标签: java jar osgi integration osgi-bundle


    【解决方案1】:

    正如之前的答案中所写,如果您想在捆绑包中使用其他库,您有两种选择:

    1. 将库 jar 嵌入到将要使用的包中,
    2. 从库中创建一个有效的 OSGi 包。

    第一种方法更简单,因为您只需将库 jars(及其所有依赖项)复制到捆绑包(例如,复制到根目录),然后将它们添加到 @ 中的 Bundle-Classpath 元素987654323@(见here)。但是,在执行此操作时,您必须记住,此添加的库仅在嵌入它的包中可见(因此库重用受到限制)。您始终可以将此库中的包添加到 MANIFEST.MF 中的 Export-package 元素,以使其对其他捆绑包可见,但这远非优雅的解决方案(但它会起作用)。

    为了使其对其他包可见,您应该使用第二种方法,即从库中创建一个 OSGi 包(有一些工具可以帮助您做到这一点,也在 Eclipse 中) .然而,对于更复杂的库,这种方法可能更难(因为依赖关系和 OSGi 中特定的类加载方法)。

    因此,如果您只想在一个包中使用该库,我建议使用第一种方法(它更容易实现)。如果您想在应用程序中的多个捆绑包中使用此库,则应考虑第二种方法。

    【讨论】:

    • 第一种方法有问题。嵌入传递的可选依赖将是一个问题。我遇到了这个问题。如果您对此有解决方案,请添加。
    【解决方案2】:

    是的,您可以将外部库嵌入到您的包中,也可以将库包装(“OSGIFy”)作为 OSGi 包。对于这两种选择,Pax Construct (http://www.ops4j.org/projects/pax/construct) 都是一个很好的工具。

    如果您的外部库本身具有依赖项,请将所有这些嵌入到一个包中,或使用 Pax Construct 将它们包装成可传递的。

    如果必须在包装或嵌入之间进行选择,请考虑依赖管理和捆绑包的版本控制。如果您需要升级外部库并且它嵌入在您自己的应用程序包中,您总是要发布库和您自己的代码。例如,如果没有激活 2 个版本的应用程序包,也无法激活 2 个版本的库。 而且...如果您不在 OSGi 环境中工作,您想在应用程序 jar 中添加第三方类吗?那么为什么要在 OSGi 环境中进行呢?

    在这种情况下,我个人更喜欢将外部库视为黑盒,并将库及其依赖项包装在一个包中。

    【讨论】:

      【解决方案3】:

      是的,这是可能的。你有两个选择:

      首先,您可以将外部库中的所有包包含到包的私有包部分。它会将所有这些包与您的应用程序一起包含到 jar 中。 第二种选择是从外部库制作一个有效的 osgi 包。

      【讨论】:

        【解决方案4】:

        对于 Eclipse IDE;

        1. 在您的捆绑包下创建 libs 文件夹。
        2. 将不是 OSGi 包的 jar 文件添加到 libs 文件夹。
        3. 右键jar文件->点击“构建路径”->点击“添加到构建路径”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-17
          • 2015-06-28
          • 1970-01-01
          • 2019-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-09
          相关资源
          最近更新 更多