2013-02-07 1 views
1

으로 OSGI 번들을 나열 쉘에서 액세스 테스트 :펠릭스는 액티브하지만 고골 락 셸 명령에 액세스 할 수 없습니다 (관련 의존성)이 기본 코드가 명령 scopeA을 만들기에 성공

package com.A; 

import org.apache.felix.ipojo.annotations.Component; 
import org.apache.felix.ipojo.annotations.Instantiate; 
import org.apache.felix.ipojo.annotations.Provides; 
import org.apache.felix.ipojo.annotations.Requires; 
import org.apache.felix.ipojo.annotations.ServiceProperty; 
import org.apache.felix.service.command.Descriptor; 

@Component(immediate = true) 
@Instantiate 
@Provides(specifications = Commands.class) 
public final class Commands { 

    @ServiceProperty(name = "osgi.command.scope", value = "scopeA") 
    String scope; 

    @ServiceProperty(name = "osgi.command.function", value = "{}") 
    String[] function = new String[] { 
      "test" 
    }; 

    @Descriptor("Example") 
    public void test() { 
     System.out.println("hello"); 
    } 
} 

을하지만, 내가 생성자를 추가하는 경우 그 다른 OSGI 구성 요소에 의존하기 때문에 명령에 더 이상 액세스 할 수 없으며 "도움말"에 나열되지 않습니다. 그러나 번들은 여전히 ​​활성 상태로로드 될 수 있습니다.

package com.A; 

import org.apache.felix.ipojo.annotations.Component; 
import org.apache.felix.ipojo.annotations.Instantiate; 
import org.apache.felix.ipojo.annotations.Provides; 
import org.apache.felix.ipojo.annotations.Requires; 
import org.apache.felix.ipojo.annotations.ServiceProperty; 
import org.apache.felix.service.command.Descriptor; 

import com.B; 

@Component(immediate = true) 
@Instantiate 
@Provides(specifications = Commands.class) 
public final class Commands { 

    public Commands(@Requires B b) { 
    } 

    @ServiceProperty(name = "osgi.command.scope", value = "scopeA") 
    String scope; 

    @ServiceProperty(name = "osgi.command.function", value = "{}") 
    String[] function = new String[] { 
      "test" 
    }; 

    @Descriptor("Example") 
    public void test() { 
     System.out.println("hello"); 
    } 
} 

B의 내용은 간단하다 :

import org.apache.felix.ipojo.annotations.Component; 
import org.apache.felix.ipojo.annotations.Instantiate; 
import org.apache.felix.ipojo.annotations.Provides; 

@Component(immediate = true) 
@Instantiate 
@Provides 
final class B { 
} 

명령이 더 이상 나열되어 왜 어떤 아이디어? 팁을 더 잘 디버깅 할 수 있도록 상태에 대한 자세한 정보를 찾으십니까?

+0

B 서비스가 실제로 게시 되었습니까? 'inspect cap service [id]'명령으로 확인할 수 있습니다. 여기서 [id]는 구성 요소 B를 포함하는 번들의 ID 여야합니다. –

답변

1

문제는 명령이 @Requires가 생성자가 아닌 필드에 있어야한다는 것입니다.

@Requires 
B b; 

생성자도 제거해야합니다.

이것은 gogo가 구성 요소를 호출하는 특별한 방법을 가지고 있기 때문입니다.