Неразрешенное требование: osgi.component

Я пытаюсь разработать на Karaf OSGi WAB, содержащий REST API и вызов из специальной службы. Однако по какой-то странной причине платформа OSGi жалуется на неудовлетворенную возможность osgi.component.

Я хотел бы знать:

  1. Как я могу решить эту проблему?
  2. Что такое osgi.component комплект? Зачем нужен?
  3. Почему maven-bundle-plugin (тем самым также bnd) объявляет его внутри записи «Require-Capability»?
  4. Если мне нужно установить его на платформе OSGi, где я могу его найти?

Некоторая дополнительная информация:

  • караф версия: 4.0.7;
  • Плагин пакета maven: 3.2.0;
  • ОС: Windows 10 64-битная;
  • IDE: Затмение Неон;

Некоторый код для предоставления дополнительной информации:

Вся ошибка:

Ошибка при выполнении команды: Ошибка при выполнении команды для пакетов: Ошибка при запуске пакета 96: Невозможно разрешить com.massimobono.karaf.examples.user-full-rest [96] (R 96.0): отсутствует требование [com.massimobono.karaf.examples. user-full-rest [96](R 96.0)] osgi.extender; (&(osgi.extender=osgi.component)(версия>=1.3.0)(!(версия>=2.0.0))) Нерешенные требования: [[com.massimobono.karaf.examples.user-full-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());
        }

    }

}

Спасибо за любой ответ


person Koldar    schedule 24.11.2016    source источник
comment
См. ответ: stackoverflow.com/a/40611246/448551   -  person BJ Hargrave    schedule 24.11.2016
comment
Я продолжал искать аналогичный ответ около 30 минут... извините за дублирующийся вопрос.   -  person Koldar    schedule 25.11.2016


Ответы (1)


Как я могу решить эту проблему?

Скорее всего, вам не хватает SCR в среде выполнения Karaf. Вы можете установить его с помощью feature:install scr

Что такое пакет osgi.component? Зачем нужен?

Это не пакет, а требование. По сути, в нем говорится, что вашему пакету требуется SCR (или что-то еще), который знает, как обрабатывать и регистрировать компоненты, определенные в нем, через декларативные службы.

Почему maven-bundle-plugin (тем самым также bnd) объявляет его внутри записи «Require-Capability»?

Потому что он видит, что вы используете декларативные службы, и знает, что они не будут работать, если у вас нет чего-то во время выполнения, которое понимает, как они объявлены, и знает, как управлять их жизненным циклом. Если бы требования не было (что, как я полагаю, было в случае с более ранними версиями bnd), то ваш пакет запустился бы без проблем, но службы все равно не были бы зарегистрированы/активированы.

Если мне нужно установить его на платформе OSGi, где я могу его найти?

В Karaf это доступно как функция (см. ответ на ваш первый вопрос). В простой среде выполнения OSGi (Felix, Equinox, ...) вам необходимо установить ее вручную. Он доступен в центре Maven.

person Milen Dyankov    schedule 24.11.2016
comment
Черт, и я также знал о функции scr ... сообщение об ошибке полностью одурачило меня. Спасибо, классный ответ - person Koldar; 25.11.2016