2012-05-17 3 views
2

우리는 두 개의 번들을 가지고 있습니다. 둘 다 동일한 제 3 자 라이브러리의 다른 버전을 내장하고 있습니다. 다른 구성으로 사용해야합니다. 불행히도 라이브러리는 시스템 속성을 통해서만 구성 할 수 있습니다.OSGi 프레임 워크가 번들을 동시에 시작할 수 있습니까?

그래서, 우리하여 Activator 클래스 다음을 수행하십시오 :

  1. 이전의 시스템 속성을 설정 해제 라이브러리,
  2. 를 초기화에 필요한 시스템 등록,
  3. 설정.

OSGi 프레임 워크가 두 번들을 동시에 시작하면 작동하지 않습니다. OSGi 프레임 워크 구현이 허용됩니까? 이 솔루션은 안전한가요? 서로 다른 번들에 대해 동일한 시스템 특성을 다른 값으로 설정하는 다른 방법이 있습니까?

(그것이 가능하다면 우리가이 번들에 대해 다른 시작 레벨을 설정하지 않도록하고 싶습니다.)

답변

3

OSGi 프레임 워크 구현이 동시에 주어진 시작 레벨 내에서 번들을 시작할 수있다. 따라서 번들을 다른 시작 레벨에 놓아 다른 시작 레벨보다 먼저 시작되도록 할 수 있습니다.

1

Felix 및 Equinox에서 번들 설치/해결/시작/중지/제거 작업은 모두 단일 스레드에서 발생합니다. 액티베이터가 동일한 스레드에서 실행되는 경우에는 확실히 기억할 수 없지만 그렇게 생각합니다.

1

라이브러리 초기화를 래핑하는 OSGi 서비스를 만드는 방법은 어떻습니까? 따라서 한 번만하면됩니다. 또는 서비스가 초기화를 동기화 할 수 있으므로 동시에 발생하지 않도록하십시오.

+0

고마워요! 작동 할 수도 있고, 서비스가 두 개의 초기화 코드를 호출해야하거나 동시 초기화를 방지하기 위해 활성기에서 일종의 세마포어 서비스를 사용할 수도 있습니다. – palacsint

0

별도의 번들로 묶어 놓아야합니까? 라이브러리로 무엇을합니까? 자바 패키지로 내보내거나 패키지로 서비스를 만드십니까? 두 개의 라이브러리를 하나의 묶음에 넣을 수 있다면, 먼저 번들을 초기화하고 어느 것을 초기화 할 것인가를 모두 제어 할 수 있습니다.

Btw Export-Package를 사용하여 번들 매니페스트에서 내 보낸 경우 번들이 RESOLVED 상태, 즉 설치되었지만 아직 시작되지 않은 경우에도 내 보낸 패키지를 다른 번들에서 사용할 수 있습니다. 그래서 Bundle Activator가 생성되고 초기화가 처리되기 전에 누군가 lib의 메소드를 호출 할 수도 있습니다.

+0

답변 해 주셔서 감사합니다! 그것들은 동일한 제 3 자의 서로 다른 버전이므로, 두 라이브러리 모두 더 많은 또는 더 적은 동일한 패키지와 클래스를 포함합니다. 따라서 번들 내에서 사용자 정의 클래스 로더를 사용하여 분리하지 않고 동일한 번들에있을 수 없습니다 (피하려고 시도 함). 패키지는 패키지가 아닌 번들에서만 사용할 수 있습니다. – palacsint