1

我正在尝试按照 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 个条目,而不是我期待的两个

4

2 回答 2

1

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

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

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

于 2013-11-25T12:43:09.627 回答
0

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

于 2013-10-27T20:45:20.960 回答