2016-11-24 15 views
1

나는 맞춤형 서비스에서 REST API 및 호출이 포함 된 OSGi WAB를 Karaf로 개발하려고합니다. 그러나 이상한 이유로 인해 OSGi 프레임 워크는 만족스럽지 못한 기능에 대해 불평합니다 (osgi.component).해결되지 않은 요구 사항 : osgi.component

나는을 알고 싶습니다 :

  1. 가 어떻게이 문제를 해결할 수 있습니까?
  2. osgi.component 번들은 무엇입니까? 왜 필요한가?
  3. 왜 maven-bundle-plugin (bnd)이 "Require-Capability"항목에 선언되어 있습니까?
  4. OSGi 프레임 워크에 설치해야하는 경우 어디에서 찾을 수 있습니까?

몇 가지 추가 정보 :

  • karaf 버전 : 4.0.7;
  • maven 번들 플러그인 : 3.2.0;
  • OS : 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()); 
         } 
    
        } 
    
    } 
    
    ,691,363

일부 코드는 추가 정보를 제공합니다210

모든 종류의 답장을 보내 주셔서 감사합니다.

+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