Использование декларативных сервисов в Karaf 4.1.0
Я пытаюсь разработать приложение Karaf 4.1.0, используя NetBeans 8.2, Maven 3.3.9 и декларативные сервисы. Действительно простые сервисы работают, но как только я пытаюсь сделать что-то неопределенно полезное, я начинаю бояться osgi.component
Отсутствует требование об ошибке.
Следующее иллюстрирует вид проблемы, которую я имею:
package net.winnall.enocean.bridge.sass.impl;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.winnall.enocean.bridge.sass.SASS;
import org.osgi.service.http.HttpService;
@Component(
service = SASS.class
)
public class SASSImpl implements SASS {
@Reference
HttpService httpService;
@Activate
protected void activate() {
}
@Deactivate
}
}
Если я закомментирую @Reference
Компонент загружается в сгенерированную сборку Karaf без каких-либо проблем. Но как компонент стоит здесь (с @Reference
) Я получаю следующую ошибку:
Failed to execute goal org.apache.karaf.tooling:karaf-maven-plugin:4.1.0:assembly (default-assembly) on project EnOceanBridgeAdmin: Unable to build assembly: Unable to resolve root: missing requirement [root] osgi.identity; osgi.identity=EnOceanBridgeSASSFeature; type=karaf.feature; version=0.99.99; filter:="(&(osgi.identity=EnOceanBridgeSASSFeature)(type=karaf.feature)(version>=0.99.99))" [caused by: Unable to resolve EnOceanBridgeSASSFeature/0.99.99: missing requirement [EnOceanBridgeSASSFeature/0.99.99] osgi.identity; osgi.identity=EnOceanBridgeSASS.Impl; type=osgi.bundle; version="[0.99.99,0.99.99]"; resolution:=mandatory [caused by: Unable to resolve EnOceanBridgeSASS.Impl/0.99.99: missing requirement [EnOceanBridgeSASS.Impl/0.99.99] osgi.extender; filter:="(&(osgi.extender=osgi.component)(version>=1.3.0)(!(version>=2.0.0)))"]] -> [Help 1]
Этот вопрос предлагает установить scr
:
feature:install scr
поэтому я попытался добавить <feature>scr</feature
в karat-maven-plugin
"s <bootFeatures>
, но это не имеет значения.
Ниже приводится выдержка из эффективного POM для этого компонента:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.configadmin</artifactId>
<version>1.8.14</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.ds-annotations</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.logging</groupId>
<artifactId>pax-logging-service</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.logging</groupId>
<artifactId>pax-logging-api</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.logging</groupId>
<artifactId>pax-logging-log4j2</artifactId>
<version>1.9.1</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.karaf.features</groupId>
<artifactId>framework</artifactId>
<version>4.1.0</version>
<type>kar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.karaf.features</groupId>
<artifactId>standard</artifactId>
<version>4.1.0</version>
<type>xml</type>
<classifier>features</classifier>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.karaf.tooling</groupId>
<artifactId>karaf-maven-plugin</artifactId>
<version>4.1.0</version>
<extensions>true</extensions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.karaf.tooling</groupId>
<artifactId>karaf-maven-plugin</artifactId>
<version>4.1.0</version>
<extensions>true</extensions>
<configuration>
<installedFeatures></installedFeatures>
<startupFeatures></startupFeatures>
<bootFeatures>
<feature>minimal</feature>
<feature>scr</feature>
</bootFeatures>
<javase>1.8</javase>
</configuration>
</plugin>
Функция, которую я использую, чтобы сделать ее известной сборке Karaf:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="EnOceanBridgeSASS.Impl">
<feature name="EnOceanBridgeSASS.Impl" description="EnOceanBridge SASS Impl" version="0.99.99">
<details>Karaf :: Declarative Services :: Service :: EnOceanBridge SASS Implementation</details>
<bundle start-level="80">mvn:net.winnall.enocean.service.api/EnOceanBridgeSASS.API/0.99.99</bundle>
<bundle start-level="80">mvn:org.apache.felix/org.apache.felix.configadmin/1.8.14</bundle>
<bundle start-level="80">mvn:org.ops4j.pax.logging/pax-logging-api/1.9.1</bundle>
<bundle start-level="80">mvn:org.ops4j.pax.logging/pax-logging-service/1.9.1</bundle>
</feature>
</features>
И эффективное POM сборки Karaf содержит это:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.configadmin</artifactId>
<version>1.8.14</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.ds-annotations</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.logging</groupId>
<artifactId>pax-logging-service</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.logging</groupId>
<artifactId>pax-logging-api</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.logging</groupId>
<artifactId>pax-logging-log4j2</artifactId>
<version>1.9.1</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>net.winnall.enocean.feature</groupId>
<artifactId>EnOceanBridgeSettingsFeature</artifactId>
<version>0.99.99</version>
<type>xml</type>
<classifier>features</classifier>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.winnall.enocean.feature</groupId>
<artifactId>EnOceanBridgeSASSFeature</artifactId>
<version>0.99.99</version>
<type>xml</type>
<classifier>features</classifier>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.winnall.enocean.feature</groupId>
<artifactId>EnOceanBridgePersistenceFeature</artifactId>
<version>0.99.99</version>
<type>xml</type>
<classifier>features</classifier>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.karaf.features</groupId>
<artifactId>framework</artifactId>
<version>4.1.0</version>
<type>kar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.karaf.features</groupId>
<artifactId>standard</artifactId>
<version>4.1.0</version>
<type>xml</type>
<classifier>features</classifier>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.karaf.tooling</groupId>
<artifactId>karaf-maven-plugin</artifactId>
<version>4.1.0</version>
<extensions>true</extensions>
</plugin>
<plugin>
<artifactId>maven-archetype-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>com.github.ferstl</groupId>
<artifactId>depgraph-maven-plugin</artifactId>
<version>2.1.0</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>license-maven-plugin</artifactId>
<version>1.12</version>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.0</version>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.3.0</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>com.github.ferstl</groupId>
<artifactId>depgraph-maven-plugin</artifactId>
<version>2.1.0</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>default-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
<execution>
<id>process-resources</id>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.karaf.tooling</groupId>
<artifactId>karaf-maven-plugin</artifactId>
<version>4.1.0</version>
<extensions>true</extensions>
<executions>
<execution>
<id>default-archive</id>
<phase>package</phase>
<goals>
<goal>archive</goal>
</goals>
<configuration>
<installedFeatures></installedFeatures>
<startupFeatures></startupFeatures>
<bootFeatures>
<feature>minimal</feature>
<feature>scr</feature>
</bootFeatures>
<javase>1.8</javase>
</configuration>
</execution>
<execution>
<id>default-assembly</id>
<phase>process-resources</phase>
<goals>
<goal>assembly</goal>
</goals>
<configuration>
<installedFeatures></installedFeatures>
<startupFeatures></startupFeatures>
<bootFeatures>
<feature>minimal</feature>
<feature>scr</feature>
</bootFeatures>
<javase>1.8</javase>
</configuration>
</execution>
</executions>
<configuration>
<installedFeatures></installedFeatures>
<startupFeatures></startupFeatures>
<bootFeatures>
<feature>standard</feature>
<feature>scr</feature>
</bootFeatures>
<javase>1.8</javase>
</configuration>
</plugin>
Все выходные я потратил на поиски этой проблемы: мне кажется, что в Интернете практически нет документации по использованию декларативных услуг в Карафе.
Кто-нибудь может дать мне несколько советов о том, как решить мою проблему?
Стив
2 ответа
Я, наконец, избавился от ошибки, честно говоря, я не уверен, что я сделал, чтобы исправить ее. Последнее редактирование, которое сделало эту работу, состояло в том, чтобы удалить что-то из файла функций, перечисленного выше, которого там не было вообще, когда я сообщил о первоначальной проблеме (это было <repository />
и <feature />
ссылка, которую я добавил в тщетной попытке принудительной установки HttpService...).
Мой текущий взгляд на лучший возможный мир (то есть, где я не теряю 4 дня на таких проблемах) включает в себя:
- Сообщения об ошибках OSGi, которые помогают программисту изолировать ошибки;
- Способ сообщить Google, что меня действительно интересует только последнее воплощение декларативных сервисов (т.е. основанных на аннотациях, а не необработанных файлов BND или XML);
- Более чистая документация DS на основе аннотаций без иллюстраций о том, как это сделать в Eclipse, потому что я не использую Eclipse и не хочу;
- Более простая документация о том, как использовать DS в Karaf;
- Караф IDE (это то, что Караф Boot является?).
Я думаю, что Караф и ДС - это классные способы работы. Я хотел бы, чтобы это было проще.
Вы пытаетесь получить ссылку на службу HTTP, но не указываете, установили ли вы эту функцию вообще.
Кроме того, в зависимости от версии OSGi использование @Reference для атрибута может не работать, и вам может потребоваться использовать методы getter/setter (bind/unbind) для него.
См. http://blog.vogella.com/2016/06/21/getting-started-with-osgi-declarative-services/ главу 7. Аннотации DS (спасибо Ларсу Фогелю за этот замечательный урок.)
Проект enroute также является отличным местом для начала работы с OSGi.