访有一个问题与分包,即同的软件包,但主办在多束。

是否有任何边缘的情况下,分包可能会造成问题在普通java(没有访)?

只是好奇。

有帮助吗?

解决方案

对于OSGi,不同包中的包不同,不管它们的名称如何,因为每个包都使用自己的类加载器。确保封装捆绑包不是问题,而是一个特征。

所以在普通的Java中,这通常不是问题,直到你开始使用一些使用类加载器的框架。这通常是组件加载时的情况。

其他提示

在分包来

分包 (在访)时发生的清单头 Require-Bundle 用(因为它是,我相信,在日食的清单). Require-Bundle 名称的其他束它们被用来搜索类别(如果包装不是 Imported)。搜索发生之前的束自己的类路径是搜查。这使得课程对于单个包装,从出口 捆(可能是不同的罐子).

该访规范(4.1)部分介绍了3.13 Require-Bundle 并且有一个长长的清单(意想不到)的后果使用这个标题(应该这头被废弃?), 一部分是专门讨论 分包.这些后果是奇怪的(而访特定的),但大多数是可以避免的如果你明白一件事:

  • 如果一个 (在一个软件包)提供了超过一个包然后你有麻烦了。

如果包件是分离的,那么所有的应该是好了,但你可能不具有类 可见 无处不在,包的可见性成员可能会出现的私人如果从一个"错误"的一部分分包。

[当然,那太简单多个版本的软件包可以安装,但从程序的观点 在任何一个时间 所有课程从一个包装应该是来自一个单一的模块。]

什么发生在'标准Java'

在标准爪哇,没有花哨的舱装载机,你有一个类路径,以及为了寻找的瓶子(和目录)类装载固定和定义:你会得到什么是什么你得到的。(但是,我们放弃管理的模块化。)

当然,你可以有分包—这是很常见的,事实上,它是指示可怜的模块化。症状可能是模糊的编译/建立时的错误,但是在这种情况下的多类实现(一过的游乐设施的其余在一个单一的类径),它最经常产生模糊的运行时行为,由于巧妙地不同的语义。

如果你是 幸运 你最终在寻找在错误码—没有意识到这问问自己,"但是怎么可能会做的 ?"
如果你是 不幸的 你是在寻找正确的代码,并要求完全一样的东西—因为别的东西产生了意想不到的答复。

这不是完全不同于旧的数据库的格言:"如果记录了同一条信息在两个地方,很快就会不一样了"。我们的问题是,'不久'不是通常很快就足够了。

在罐子上拆分包装可能不是一个好主意。我建议将jar中的所有包密封(在清单的主要部分中放入" Sealed:true" )。密封包装不能在罐子之间分开。

对于OSGi,具有相同包名但具有不同类加载器的类被视为它们位于不同的包中。

如果您在同一个包中有类,而某些类在签名的JAR中,而其他类不在。

,则会出现令人讨厌的运行时错误。

你问的是因为有问题的包是你的,而不是第三方代码吗?

一个简单的例子是将服务和持久层作为单独的OSGi包的Web应用程序。持久性接口必须由两个bundle共享。

如果我正确地解释了您的问题,那么解决方案是创建一个包含共享接口的密封JAR并使其成为两个捆绑包的一部分吗?

我不是故意试图劫持线程。我要求澄清以及那些可能在OSGi上做得比我更多的人的更好的见解。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top