Я пытаюсь заставить библиотеку 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, чтобы мне больше не понадобилась нарушенная зависимость?