BND包含'uses'指令中相同包的导出包

时间:2013-11-14 01:17:39

标签: java osgi bnd maven-bundle-plugin

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

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

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

  1. 是否真的有必要在导出包的uses指令中包含由同一个包导出的包?这些包不会被任何其他包导出;因此没有拆包。
  2. 此行为是否表示库的包结构未正确定义?顶级包使用的几个类通常在子包中,反之亦然。这是一个适合作为OSGi包的库。包结构的设计并不是OSGi友好的。
  3. 以下是MANIFEST

    中列出的大多数导出包的方式
    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>
    

1 个答案:

答案 0 :(得分:3)

这似乎是正确的,是的,虽然如果没有更多代码细节,很难肯定地说。

回答您的具体问题:

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

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

  2. 我不会说包错误地定义。它们可能不是定义的。大量的uses约束表明这些包彼此高度耦合,并且可能受益于一些重组,即将紧密耦合的类/接口移动到同一个包中,可能合并一些包等等。我们真的希望包之间存在循环依赖关系,因为这使得很难将包分解为单独的模块。顺便说一句,没有任何特定于OSGi的建议。