Я пытаюсь реализовать пакет, который использует фасад регистрации SLF4J, следуя шаблону, описанному в блоге nogunner here.Сторонние банки, появляющиеся дважды в пути прохождения времени
Я упаковал файлы реализации SLF4J как банку, которую я хочу развернуть как сторонние банки в своем пакете приложений вместе с api jar SLF4J.
Проблема заключается в следующем: когда я это делаю, SLF4J жалуется, что StaticLoggerBinder (который реализует статические заводские классы SLF4J, появляется дважды в моем пути к классам. Кажется, что оба моих банера библиотеки разворачиваются дважды в класс bundle- .. путь
Я рассмотрел и пошел (here и сообщения на этом сайте) решения, включая банки сторонних
Вот подробности:
Eclipse Standard/SDK
Version: Kepler Service Release 1
Build id: 20130919-0819
Вот мой манифест , lib/osgi.slf4j.impl-1.0.0.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/банки в манифесте, то сообщения об ошибках отражают изменения в порядок - и показывает дублирование происходит в записи пути к классам 2 и 4 соответственно.
Если я Экспортируйте пакет - это выглядит прекрасно: правильный манифест, надлежащее LIB \ 2 банков
Так что на самом деле смотрит на меня как сборка удваивает вверх пачка банки пути к классам. Когда мой Путь к классам выполнения выглядит (число указывает на индекс пути к классам)
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
в параметрах программы.Я также использовал инструменты PDE -> Обновить путь к классам
Любое предложение о том, как добраться до сути, что происходит? Я искал способы осмотра встроенного пакета и не нашел ничего. Я делаю что-то принципиально неправильно?
Спасибо ....
Дальнейшее уточнение
OSGi-SLF4J баночка моя реализация реализации SLF4J и нумерации версий моя. Он не имеет ничего общего с мостом osgi-over-slf4j от пользователей log4j.
Я написал немного кода в активаторе пучка, чтобы получить загрузчик классов пакетов и перечислить ресурсы пути к классам. Список:
bundleresource://4.fwk899805279/
bundleresource://4.fwk899805279:1/
bundleresource://4.fwk899805279:2/
bundleresource://4.fwk899805279:3/
bundleresource://4.fwk899805279:4/
bundleresource://4.fwk899805279:5/
, который, кажется, подтверждает мое подозрение, что мой путь к классу в два раза больше того, что он должен. Почему манифест имеет 3, но сброс ресурсов загрузчика классов шесть?
Когда я удаляю банку osgi-slf4j и размещаю ее источник непосредственно в моей директории src, все работает отлично !! ?? И путь к классам свалка выглядит следующим образом:
bundleresource://4.fwk899805279/
bundleresource://4.fwk899805279:1/
bundleresource://4.fwk899805279:2/
bundleresource://4.fwk899805279:3/
который 4 записи, а не два я ожидал
Не уверен в этом - osgi = slf4j jar - это обычная ** встроенная реализация slf4j, построенная мной на основе кода блога nogunner, поэтому вы можете игнорировать номер версии, это мое управление версиями и не имеет ничего общего с мостом osgi-over-slf4j, созданным людьми log4j. – user2925382
@ user2925382 Библиотека жалуется, что находит два StaticLoggerBinder, но вы можете быть правы, что это тот же самый класс дважды, и OSGi путает детектор этого условия. –
спасибо, fyi, я добавил некоторые дополнительные разъяснения и расследования в конце оригинального сообщения. – user2925382