2013-10-27 3 views
1

Я пытаюсь реализовать пакет, который использует фасад регистрации 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 записи, а не два я ожидал

ответ

0

Будучи включены несколько раз не проблема, которую вы испытываете, проблема в том, что у вас есть две несовместимые реализации библиотеки см. http://www.slf4j.org/codes.html#multiple_bindings, чтобы узнать, какие комбинации библиотек он ожидает.

+0

Не уверен в этом - osgi = slf4j jar - это обычная ** встроенная реализация slf4j, построенная мной на основе кода блога nogunner, поэтому вы можете игнорировать номер версии, это мое управление версиями и не имеет ничего общего с мостом osgi-over-slf4j, созданным людьми log4j. – user2925382

+0

@ user2925382 Библиотека жалуется, что находит два StaticLoggerBinder, но вы можете быть правы, что это тот же самый класс дважды, и OSGi путает детектор этого условия. –

+0

спасибо, fyi, я добавил некоторые дополнительные разъяснения и расследования в конце оригинального сообщения. – user2925382

1

Я столкнулся с теми же проблемами. Ваше подробное объяснение помогло мне выявить проблему:
Плагин «Java class classpath» и «PDE classpath» (MANIFEST.MF), кажется, объединяется при развертывании в контейнере OSGI через Eclipse Launch/Debug. Это объясняет дублирование ресурсов пакета в загрузчике класса пакетов.

Обход:
Удаления SLF4J связывания JAR из «сборок Java классов» позволит решить несколько ошибки привязок.

Я уверен, что это ошибка, но быстрое исследование в Eclipse Bugzilla не дало никаких результатов.

+0

Вот отчет об ошибке Eclipse для этой проблемы: https://bugs.eclipse.org/bugs/show_bug.cgi?id=417869 Ваш метод работает для меня, но теперь я получаю ошибки на вкладке «Проблемы», в которой указаны классы aren 't включен в плагин. Тем не менее, при работе он работает нормально, просто беспорядочно, чтобы эти ошибки отображались в среде Eclipse. –

Смежные вопросы