Java 当我有两个OSGi捆绑包使用同一个jar时,他们是在每个捆绑包中都需要这个jar,还是一个就足够了?

Java 当我有两个OSGi捆绑包使用同一个jar时,他们是在每个捆绑包中都需要这个jar,还是一个就足够了?,java,osgi,bundle,Java,Osgi,Bundle,例如,捆绑包“a”和捆绑包“B”使用log4j。我们只能有一个log4j吗?或者是否有必要在每个捆绑包中包含log4j?如果捆绑包“A”正在导出log4j包,而捆绑包“B”导入了log4j包,则捆绑包“B”可以使用捆绑包“A”中的log4j 实际上,最好使用(log4j1.2.16是一个OSGi兼容版本),然后让“a”和“B”导入它。您可以检查log4j.jar I链接并查看它是否有OSGi清单条目。如果共享一个捆绑包,它将只有一个全局状态(静态字段等) 通常,您可以重用log4j,但是如果您希

例如,捆绑包“a”和捆绑包“B”使用log4j。我们只能有一个log4j吗?或者是否有必要在每个捆绑包中包含log4j?

如果捆绑包“A”正在导出log4j包,而捆绑包“B”导入了log4j包,则捆绑包“B”可以使用捆绑包“A”中的log4j


实际上,最好使用(log4j1.2.16是一个OSGi兼容版本),然后让“a”和“B”导入它。您可以检查log4j.jar I链接并查看它是否有OSGi清单条目。

如果共享一个捆绑包,它将只有一个全局状态(静态字段等)


通常,您可以重用log4j,但是如果您希望一个应用程序的包处于调试级别,而另一个应用程序的包处于调试级别,则需要维护两个包。

我同意其他人的说法。不仅可能只有一个log4jjar副本,而且这是非常理想的。避免JAR的这种重复是OSGi的主要用例之一。每个bundle都可以显式地声明对库包的依赖关系,而不是在bundle中防御性地打包库以确保它们位于类路径上,在本例中,每个bundle都可以显式地声明对库包log4j的依赖关系。这避免了膨胀,也使得在需要时更容易更新共享库。

OSGi的整个理念是能够共享

这就是说,共享创建了耦合,通常您只希望耦合到公共API。坏的bundle是指那些似乎可以通过传递方式拖入无数依赖项的bundle。OSGi服务的整个理念是将人们与其他捆绑包耦合太多时产生的大泥球最小化