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

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

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


确实有必要在导出软件包的uses指令中包含由同一捆绑软件导出的软件包吗?这些软件包不会被任何其他捆绑软件导出;因此没有拆分包。
这是否表明库的包结构定义不正确?顶级包使用的几个类通常位于子包中,反之亦然。这是一个适用于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>

最佳答案

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

要回答您的特定问题:


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

为了说明这一点,假设您要在一个包中修改一个类,然后将该类的实例作为参数传递给另一个包中某个类的旧版本。那个旧班级不会理解您给它的对象。实际上,JVM本身不会让这种情况发生,您将得到ClassCastException或LinkageError ... OSGi uses约束只是阻止了我们进一步发展。
我不会说这些软件包的定义不正确。他们也许没有很好的定义。大量的uses约束表明程序包彼此之间高度耦合,并且可能会从某些重组中受益,例如,将紧密耦合的类/接口移至同一程序包中,可能会合并某些程序包等。此外,您也不会确实需要软件包之间的循环依赖关系,因为这使得很难将软件包分解为单独的模块。顺便说一句,此建议没有OSGi特有的。

09-11 19:41
查看更多