当前位置: 首页 > 知识库问答 >
问题:

未解决的需求:osgi.component

满和安
2023-03-14

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

我想知道:

  1. 我如何解决这个问题
  2. 什么是<code>osgi。组件bundle?为什么需要
  3. 为什么maven bundle插件(也就是bnd)在条目“Require Capability”中声明它
  4. 如果我需要在OSGi框架上安装它,我可以在哪里找到它

一些附加信息:

  • 卡拉夫版本: 4.0.7;
  • maven bundle 插件: 3.2.0;
  • 操作系统: 视窗 10 64 位;
  • IDE: Eclipse Neon;

提供附加信息的一些代码:

整个错误:

错误执行命令:错误在捆绑包上执行命令:错误启动捆绑包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;(

清单文件:

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个答案

施学
2023-03-14

我该如何解决这个问题?

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

什么是osgi。组件包?为什么需要?

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

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

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

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

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

 类似资料:
  • 我有一个使用OSGi-(felix)、SpringDM、hibernate和maven的项目。当我安装捆绑包时,它是正常的,当我运行捆绑包id时的输出是: 这是我在启动此捆绑包时看到的: 这是我的beans.xml: 这是我的pom文件: 此外,在felix中存在一个完整的捆绑错误。

  • 问题内容: 我仍然对如何使用webpack解析模块路径感到困惑。现在我写: 但我想写 我以为resolve.alias可能会有所帮助,因为我看到了一个类似的示例,所以可以使用它作为别名。 但是,如果我将别名设置为,将无法正常工作。 我觉得很笨,因为我已经阅读了很多文档,并且觉得自己缺少一些东西。避免用etc写下所有相对要求的正确方法是什么? 问题答案: Webpack 1.0 一种更直接的方法是使

  • 我从git hub开始在我的android工作室下载flutter项目来学习,但是我只在这里AndroidManifest.xml文件中遇到这个问题,我还安装了所有依赖项。请解决我的问题。在这里输入图像描述 在此输入图像描述 在此输入图像描述

  • 问题内容: 我正在尝试使socket.io正常工作,但是现在在Chrome中出现错误: 未捕获的ReferenceError:未定义require client.php:9Uncaught ReferenceError:未定义io 我更改了包含socket.io.js文件的方式,因为它确实不存在: 如果我尝试 我得到: 无法加载资源:服务器响应状态为404(未找到) 这是Ubuntu上所有最新消息

  • 我有可执行模块icoreTest.exe和动态加载库irtest.rs。我想通过lldb C++API调试它。 1.1:where=irtest.rs`add+421 at irtest.st:58,地址=irtest.rs[0x10001525],未解析,命中数=0 这意味着我的断点没有解决..为什么?:) 还有!当我使用lldb命令行时,断点被解决,并且工作: 我比较了两个版本中的lldb行为

  • 问题内容: 我正在尝试在React JS中使用DRY。我正在尝试在不同文件中使用相同的HTML部分 部分: 我在另一个文件中请求它: 但是我遇到一个错误: 该脚本包含在html页面中,例如: 我正在使用webpack 问题答案: 如果您未使用任何webpack等模块捆绑程序,则应将组件分配给某些javascript全局对象,因为.jsx中的对象未置于全局范围内 所以这是解决方案(这里使用了 窗口