我正在尝试按照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个条目,而不是我期待的两个条目
答案 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以查看它所期望的库组合。