我使用maven-bundle-plugin
将一个库打包为OSGi包,它使用BND。我注意到BND生成了一个非常长的Export-Package
列表,主要是因为它包含了很多由库本身在其他导出包的uses
指令中导出的包。
我(有点)了解uses
指令。我假设在这种情况下,其他包的类(在uses
下列出)被导出包中的类用于方法签名(因此导入)。
从这个意义上说,我有两个问题:
uses
指令中包含由同一个包导出的包?这些包不会被任何其他包导出;因此没有拆包。以下是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>
答案 0 :(得分:3)
这似乎是正确的,是的,虽然如果没有更多代码细节,很难肯定地说。
回答您的具体问题:
是的,绝对有必要这样做,因为你无法知道包永远不会被另一个包导出。首先,bnd不知道这一点,因为它一次只能查看一个包。更重要的是,可能会有此捆绑包的未来版本,在这种情况下,您将获得相同包的多个导出。因此,uses
约束对于确保包的用户无法获得一组不一致的类型至关重要。
为了说明这一点,假设您要修改一个包中的类,然后将该类的实例作为参数传递到另一个包中的旧版本的类中。那个老班不会理解你给它的对象。实际上JVM本身不会让这种情况发生,你会得到一个ClassCastException或一个LinkageError ...... OSGi uses
约束只会阻止我们走这么远。
我不会说包错误地定义。它们可能不是井定义的。大量的uses
约束表明这些包彼此高度耦合,并且可能受益于一些重组,即将紧密耦合的类/接口移动到同一个包中,可能合并一些包等等。我们真的希望包之间存在循环依赖关系,因为这使得很难将包分解为单独的模块。顺便说一句,没有任何特定于OSGi的建议。