2016-11-24 117 views
1

我試圖發展到卡拉夫OSGi WAB包含一個REST API和來自定製服務的電話。然而,出於某種奇怪的原因,OSGi框架抱怨未滿足的能力,osgi.component未解決的要求:osgi.component

我想知道

  1. 我怎樣才能解決這個問題呢?
  2. 什麼是osgi.component捆綁?爲什麼需要?
  3. 爲什麼maven-bundle-plugin(從而也是bnd),在條目「Require-Capability」中聲明它?
  4. 如果我需要將它安裝在OSGi框架上,我可以在哪裏找到它?

一些額外的信息:

  • karaf版本:4.0.7;
  • maven bundle插件: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 

休息基類:

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。你可以用feature:install scr

What is osgi.component bundle? Why is needed?

安裝它這不是一個包,但要求。基本上它說你的包需要SCR(或者其他),它知道如何通過聲明式服務處理和註冊定義在其中的組件。

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

因爲它看到你正在使用聲明式服務,並知道他們將無法正常工作,除非你有在運行時能理解它們是如何聲明,並且知道如何管理自己的生命週期的東西。如果需求不存在(我認爲早期版本的bnd就是這種情況),那麼你的包就可以毫無問題地啓動,但服務仍然沒有註冊/激活。

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

在卡拉夫它是可用的功能(請參閱您的第一個問題的答案)。在普通的OSGi運行時(Felix,Equinox,...)中,您需要手動安裝它。 It's available in Maven central

+0

該死的,我也意識到scr功能......錯誤信息完全欺騙了我。謝謝,真棒回答 – Koldar