【问题标题】:BND includes exported packages of the same bundle in 'uses' directiveBND 在 'uses' 指令中包含相同包的导出包
【发布时间】:2013-11-26 21:02:24
【问题描述】:

我使用maven-bundle-plugin 将一个库打包为一个OSGi 包,它使用BND。我注意到 BND 生成了一个很长的 Export-Package 列表,主要是因为它包含了许多由库本身在其他导出包的 uses 指令中导出的包。

我(有点)理解uses 指令。我假设在这种情况下,其他包的类(在uses 下列出)被导出包中的类用于方法签名(因此导入)。

从这个意义上说,我有两个问题:

  1. 真的有必要在导出包的uses 指令中包含由同一个包导出的包吗?这些包不会被任何其他包导出;因此没有拆分包。
  2. 此行为是否表明库的包结构定义不正确?顶级包使用的几个类通常位于子包中,反之亦然。这是一个被改编为 OSGi 包的库。包结构不是为 OSGi 友好而设计的。

这是清单中列出的大多数导出包的方式

Export-Package: org.lib.annotation;version="10",org.lib.coverage;version="10";
uses:="javax.measure.unit, org.lib.annotation,org.lib.geometry,org.lib.ref,org.
lib.ref.operation,org.ref.util"

从以上uses 列表中的所有包中,只有javax.measure.unit 是从另一个包中导入的。

maven-bundle-plugin 配置:

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <version>2.4.0</version>
  <extensions>true</extensions>
  <configuration>
      <instructions>
          <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
          <Bundle-Version>${parsedVersion.osgiVersion}</Bundle-Version>
          <Export-Package>org.lib.*;version=${project.version}</Export-Package>
          <Import-Package>*</Import-Package>
          <_experiments>true</_experiments>
      </instructions>
  </configuration>
</plugin>

【问题讨论】:

    标签: java osgi bnd maven-bundle-plugin


    【解决方案1】:

    这似乎是正确的,是的,尽管如果没有更多代码细节就很难确定。

    回答您的具体问题:

    1. 是的,这样做是绝对必要的,因为您无法知道包永远不会被另一个包导出。一方面,bnd 不知道这一点,因为它一次只查看一个包。更重要的是,这个捆绑包可能会有未来的版本,在这种情况下,您将获得相同包的多个导出。然后,uses 约束对于确保包的用户无法获得不一致的类型集至关重要。

      为了说明这一点,假设您要修改一个包中的类,然后将该类的实例作为参数传递给另一个包中的旧版本类。那个老班不会理解你给它的对象。实际上 JVM 本身不会让这种情况发生,你会得到一个 ClassCastException 或一个 LinkageError ...... OSGi uses 约束只是阻止我们走到这一步。

    2. 我不会说这些包的定义不正确。他们可能没有很好地定义。大量的uses 约束表明这些包之间是高度耦合的,并且可能会从一些重组中受益,即将紧密耦合的类/接口移动到同一个包中,可能会合并一些包等。你也不要确实需要包之间的循环依赖关系,因为这使得将包分解为单独的模块变得困难。顺便说一下,这个建议并没有任何特定于 OSGi 的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 2014-02-22
      • 2014-01-23
      • 2013-02-20
      相关资源
      最近更新 更多