当我有两个使用相同jar的OSGi包时,他们是否需要在每个包中使用这个jar或者一个就足够了?

时间:2012-03-14 13:31:37

标签: java osgi bundle

例如,捆绑' A'和一捆' B'正在使用log4j。我们只能有一个log4j吗?或者是否需要在每个包中包含log4j?

5 个答案:

答案 0 :(得分:5)

如果捆绑'A'正在导出log4j包而捆绑'B'导入它们,那么捆绑'B'可以使用捆绑'A'中的log4j。

实际上更好的想法是使用log4j bundle(log4j 1.2.16是一个OSGi兼容的版本),然后让'A'和'B'导入它。您可以检查我链接的log4j.jar,看看它是否有OSGi清单条目。

答案 1 :(得分:3)

我同意别人所说的话。不仅可以只有一个log4j jar的副本,这是非常需要的。避免这种罐子重复是OSGi的主要用例之一。而不是在bundle中防御性地打包库以确保它们在类路径上,每个bundle都可以显式声明对库包的依赖 - 在这种情况下是log4j。这样可以避免膨胀,并且如果需要,还可以更轻松地更新共享库。

答案 2 :(得分:0)

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

通常你可以重用log4j,但是如果你想要一个包的DEBUG级别和另一个应用程序的INFO,你需要维护两个包。

答案 3 :(得分:0)

OSGi的整个想法是能够分享......

也就是说,共享创建了耦合,一般而言,您只希望与公共API耦合。糟糕的捆绑包似乎在无穷无尽的依赖关系中传递。 OSGi服务的整个想法是尽量减少人们在与其他捆绑捆绑过多时产生的大泥浆。

答案 4 :(得分:0)

Dev给了你答案。 OSGi的想法是能够以捆绑包之间的最小依赖关系共享内容。

  • 如果你在两个捆绑包中都有log4j,那么你实际上是在浪费所有 OSGi的优势。
  • 如果你只有一个包中的log4j,f.e:Bundle A,你在包A和B之间建立了直接的依赖关系,因为B总是需要A才能工作。如果A因任何原因停止,B将无法工作。
  • 如果您创建一个新的捆绑包“Bundle_Log4j”并声明A和B以导入其包,您将能够独立地使用Bundle A和Bundle B,这是理想的解决方案。