未解决的需求:osgi.component [英] Unresolved requirement: osgi.component

查看:30
本文介绍了未解决的需求:osgi.component的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to develop onto Karaf an OSGi WAB containing a REST API and a call from a custom-made service. However, for some weird reason, the OSGi framework complains about an unsatisfied capability, osgi.component.

我想知道:

  1. 我该如何解决这个问题?
  2. 什么是 osgi.component 包?为什么需要?
  3. 为什么 maven-bundle-plugin(因此也是 bnd),在条目Require-Capability"中声明它?
  4. 如果我需要在 OSGi 框架上安装它,我在哪里可以找到它?

一些附加信息:

  • karaf 版本:4.0.7;
  • Maven 捆绑插件:3.2.0;
  • 操作系统:Windows 10 64 位;
  • IDE:Eclipse Neon;

提供额外信息的一些代码:

Some code to provide additional info:

整个错误:

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

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

    }

}

感谢任何友好的回复

推荐答案

我该如何解决这个问题?

How can I solve this issue?

您的 Karaf 运行时很可能缺少 SCR.您可以使用 feature:install scr

Most likely you are missing SCR in your Karaf runtime. You can install it with feature:install scr

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

What is osgi.component bundle? Why is needed?

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

It's not a bundle but a requirement. Basically it says your bundle needs SCR (or something) that knows how to process and register the components defined in it via Declarative Services.

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

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

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

Because it sees that you are using Declarative Services and knows they will not work unless you have something at runtime that understands how they are declared and knows how to manage their lifecycle. If the requirement was not there (which I believe was the case with earlier versions of bnd) then your bundle would start without issues but services would still be not registered / activated.

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

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

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

In Karaf it's available as feature (see the answer to your first question). In plain OSGi runtime (Felix, Equinox, ...) you need to install it manually. It's available in Maven central.

这篇关于未解决的需求:osgi.component的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆