我正在尝试按照 nogunner 的博客here中概述的模式来实现一个使用 SLF4J 日志记录外观的包。
我已将 SLF4J 实现文件打包为一个 jar,我希望将其作为第 3 方 jar 与 SLF4J api jar 一起部署在我的应用程序包中。
问题是:当我这样做时,SLF4J 抱怨 StaticLoggerBinder(它实现了 SLF4J 静态工厂类在我的类路径中出现了两次。似乎我的两个库 jar 都被部署到包类路径中两次。
我已经审查并遵循(此处和本网站上的帖子)包含第三方 jar 的解决方案。
以下是详细信息:
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/jar 的顺序,则错误消息会反映顺序的更改 - 并显示重复发生在类路径条目 2 和 4 中。
如果我导出捆绑包 - 它看起来不错:正确的清单,带有 2 个罐子的正确 lib\
因此,在我看来,构建确实使 bundle-classpath 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 并打开了“启动前清除配置”并包含-clean
在程序参数中。我也使用过 PDE Tools -> Update Classpath
关于如何了解正在发生的事情的任何建议?我一直在寻找检查构建/部署包的方法,但找不到任何东西。我在做一些根本错误的事情吗?
谢谢....
进一步澄清
osgi-slf4j jar 是我的 SLF4J 实现,版本号是我的。它与 log4j 人的 osgi-over-slf4j 桥无关。
我在捆绑激活器中编写了一些代码来获取捆绑类加载器并列出类路径资源。名单是:
bundleresource://4.fwk899805279/
bundleresource://4.fwk899805279:1/
bundleresource://4.fwk899805279:2/
bundleresource://4.fwk899805279:3/
bundleresource://4.fwk899805279:4/
bundleresource://4.fwk899805279:5/
这似乎证实了我的怀疑,即我的类路径的数量是应有数量的两倍。为什么 manifest 有 3 个,而转储类加载器资源却显示 6 个?
当我删除 osgi-slf4j jar 并将其源代码直接放入我的 src 目录时,一切正常!!??而且,类路径转储看起来像这样:
bundleresource://4.fwk899805279/
bundleresource://4.fwk899805279:1/
bundleresource://4.fwk899805279:2/
bundleresource://4.fwk899805279:3/
这是 4 个条目,而不是我期待的两个