【发布时间】:2012-03-14 13:31:36
【问题描述】:
例如,捆绑“A”和捆绑“B”正在使用 log4j。我们可以只有一个 log4j 吗?或者是否有必要在每个包中都有 log4j?
【问题讨论】:
例如,捆绑“A”和捆绑“B”正在使用 log4j。我们可以只有一个 log4j 吗?或者是否有必要在每个包中都有 log4j?
【问题讨论】:
如果包“A”正在导出 log4j 包并且包“B”导入它们,则包“B”可以使用包“A”中的 log4j。
实际上最好使用log4j bundle(log4j 1.2.16 是符合 OSGi 的版本),然后导入“A”和“B”。您可以检查我链接的 log4j.jar 并查看它是否有 OSGi 清单条目。
【讨论】:
我同意其他人的说法。不仅可能只有一个 log4j jar 副本,而且非常可取。避免这种 jar 重复是 OSGi 的主要用例之一。不是在包中防御性地打包库以确保它们在类路径上,而是每个包都可以显式声明对库包的依赖关系——在这种情况下为 log4j。这样可以避免臃肿,并且还可以在需要时更轻松地更新共享库。
【讨论】:
如果您共享一个捆绑包,它将只有一个全局状态(静态字段等)。
通常您可以重复使用 log4j,但如果您希望一个包在一个应用程序中处于 DEBUG 级别,而在另一个应用程序中处于 INFO 级别,则需要维护两个包。
【讨论】:
OSGi 的整体理念是能够分享...
也就是说,共享会产生耦合,通常您只想耦合到公共 API。坏包是似乎传递性地拖入无数依赖关系的包。 OSGi 服务的整体理念是最大限度地减少人们在与其他捆绑包过度耦合时产生的大泥球。
【讨论】: