【问题标题】:How can I share non-OSGi libraries between bundles in an OSGi container?如何在 OSGi 容器中的包之间共享非 OSGi 库?
【发布时间】:2010-11-17 03:12:46
【问题描述】:

trying to share the Struts packages 在 OSGi 容器内的多个包中时,我遇到了这个问题。我想避免在包内重复依赖项并在它们之间引入新的依赖项(通过让一个包导出其内部依赖项以供另一个共享)。

事实证明,如果您碰巧使用 Maven,答案非常简单,如果您不是,您仍然可以使用 Maven 解决方案来学习如何使用其他机制创建相同的结果。

我发现这种方法在我的项目中多次有用,所以我将在此处发布一个示例。

【问题讨论】:

    标签: osgi


    【解决方案1】:

    对于那些不那么热衷于 maven、无法移植或对 ant/ivy 非常满意的人来说,这是一条额外的路径

    我发现完成所述任务的最简单方法是通过让清单导出每个包并添加一些适当的符号名称/版本,将非 OSGi 库转换为 OSGi 库。我已经能够通过 ant 任务(甚至直接命令行调用)使用 bnd 非常轻松地做到这一点。还有repositories,其中包含许多流行库的“osgi-ified”版本。一些库(joda-time)已经提供了正确的 OSGi 清单。

    【讨论】:

    【解决方案2】:

    使用 Maven,很容易从任何库创建 OSGi 包。但是,我认为其他机制也可以产生相同的结果。 Maven 解决方案帮助我了解了它的工作原理。

    通过创建一个将库作为依赖项的项目,然后使用 Apache Felix project 中的 maven-bundle-plugin 打包项目并使用 Export-Package 指令指定库包来完成创建包。我用它在 OSGi 容器内的包之间共享 Google 协议缓冲区:

    <?xml version="1.0" encoding="UTF-8" ?>
    <project>
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.example.lib</groupId>
      <artifactId>protobuf-dist</artifactId>
      <version>2.1.0</version>
      <name>Google Protocol Buffers OSGi Distribution</name>
      <packaging>bundle</packaging>
    
      <dependencies>
        <dependency>
          <groupId>com.google.protobuf</groupId>
          <artifactId>protobuf-java</artifactId>
          <version>2.1.0</version>
          <scope>compile</scope>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
              <instructions>
                <Export-Package>com.google.protobuf</Export-Package>
              </instructions>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    

    如果您也希望将所有传递依赖项也包含到包中,请使用插件的 bundleall 目标。

    插件识别并尊重依赖项中现有的 OSGi 清单。

    您也可以使用捆绑插件来创建清单并告诉jar 打包插件(或jar-with-dependencies 内置程序集)通过存档部分使用该清单。上面链接的插件页面显示了如何做到这一点。

    【讨论】:

      猜你喜欢
      • 2012-08-18
      • 2017-06-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2012-07-22
      • 2015-02-26
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多