2015-12-03 2 views
1

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

<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> 

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

ответ

0

После дальнейшего расследования выясняется, что проблема связана с версированием. Расслоение 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 ... 

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

0

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

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

+0

Спасибо за отзыв. Мои извинения, поскольку из моего первоначального вопроса не ясно, что я только встроен, чтобы попытаться решить эту проблему и выяснить, была ли она проблемой разрешения или доступа. Нормальный жом не делает этого в соответствии с вашим предложением. Я нашел причину проблемы и обновил вопрос. – tarka

Смежные вопросы