未解决的要求:osgi.component

时间:2016-11-24 15:56:01

标签: osgi osgi-bundle karaf maven-bundle-plugin wab

我正试图在Karaf上开发一个OSGi WAB,其中包含REST API和来自定制服务的调用。然而,由于一些奇怪的原因,OSGi框架抱怨不满意的能力,osgi.component

我想知道

  1. 我该如何解决这个问题?
  2. 什么是osgi.component捆绑?为什么需要?
  3. 为什么maven-bundle-plugin(从而也是bnd),在条目#34; Require-Capability"?
  4. 中声明它
  5. 如果我需要在OSGi框架上安装它,我可以在哪里找到它?
  6. 其他一些信息:

    • karaf版本:4.0.7;
    • maven bundle plugin:3.2.0;
    • 操作系统:Windows 10 64位;
    • IDE:Eclipse Neon;

    提供其他信息的一些代码:

    整个错误:

      

    执行命令时出错:在bundle上执行命令时出错:           启动包96时出错:无法解析com.massimobono.karaf.examples.user-fully-rest [96](R 96.0):缺失   要求[com.massimobono.karaf.examples.user-fully-rest [96](R   96.0)] osgi.extender; (及(osgi.extender = osgi.component)(版本> = 1.3.0)((版本>!= 2.0.0)))   未解决的要求:   [[com.massimobono.karaf.examples.user-fully-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());
            }
    
        }
    
    }
    

    感谢您的回复

1 个答案:

答案 0 :(得分:6)

  

我该如何解决这个问题?

您很可能在Karaf运行时中缺少SCR。您可以使用feature:install scr

进行安装
  

什么是osgi.component包?为什么需要?

它不是捆绑而是要求。基本上它表示你的bundle需要SCR(或其他东西)知道如何通过Declarative Services处理和注册其中定义的组件。

  

为什么maven-bundle-plugin(从而也是bnd),在条目#34; Require-Capability&#34;中声明它?

因为它看到你正在使用Declarative Services并且知道它们不会工作,除非你在运行时有一些东西能够理解它们的声明方式并且知道如何管理它们的生命周期。如果没有那个要求(我相信早期版本的bnd就是这种情况)那么你的捆绑包就会没有问题但服务仍然没有注册/激活。

  

如果我需要在OSGi框架上安装它,我可以在哪里找到它?

在Karaf中,它可用作功能(请参阅第一个问题的答案)。在普通的OSGi运行时(Felix,Equinox,...)中,您需要手动安装它。 It's available in Maven central