Нерешенное требование: osgi.component
Я пытаюсь разработать для Karaf OSGi WAB, содержащую REST API и вызов из пользовательского сервиса. Однако, по какой-то странной причине, платформа OSGi жалуется на неудовлетворенные возможности, osgi.component
,
Я хотел бы знать:
- Как я могу решить эту проблему?
- Что такое
osgi.component
расслоение? Зачем нужен? - Почему maven-bundle-plugin (тем самым и bnd) объявляет его внутри записи "Require-Capability"?
- Если мне нужно установить его на платформу OSGi, где я могу его найти?
Некоторая дополнительная информация:
- версия karaf: 4.0.7;
- плагин maven bundle: 3.2.0;
- ОС: Windows 10 64bit;
- IDE: Затмение Неон;
Некоторый код для предоставления дополнительной информации:
Вся ошибка:
Ошибка при выполнении команды: Ошибка при выполнении команды для пакетов: Ошибка при запуске пакета 96: Невозможно разрешить com.massimobono.karaf.examples.user-полностью-rest [96](R 96.0): отсутствует требование [com.massimobono.karaf.examples. пользователь полностью отдыхает [96](R 96.0)] osgi.extender; (&(osgi.extender=osgi.component)(версия>=1.3.0)(!(версия>=2.0.0))) Нерешенные требования: [[com.massimobono.karaf.examples.user-полностью-rest [96](R 96.0)] osgi.extender; (&(Osgi.extender = osgi.component) (версия>=1.3.0)(!(Версия>=2.0.0)))]
Файл манифеста:
Manifest-Version: 1.0
Bundle-SymbolicName: com.massimobono.karaf.examples.user-fully-rest
Archiver-Version: Plexus Archiver
Built-By: massi
Bnd-LastModified: 1479908575162
Bundle-ActivationPolicy: lazy
Bundle-ManifestVersion: 2
Import-Package: com.massimobono.karaf.examples.user;version="[0.0,1)",
com.massimobono.karaf.examples.user.service;version="[0.0,1)",javax.w
s.rs;version="[2.0,3)",javax.ws.rs.core;version="[2.0,3)"
Require-Capability: osgi.extender;filter:="(&(osgi.extender=osgi.compo
nent)(version>=1.3.0)(!(version>=2.0.0)))",osgi.service;filter:="(obj
ectClass=com.massimobono.karaf.examples.user.service.UserService)";ef
fective:=active,osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/com.massimobono.karaf.examples.user.ui.ful
lyrest.UserRest.xml
Tool: Bnd-3.2.0.201605172007
Originally-Created-By: Maven Integration for Eclipse
Export-Package: com.massimobono.karaf.examples.user.ui.fullyrest;uses:
="javax.ws.rs,javax.ws.rs.core";version="0.0.1"
Bundle-Name: user-fully-rest Maven Webapp
Bundle-Version: 0.0.1.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Build-Jdk: 1.8.0_91
Базовый класс отдыха:
package com.massimobono.karaf.examples.user.ui.fullyrest;
import java.time.LocalDateTime;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import com.massimobono.karaf.examples.user.User;
import com.massimobono.karaf.examples.user.service.UserService;
import com.massimobono.karaf.examples.user.service.UserServiceException;
@Path("user")
@Component(immediate=true)
public class UserRest {
@Reference
private volatile UserService userService;
@GET
@Produces(MediaType.TEXT_HTML)
public String getUserNumber() {
try {
return String.format("<h1>Total users: %d</h1>", this.userService.size());
} catch (UserServiceException e) {
return String.format("Couldn't fetch total users because %s", e.getMessage());
}
}
@PUT
@Path("add/{name}/{surname}")
@Produces(MediaType.TEXT_HTML)
public String add(@PathParam("name") String name, @PathParam("surname") String surname) {
try {
User u = new User(name, surname, LocalDateTime.now());
this.userService.addUser(u);
return String.format("<h1>New user with id %d</h1>", u.getId());
} catch (UserServiceException e) {
return String.format("<h1>Couldn't fethc total users because %s</h1>", e.getMessage());
}
}
@DELETE
@Path("remove/{id}")
@Produces(MediaType.TEXT_HTML)
public String remove(@PathParam("id") int id) {
User u;
try {
u = this.userService.getUser(id);
this.userService.removeUser(u);
return String.format("<h1>User name=%s surname=%s removed correctly</h1>", u.getName(), u.getSurname());
} catch (UserServiceException e) {
return String.format("<h1>Couldn't remove user because %s</h1>", e.getMessage());
}
}
}
Спасибо за любой ответ
2 ответа
Как я могу решить эту проблему?
Скорее всего, вам не хватает SCR во время выполнения Karaf. Вы можете установить его с feature:install scr
Что такое пакет osgi.component? Зачем нужен?
Это не связка, а требование. По сути, он говорит, что вашему пакету требуется SCR (или что-то еще), который знает, как обрабатывать и регистрировать компоненты, определенные в нем, через декларативные службы.
Почему maven-bundle-plugin (тем самым и bnd) объявляет его внутри записи "Require-Capability"?
Потому что он видит, что вы используете декларативные сервисы, и знает, что они не будут работать, если у вас во время выполнения нет чего-то, что понимает, как они объявлены, и знает, как управлять их жизненным циклом. Если бы требования не было (что, как я полагаю, имело место в более ранних версиях bnd), тогда ваш пакет запустился бы без проблем, но службы все равно не были бы зарегистрированы / активированы.
Если мне нужно установить его на платформу OSGi, где я могу его найти?
В Karaf это доступно как функция (см. Ответ на ваш первый вопрос). В простой среде выполнения OSGi (Felix, Equinox, ...) вам необходимо установить ее вручную. Это доступно в Maven Central.
У меня была такая же проблема, и в моем случае я использовал последнюю версию maven-bundle-plugin (4.x). После того, как я понизил версию (3.x), проблема исчезла. Похоже, версия плагина 3.x генерирует