Существует такое устаревшее Java-приложение на основе Spring, которое запускается в контейнере.Я пытаюсь обеспечить некоторые функциональные возможности плагина OSGi, встраивая Apache Felix в это уже существующее приложение.Я декларативно запускаю фреймворк следующим образом:
https://dotcms.com/blog/post/navigating-osgi-extending-your-software-to-embed-an-osgi-framework
В случае, если ссылка не работает, я делаю импорт Felix как зависимости maven, используяServiceLoader для получения ссылки на фабрику фреймворка, запуск фреймворка и загрузку / запуск всех пакетов в определенном каталоге.
Пакет создается с помощью плагина Felix Bundle со следующей конфигурацией:
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Export-Package>com.example</Export-Package>
<Import-Package>!*</Import-Package>
<Bundle-Name>${project.description}</Bundle-Name>
<Bundle-Activator>com.example.Activator</Bundle-Activator>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
Что касается зависимостей:
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.framework</artifactId>
<version>6.0.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
Итак, как вы можете видеть, он ничего не импортирует (это единственный пакет во всем приложении, сам сервлет не является пакетом OSGi).).Поскольку приложение не является пакетом OSGi, я не могу экспортировать классы инфраструктуры из него, Феликс должен быть встроен в сам пакет.
Я не могу запустить пакет.Вот что я получаю (stacktrace был немного отредактирован):
14:43:52,981 ERROR [con.example.Plugin] (Initialization Thread) Failed to start bundle com.example: org.osgi.framework.BundleException: Activator start error in bundle com.example.Plugin[2].
at org.apache.felix.framework.Felix.activateBundle(Felix.java:2448)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2304)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)
Caused by: java.lang.ClassCastException: com.example.Activator cannot be cast to org.osgi.framework.BundleActivator
at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4744)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:2379)
... 35 more
Мне удалось свести это к возможному факту, что есть два экземпляра интерфейса BundleActivator: один в загрузчике классов комплекта иеще один в ModuleClassLoader фреймворка.По крайней мере, я думаю, что это происходит.
Как люди обычно обходят это?Я попытался создать другой пакет, который просто экспортирует инфраструктуру для первоначального пакета для импорта, но при запуске он страдает от той же ошибки.Вопрос о том, чтобы сделать весеннее приложение полностью совместимым с OSGi, не вызывает сомнений (поэтому я использую Felix, а не Equinox).