未解决的需求:osgi.component

未解决的需求:osgi.component,osgi,osgi-bundle,karaf,maven-bundle-plugin,wab,Osgi,Osgi Bundle,Karaf,Maven Bundle Plugin,Wab,我正试图在Karaf上开发一个OSGi WAB,其中包含一个REST API和一个来自定制服务的调用。然而,出于某种奇怪的原因,OSGi框架抱怨一个不令人满意的功能,OSGi.component 我想知道: 我如何解决这个问题 什么是osgi.componentbundle?为什么需要 为什么maven bundle plugin(因此也是bnd)在条目“Require Capability”中声明它 如果我需要在OSGi框架上安装它,我可以在哪里找到它 一些补充资料: 卡拉夫版本:4.0.7

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

我想知道

  • 我如何解决这个问题
  • 什么是
    osgi.component
    bundle?为什么需要
  • 为什么maven bundle plugin(因此也是bnd)在条目“Require Capability”中声明它
  • 如果我需要在OSGi框架上安装它,我可以在哪里找到它
  • 一些补充资料:

    • 卡拉夫版本:4.0.7
    • maven bundle插件: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
    
    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());
            }
    
        }
    
    }
    
    package com.massimobono.karaf.examples.user.ui.fullyrest;
    导入java.time.LocalDateTime;
    导入javax.ws.rs.DELETE;
    导入javax.ws.rs.GET;
    导入javax.ws.rs.PUT;
    导入javax.ws.rs.Path;
    导入javax.ws.rs.PathParam;
    导入javax.ws.rs.products;
    导入javax.ws.rs.core.MediaType;
    导入org.osgi.service.component.annotations.component;
    导入org.osgi.service.component.annotations.Reference;
    导入com.massimobono.karaf.examples.user.user;
    导入com.massimobono.karaf.examples.user.service.UserService;
    导入com.massimobono.karaf.examples.user.service.UserServiceException;
    @路径(“用户”)
    @组件(立即=真)
    公共类用户REST{
    @参考文献
    私有易失性用户服务;
    @得到
    @生成(MediaType.TEXT\u HTML)
    公共字符串getUserNumber(){
    试一试{
    返回String.format(“总用户数:%d”,this.userService.size());
    }捕获(UserServiceException e){
    返回String.format(“由于%s而无法获取总用户数”,例如getMessage());
    }
    }
    @放
    @路径(“添加/{name}/{names}”)
    @生成(MediaType.TEXT\u HTML)
    公共字符串add(@PathParam(“name”)字符串名称,@PathParam(“姓氏”)字符串姓氏){
    试一试{
    用户u=新用户(名称、姓氏、LocalDateTime.now());
    this.userService.addUser(u);
    返回String.format(“id为%d的新用户”,u.getId());
    }捕获(UserServiceException e){
    返回String.format(“由于%s而无法检测总用户数”,例如getMessage());
    }
    }
    @删除
    @路径(“删除/{id}”)
    @生成(MediaType.TEXT\u HTML)
    公共字符串删除(@PathParam(“id”)int-id){
    用户u;
    试一试{
    u=this.userService.getUser(id);
    this.userService.removeUser(u);
    返回String.format(“用户名=%s姓氏=%s已正确删除”,u.getName(),u.Get姓氏());
    }捕获(UserServiceException e){
    返回String.format(“由于%s而无法删除用户”,例如getMessage());
    }
    }
    }
    
    谢谢你的回复

    我如何解决这个问题

    很可能您在Karaf运行时缺少SCR。您可以使用
    功能安装它:安装scr

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

    这不是一个捆绑,而是一个需求。基本上,它说您的包需要知道如何通过声明性服务处理和注册其中定义的组件的SCR(或其他东西)

    为什么maven bundle plugin(因此也是bnd)在条目“Require Capability”中声明它

    因为它看到您正在使用声明性服务,并且知道除非您在运行时有某种东西能够理解它们是如何声明的,并且知道如何管理它们的生命周期,否则它们将无法工作。如果需求不存在(我相信早期版本的bnd就是这样),那么您的捆绑包将毫无问题地启动,但服务仍然不会注册/激活

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


    在Karaf中,它作为功能提供(请参见第一个问题的答案)。在普通OSGi运行时(Felix、Equinox等)中,您需要手动安装它

    看答案:我一直在寻找类似的答案,大约30分钟。。。抱歉重复了这个问题。该死,我也知道scr功能。。。这个错误消息完全欺骗了我。谢谢,真棒的回答