题
访有一个问题与分包,即同的软件包,但主办在多束。
是否有任何边缘的情况下,分包可能会造成问题在普通java(没有访)?
只是好奇。
解决方案
对于OSGi,不同包中的包不同,不管它们的名称如何,因为每个包都使用自己的类加载器。确保封装捆绑包不是问题,而是一个特征。
所以在普通的Java中,这通常不是问题,直到你开始使用一些使用类加载器的框架。这通常是组件加载时的情况。
其他提示
在分包来
分包 (在访)时发生的清单头 Require-Bundle
用(因为它是,我相信,在日食的清单). Require-Bundle
名称的其他束它们被用来搜索类别(如果包装不是 Import
ed)。搜索发生之前的束自己的类路径是搜查。这使得课程对于单个包装,从出口 多 捆(可能是不同的罐子).
该访规范(4.1)部分介绍了3.13 Require-Bundle
并且有一个长长的清单(意想不到)的后果使用这个标题(应该这头被废弃?), 一部分是专门讨论 分包.这些后果是奇怪的(而访特定的),但大多数是可以避免的如果你明白一件事:
- 如果一个 类 (在一个软件包)提供了超过一个包然后你有麻烦了。
如果包件是分离的,那么所有的应该是好了,但你可能不具有类 可见 无处不在,包的可见性成员可能会出现的私人如果从一个"错误"的一部分分包。
[当然,那太简单多个版本的软件包可以安装,但从程序的观点 在任何一个时间 所有课程从一个包装应该是来自一个单一的模块。]
什么发生在'标准Java'
在标准爪哇,没有花哨的舱装载机,你有一个类路径,以及为了寻找的瓶子(和目录)类装载固定和定义:你会得到什么是什么你得到的。(但是,我们放弃管理的模块化。)
当然,你可以有分包—这是很常见的,事实上,它是指示可怜的模块化。症状可能是模糊的编译/建立时的错误,但是在这种情况下的多类实现(一过的游乐设施的其余在一个单一的类径),它最经常产生模糊的运行时行为,由于巧妙地不同的语义。
如果你是 幸运 你最终在寻找在错误码—没有意识到这问问自己,"但是怎么可能会做的 那?"
如果你是 不幸的 你是在寻找正确的代码,并要求完全一样的东西—因为别的东西产生了意想不到的答复。
这不是完全不同于旧的数据库的格言:"如果记录了同一条信息在两个地方,很快就会不一样了"。我们的问题是,'不久'不是通常很快就足够了。
在罐子上拆分包装可能不是一个好主意。我建议将jar中的所有包密封(在清单的主要部分中放入" Sealed:true"
)。密封包装不能在罐子之间分开。
对于OSGi,具有相同包名但具有不同类加载器的类被视为它们位于不同的包中。
如果您在同一个包中有类,而某些类在签名的JAR中,而其他类不在。
,则会出现令人讨厌的运行时错误。你问的是因为有问题的包是你的,而不是第三方代码吗?
一个简单的例子是将服务和持久层作为单独的OSGi包的Web应用程序。持久性接口必须由两个bundle共享。
如果我正确地解释了您的问题,那么解决方案是创建一个包含共享接口的密封JAR并使其成为两个捆绑包的一部分吗?
我不是故意试图劫持线程。我要求澄清以及那些可能在OSGi上做得比我更多的人的更好的见解。