gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:34:36 25 4
gpt4 key购买 nike

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

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

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

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

这是在 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. 是的,这样做绝对有必要,因为您无法知道这些包永远不会被另一个包导出。一方面,bnd 不知道这一点,因为它一次只查看一个包。更重要的是,这个包可能会有 future 的版本,在这种情况下,您将获得相同包的多个导出。 uses 约束对于确保包的用户无法获取不一致的类型集至关重要。

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

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

关于java - BND 在 'uses' 指令中包含相同包的导出包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19967713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com