OSGi存在拆分包的问题,即相同的包但托管在多个包中.
是否有任何边缘情况,拆分包可能会在普通java(没有OSGi)中造成问题?
只是好奇.
Require-Bundle
使用清单头时会发生拆分包(在OSGi中)(我相信,在Eclipse的清单中).Require-Bundle
命名用于搜索类的其他包(如果未Import
编辑包).搜索在捆绑包自己的类路径被搜索之前发生.这允许从多个 bundle(可能是不同的jar)的导出中加载单个包的类.
OSGi规范(4.1)第3.13节描述Require-Bundle
并且有一长串(意外)使用这个标题的结果(这个标题应该被弃用吗?),其中一部分专门用于拆分包.其中一些后果是奇怪的(而不是特定于OSGi),但如果您理解一件事,大多数都会被避免:
如果一个类(在一个包中)由多个包提供,那么你就麻烦了.
如果包装件是不相交的,那么一切都应该是好的,除了你可能没有在任何地方可见的类,并且如果从拆分包的"错误"部分查看,包可见性成员可能看起来是私有的.
[当然这太简单了 - 可以安装多个版本的软件包 - 但是从应用程序的角度来看,任何时候软件包中的所有类都应该来自单个模块.
在标准的Java中,没有花哨的类加载器,你有一个类路径,并且要加载的类的jar(和目录)的搜索顺序是固定的和明确定义的:你得到的就是你得到的.(但是,我们放弃了可管理的模块化.)
当然,你可以使用拆分包 - 它实际上很常见 - 它表明模块化程度很差.症状可能是模糊的编译/构建时错误,但是在多个类实现的情况下(一个在一个类路径中覆盖其余的),它通常会产生模糊的运行时行为,因为语义略有不同.
如果你是幸运的你最终看错误的代码,没有意识到这一点,并问自己"怎么能说可能做那?"
如果你运气不好,那么你正在寻找正确的代码,并要求完全相同的东西 - 因为其他东西正在产生意想不到的答案.
这与旧的数据库格言并不完全不同:"如果你在两个地方记录同一条信息,很快它将不再相同".我们的问题是"很快"通常不会很快.
对于OSGi,无论名称如何,不同捆绑软件中的软件包都是不同的,因为每个捆绑软件都使用自己的类加载器。确保捆绑包不是问题,而是功能。
因此,在纯Java中,这通常不是问题,除非您开始使用一些使用类加载器的框架。加载组件时通常就是这种情况。