java .lang.NoClassDefFoundError: org / slf4j / LoggerFactory в OSGi - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь заставить библиотеку Bio Java работать в контексте OSGi.

Чтобы получить JAR-файл в контексте OSGi, я использую плагин Maven p2-maven-plugin , который генерирует файл Manifest.MF , и часть, относящаяся к исключению, с которым я сталкиваюсь, это:

Bundle-SymbolicName: org.biojava.core
Bundle-Version: 5.3.0
Import-Package: [snip],
 org.slf4j;resolution:=optional,
 [snap]

Что мне подходит. Однако, когда я получаю доступ к классу, использующему slf4j, я получаю титульное исключение:

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at org.biojava.nbio.core.sequence.template.AbstractCompoundSet.<clinit>(AbstractCompoundSet.java:40)
    at org.biojava.nbio.core.sequence.io.ABITrace.getSequence(ABITrace.java:179)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory cannot be found by org.biojava.core_5.3.0
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:511)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:414)

Теперь легко найти это исключение везде, потому что многие пытались (и не смогли) установить slf4j. Я проверил сайты, такие как документация или вопрос SO ClassNotFoundException: org.slf4j.LoggerFactory и, следовательно, попытался добавить следующие пакеты:

  • slf4j-simple
  • slf4j-log4j12 (плюс зависимости log4j)
  • pax-logging-log4j2

Однако ни сработало. Возможно, у контейнера OSGi есть проблемы, но в JAR-файле slf4j есть информация о пакете с пакетами экспорта из коробки, поэтому я предполагаю, что эта работа работает. И у Bio Java JAR есть пакет для импорта, поэтому я понятия не имею, почему он не сможет найти класс.

О, я проверял, LoggerFactory присутствует в slf4j-api Так что это тоже не так.

Я также пробовал разные уровни запуска и автозапуск для реализаций. И я восстановил JAR без необязательной зависимости, но у меня продолжают возникать проблемы, потому что теперь MD5 ha sh сломан.

Кому-нибудь удалось заставить slf4j работать в OSGi? Или, если это не удастся, есть ли способ заменить эту глупую зависимость каким-то прокси Java, чтобы мне больше не понадобилась нарушенная зависимость?

1 Ответ

0 голосов
/ 05 февраля 2020

resolution:=optional означает, что при разрешении пакета он получит доступ к пакету или нет. Фреймворку разрешено разрешать пакет без доступа к пакету. Если для пакета необходим доступ к пакету, зачем делать разрешение пакета необязательным?

...