2014-04-09 5 views
1

펠릭스 실행기 클래스 (Main)에서 일부 매개 변수를 묶어야하고 this advice을 따라갔습니다. Main.java, Temp.java, TempI.javaOSGi 서비스 참조가 null입니다 (실행 프로그램에서 번들로 서비스)

번들 프로젝트를
test.bundle 패키지에 포함 : Activator.java을 나는

실행기 프로젝트
test.launcher 패키지에 포함 된 무슨 짓을
test.launcher 패키지에는 다음이 포함 TempI.java

당신은 내가 번들되지 발사기 등의 프로젝트를 번들로 TempI.java를 복사하고 패키지를 내보낼 수 없습니다 볼 수 있듯이.

활성제

ServiceReference serviceReference = context.getServiceReference(TempI.class.getName()); 
TempI service = (TempI) context.getService(serviceReference); 
System.out.println(service.testService()); 

주요

BundleContext context = felix.getBundleContext(); 
ServiceRegistration serviceRegistration=context.registerService(TempI.class.getName(), new Temp(), null); 

에서

하지만 난

java.lang.NullPointerException이 활성제

얻을 : null 일 수 없습니다 지정된 서비스 참조.

무엇이 문제인가? 다시 다른 클래스 로더? 또는 무엇을?

답변

1

시작 프로그램과 번들 둘 다 TempI 클래스의 자체 복사본이 포함되어 있다고 명시합니다. 하나는 실행 프로그램의 클래스 로더에 의해로드되고 다른 하나는 번들의 클래스 로더에 의해로드됩니다. VM 및 그에 따른 OSGi 서비스 레지스트리에 대해 이들은 서로 다른 Class 객체입니다. 따라서 번들에 알려진 TempI 클래스의 TempI 서비스를 찾으면 찾을 수 없습니다.

TempI를 묶음에 넣지 말고 패키지를 가져와야합니다. org.osgi.framework.system.packages.extra을 사용하여 패키지를 내보내는 프레임 워크를 구성해야합니다. 그런 다음 번들은 시스템 번들에서 패키지를 가져 오며 실행 프로그램에 등록 된 서비스는 번들에 표시됩니다.

+0

대단히 감사합니다! 나는 그것이 내가 찾고 있었던 것이라고 생각한다. 한 인터페이스의 두 복사본이 같은지 그 이유는 확실하지 않았습니다. 내 질문에 패키지를 설명했습니다. 시간이 있다면 http://stackoverflow.com/questions/22963720/osgi-felix-ignores-osgi-inf를 (를) 볼 수 있습니까? –