2009-10-07 12 views
1

코드 내에서 번들 가져 오기에 패키지를 추가하려면 어떻게합니까? 리플렉션에 의존하고 다른 패키지가 필요한 라이브러리를 사용하고 개발할 각 패키지에 MANIFEST.MF를 수동으로 추가 할 필요가 없기 때문에 필요합니다.OSGi : 번들에 프로그래밍 방식으로 가져 오기 추가

+0

당신은 것 같다 하나가은 OSGi에서 기대하고 모든 것을 반대 OSGi에 관한 한 큰 그림의 한 부분을 빠뜨렸다. 의존성이 명시 적으로 선언되었다. – SteveD

답변

3

수 없습니다. 가져 오기 - 패키지는 해결 단계에서 평가됩니다. (단계가 설치됨 -> 해결됨 -> 활성).

번들이 활성 일 때 코드가 실행되므로 가져 오기 패키지를 추가하기에 너무 늦습니다.

당신은 2 가지 할 수 있습니다 : 당신은 누구의 해상도 실행 시간을 연기 할 수있는 패키지를 지정하는

  • 를 사용하여 동적 importPackage를 속성을 사용하는거야

    • importPackage를 패키지를
  • +0

    Dynamic-ImportPackage 사용은 OSGi가 수정하려고하는 플랫 클래스 패스 문제보다 약간 낫기 때문에 사용하지 않는 것이 좋습니다. – SteveD

    0

    Filippo의 솔루션 외에도 종속성을 뒤집을 수 있습니다. F.i. 다른 번들을 호출하고 검사하는 대신 번들이 그렇게하도록 할 수 있습니다. 또 다른 방법은 번들 추적기를 사용하고 추적 된 번들의 ClassLoader를 가져 오는 것입니다. 이 클래스 로더를 사용하면 "번들로"작동 할 수 있으므로 Import-Package 절이 더 이상 필요하지 않습니다.

    OSGi를 사용하기 시작했을 때, 이것은 내가 처음 생각한 요구 사항 중 하나였습니다. 시간이 지남에 따라 거의 모든 경우에 더 깨끗하고 일관된 솔루션이 있다는 것을 깨달았습니다. 이 의존성이 정말로 필요하다면 생각해보십시오. 일반 솔루션을 만들기 위해 그것을 반전 또는 추상화 할 수있는 방법이 없습니까?

    아무 것도 도움이되지 않는다면, 코어 번들과 함께 조각을 호스트로 만들어 필요한 가져 오기를 제공 할 수 있습니다. BundleContext는 스트림에서 번들을로드하는 메소드를 제공합니다. 업데이트 된 ClassLoader (번들을 다시 시작하는 것을 의미)를 얻기 위해 호스트 번들에서 refreshpackages (PackageAdmin 서비스를 통해)를 업데이트하고 호출해야합니다. 그러나 결국에는 모든 패키지에 액세스 할 수 있습니다.

    참고로 import 문을 조정하여 호스트 번들을 조작 한 다음 업데이트하는 것은 좋지 않습니다. 그러면 번들이 비 결정적으로 렌더링되고 서명 된 번들에서는 작동하지 않습니다. 또한,이 (시간이 지남에 ... 당신은뿐만 아니라 어떤 점에서 수입을 축소 할 필요가 성장하는 번들을 상상!)

    건배, 미르코

    +0

    내가 사용하는 타사 라이브러리 중 일부는 자체 클래스를 찾기 위해 내 번들의 클래스 로더를 사용합니다. 이것은 OSGi가 아니라 WAR 환경에서 잘 작동합니다. 내가 결국 패키지를 내 번들에 추가해야 할 필요가있다. 점점 더 많은 번들을 개발하면서, 이것은 지루해진다. – IttayD

    +0

    좋아요, 그래서 다음과 같습니다 : 번들 (3rdP) -> 번들 (me) -> 번들 (3rdP) 로깅과 비슷합니다. 3rdP는 HelloWorld와 특정 LogFormatter를 제공하는 번들입니다. 여기서 "me"는 로깅 API를 제공합니다. HelloWorld는 Logging API를 호출합니다.이 API는 다시 로그 출력을 인쇄하는 포맷터가 필요합니다. 이 문제를 해결할 수있는 몇 가지 방법이 있습니다 : - 필요한 클래스 로더 ("me"로)에 대한 매개 변수 제공 - ext로 룩업 서비스 제공.기여자 - ClassTracker (모든 번들을 추적하고로드 할 특정 클래스를 찾을 위치를 추적하십시오 - 구현하기 힘든 클래스, 버전 관리가 문제입니다) –

    관련 문제