第三方jar在运行时类路径中出现两次

时间:2013-10-27 20:42:25

标签: java jar eclipse-pde

我正在尝试按照nogunner博客here上列出的模式实现一个使用SLF4J日志记录外观的包。

我已经将SLF4J实现文件打包为一个jar,我想在我的应用程序包中与SLF4J api jar一起部署为第三方jar。

问题是:当我这样做时,SLF4J抱怨StaticLoggerBinder(实现SLF4J静态工厂类在我的类路径中出现两次。似乎我的两个库jar都被部署到bundle类路径中两次

我已经审核并关注(here和本网站上的帖子)包含第三方广告罐的解决方案。

以下是详细信息:

Eclipse Standard/SDK
Version: Kepler Service Release 1
Build id: 20130919-0819

这是我的清单。 lib/osgi.slf4j.impl-1.0.0.jar具有自定义绑定器,工厂和记录器实现。另一个jar就是SLF4J api发行版。

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Logging
Bundle-SymbolicName: dsct.equinox.log.frontend
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: dsct.test.useLog.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Import-Package: org.osgi.framework;version="1.7.0",
 org.osgi.service.log;version="1.3.0"
Bundle-Classpath: lib/osgi.slf4j.impl-1.0.0.jar,
 lib/slf4j-api-1.7.5.jar,
 .

这是构建文件:

output.. = bin/
bin.includes = META-INF/,\
               .,\
               lib/
source.. = src/

由此我得到以下SLF4J错误:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [bundleresource://1.fwk899805279/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [bundleresource://1.fwk899805279:3/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [null]

我相信它告诉我,StaticLoggerBinder包含在第一个和第三个Bundle-ClassPath条目中。

这是奇怪的:

  • 如果我在清单中切换lib / jars的顺序,则错误消息按顺序反映更改 - 并显示重复发生在类路径条目2和4中。

  • 如果我导出捆绑包 - 它看起来很好:正确的清单,正确的lib \带有2个罐子

所以它真的让我觉得构建是捆绑类路径jar加倍。当我的运行时类路径看起来像(数字表示类路径索引):

osgi-slf4j: 0
slf4j-api:  1
.           2

我在索引0和3处显示重复,暗示路径如下:

osgi-slf4j: 0
slf4j-api:  1
.           2
osgi-slf4j: 3
slf4j-api:  4
.           5

当运行时类路径顺序如下所示:

.           0
slf4j-api:  1
osgi-slf4j: 2

错误消息表明重复发生在条目2和5,因此看起来类路径是:

.           0
slf4j-api:  1
osgi-slf4j: 2
.           3
slf4j-api:  4
osgi-slf4j: 5

PS:我已经完成了project-> clean并在启动之前打开了“clear configuration”,并在程序参数中包含了-clean。我也使用过PDE工具 - >更新类路径

有关如何了解正在发生的事情的任何建议?我已经找到了检查构建/部署的捆绑包的方法,但找不到任何东西。我做了一些根本错误的事情吗?

...谢谢

进一步澄清

osgi-slf4j jar是我实现的SLF4J实现,版本编号是我的。它与log4j人员的osgi-over-slf4j桥无关。

我在bundle activator中编写了一些代码来获取bundle类加载器并列出classpath资源。清单是:

bundleresource://4.fwk899805279/
bundleresource://4.fwk899805279:1/
bundleresource://4.fwk899805279:2/
bundleresource://4.fwk899805279:3/
bundleresource://4.fwk899805279:4/
bundleresource://4.fwk899805279:5/

这似乎证实了我怀疑我的类路径的数量应该是它的两倍。为什么清单有3个,但转储类加载器资源显示6个?

当我删除osgi-slf4j jar并将其源代码直接放入我的src目录时,everthing工作正常!! ??并且,classpath转储如下所示:

bundleresource://4.fwk899805279/
bundleresource://4.fwk899805279:1/
bundleresource://4.fwk899805279:2/
bundleresource://4.fwk899805279:3/

这是4个条目,而不是我期待的两个条目

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。您的详细解释帮助我找出了问题:
当通过Eclipse Launch / Debug部署在OSGI容器中时,插件的“Java构建类路径”和“PDE类路径”(MANIFEST.MF)似乎被合并。这解释了bundle类加载器中bundle资源的重复。

解决方法:
从“Java构建类路径”中删除SLF4J绑定JAR将解决多重绑定错误。

我很确定这是一个错误,但Eclipse Bugzilla的快速研究没有产生任何结果。

答案 1 :(得分:0)

多次包含并不是您遇到的问题,问题是您有两个不兼容的库实现,请参阅http://www.slf4j.org/codes.html#multiple_bindings以查看它所期望的库组合。