OSGi Bundle не запускается с приложением Felix Host

Я использую Apache Felix в хост-приложении, чтобы обеспечить возможность загрузки расширений во время выполнения. Механизм работает отлично, но у меня очень темпераментное поведение в отношении запуска пакетов, если я включаю определенные зависимости. Если, например, я использую в своем pom.xml следующее:

<packaging>bundle</packaging>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.5.0</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
                    <Bundle-Name>${project.artifactId}</Bundle-Name>
                    <Bundle-Version>1.0.0</Bundle-Version>
                    <Bundle-Activator>${pom.groupId}.activator.Activator</Bundle-Activator>
                    <Include-Resource>{maven-resources}, {maven-dependencies}</Include-Resource>
                    <Import-Package>*</Import-Package>
                    <Embed-Dependency>jackson-core</Embed-Dependency>
                    <Embed-Transitive>true</Embed-Transitive>
                </instructions>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.osgi.core</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjtools</artifactId>
        <version>1.8.2</version>
    </dependency>
    <dependency>
        <groupId>co.ff36</groupId>
        <artifactId>halo.core</artifactId>
        <version>1.0.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Все отлично работает и бандл регистрируется и запускается. Однако, если я включаю async-http-client в комплект, он регистрируется, но не запускается! Я попытался внедрить зависимость в пакет, даже если родитель предоставляет ее родительским хост-приложением. Если я загляну внутрь скомпилированного пакета, банка будет включена, но на самом деле она все равно не запустится.

Я попытался добавить:

    <dependency>
        <groupId>com.ning</groupId>
        <artifactId>async-http-client</artifactId>
        <version>1.9.31</version>
    </dependency>

и изменено:

<Embed-Dependency>jackson-core, async-http-client</Embed-Dependency>

Ни один из этих вариантов не работает. Я не получаю никаких ошибок в хост-приложении, и я просто не могу понять, почему некоторые библиотеки вызывают это, а другие нет.


person tarka    schedule 03.12.2015    source источник


Ответы (2)


Доступ к Jackson можно получить в виде пакетов OSGi, которые вам не нужно встраивать. Если у вас есть веб-консоль felix или консоль другого типа, вы можете проверить, какой импорт (или возможность) не представлен, что приводит к тому, что пакет не может перейти в состояние АКТИВНО. Поскольку POM показывает все зависимости, включенные в переходную форму. Не рекомендуется использовать это, потому что это означает, что классы не загружаются из других пакетов, а не все встраивается, что означает, что вы создаете монолитный пакет, который ничего не использует из пакетов.

Другая возможная причина не запуска состоит в том, что активатор вызывает некоторый метод, который выдает исключение, которое сделает ваш активатор недействительным, как определено в спецификации OSGi. Рекомендуется проверить ваш журнал, возможно, в коде есть классы создания экземпляров отражения, которые не могут быть разрешены, потому что они не проявляются плагином пакета - можно импортировать только те пакеты, которые представлены в импорте классов.

person Csákány Róbert    schedule 03.12.2015
comment
Спасибо за ответ. Приношу свои извинения, поскольку из моего первоначального вопроса неясно, что я встроил его только для того, чтобы попытаться решить проблему и выяснить, была ли это проблема с разрешениями или доступом. Обычный pom не делает этого в соответствии с вашим предложением. Я нашел причину проблемы и обновил вопрос. - person tarka; 04.12.2015

После дальнейшего расследования выясняется, что проблема связана с управлением версиями. Созданный пакет MANIFEST.MF явно указывает версии для некоторых пакетов импорта:

Import-Package: ...,com.fasterxml.jackson.core.type;version="[2.4,3)",com.ning.http.client;version="[1.9,2)",
 org.osgi.framework;version="[1.5,2)"

Однако хост-приложение не указывает версию:

Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA -> ... com.ning.http.client ...

Похоже, что версия должна быть явно указана на хосте и должна соответствовать импорту пакетов, иначе пакет не будет активирован.

person tarka    schedule 04.12.2015