"не может быть приведен к org.osgi.framework.BundleActivator" при декларативном запуске пакета OSGi - PullRequest
0 голосов
/ 04 февраля 2019

Существует такое устаревшее 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).

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

попытаться изменить область структуры зависимостей с скомпилировать на при условии

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

Пакеты не должны иметь собственную внутреннюю копию классов OSGi Framework (т. Е. Пакет org.osgi.framework и его подпакеты).Они должны импортировать эти пакеты из System Bundle.

Причина ClassCastException заключается в том, что в Java идентификатор класса представляет собой комбинацию его полностью определенного имени и ClassLoader.это определило это.Если вы определяете тип BundleActivator в нескольких ClassLoaders - что происходит, когда у вас есть его копии внутри пакетов - тогда они считаются разными типами.

...