2016-11-24 12 views
1

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

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

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

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

  • karaf версия: 4.0.7;
  • maven bundle plugin: 3.2.0;
  • ОС: Windows 10 64bit;
  • IDE: Eclipse Neon;

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

Вся ошибка:

Error executing command: Error executing command on bundles: Error starting bundle 96: Unable to resolve com.massimobono.karaf.examples.user-fully-rest [96](R 96.0): missing requirement [com.massimobono.karaf.examples.user-fully-rest [96](R 96.0)] osgi.extender; (&(osgi.extender=osgi.component)(version>=1.3.0)(!(version>=2.0.0))) Unresolved requirements: [[com.massimobono.karaf.examples.user-fully-rest [96](R 96.0)] osgi.extender; (&(osgi.extender=osgi.component)(version>=1.3.0)(!(version>=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 

Rest базовый класс:

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()); 
     } 

    } 

} 

Спасибо за любого родом ответ

+1

См. Ответ: http://stackoverflow.com/a/40611246/448551 –

+0

Я продолжал искать аналогичный ответ за 30 минут ...извините за дублированный вопрос. – Koldar

ответ

4

How can I solve this issue?

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

What is osgi.component bundle? Why is needed?

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

Why maven-bundle-plugin (thereby also bnd), declares it inside the entry "Require-Capability"?

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

If I need to install it on the OSGi framework, where may I find it?

В Karaf это доступно как функция (см. Ответ на ваш первый вопрос). В простой среде OSGi (Felix, Equinox, ...) вам нужно установить его вручную. It's available in Maven central.

+0

Черт, и я также знал о функции scr ... сообщение об ошибке полностью обмануло меня. Спасибо, удивительный ответ – Koldar

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

  • Нет связанных вопросов^_^