2013-08-12 2 views
0

OSGi에서 시스템을 다시 시작하더라도 번들 배선을 유지할 수 있습니까? 예전에 사용 가능한 새 버전이 더 많이 제공 되더라도? 요점은 무언가가 작동하면 이전 번들을 새로운 종속성에 연결하여 위험에 노출시키지 않으려한다는 것입니다. 바꾸어 말하면, 가능한 한 많이 업데이트를 격리하려고합니다. 이전 번들은 이미 유선 종속성을 충족시키기 위해 사용되기 때문에 구성 요소의 업데이트가 다른 모든 구성 요소에 영향을 미치지 않습니다.번들 업데이트를 이전 번들에 자동으로 적용하지 마십시오.

As 예를 들어, A가 범위 [1.0.0, 2.0.0]의 B에 의존한다고 가정 해 봅시다. 우리는 B의 버전 1.0.0을 배포합니다. 그래서 A는 B_1.0.0에 연결됩니다.
이제 B가 범위 [1.0.1, 2.0.0]에 따라 달라 지므로 논리 변경에 따라 달라지는 번들 C를 만듭니다. B_1.0.1을 배포합니다. 이제 우리가 시스템을 다시 시작하면 C와 A는 1.0.1에 연결될 것입니다. 왜냐하면 양쪽 모두의 의존성 범위에 있기 때문이며 이론상 1.0.0보다 더 나은 A와 일치합니다. OSGi에게 이렇게하지 말고 배선을 가능한 한 길게 유지할 수있는 방법이 있습니까 (예 : 이전 번들이 실제로 제거 될 때까지 범위에서 가장 높은 버전으로 진행하는 것이 좋습니다)

현재 우리는 범위를 허용하지 않으므로 의존성은 [1.0.0, 1.0.0]과 같습니다. 이것은 우리가 원하는 업데이트를 제공하지만 기본적으로 모듈성을 잃어 버리는 대가를 치르게합니다. 의존성을 업데이트해야합니다. 종속물의 코드가 변경되지 않아도 종속성을 업데이트해야합니다. 나는 범위를 허용하지 않는 거대한 안티 패턴이라고 생각합니다. 그래서 범위를 가지고 더 나은 대안을 제안하려고합니다. 그러나 그것은 우리가 필요로하는 업데이트 격리를 제공 할 것이며, 첫 번째 아이디어는 세션 전체에서 재배 선을 허용하지 않는 것입니다.

If 중요한 것은 OSGi 서비스를 사용하지 않는 것입니다. 그것들은 모두 일반 번들입니다.

답변

2

첫 번째 단락의 질문에 대한 대답은 간단합니다. 예, 이것은 OSGi의 기본 동작입니다. 번들 업데이트 또는 패키지 새로 고침 작업을 수행하지 않고 프레임 워크를 중지했다가 다시 시작하면 다음에 시작할 때 연결 상태가 동일하게됩니다.

그러나 두 번째 단락에서 내용을 변경했습니다. 이제 서로 다른 버전의 B를 2 번 내보내고 A와 C는 모두 동일하지만 일치하지 않음은 이지만 겹치지는 범위입니다. 여기서 중첩이 핵심입니다. OSGi는 항상 동일한 패키지의 독립적 인 내보내기 수를 최소화하려고하므로 범위가 겹치는 두 번들을 가져 오는 경우 프레임 워크는 두 버전이 아닌 동일한 버전으로 연결하려고 시도합니다. 여기에 겹치는 부분은 1.0.1이므로 A와 C 모두 1.0.0으로 연결됩니다.

을 변경하지 마십시오. 번들 A가 실제로 [1.0.0, 2.0.0) 범위와 호환되는 경우 버전 1.0.1에 연결하는 것에 반대하는 이유는 무엇입니까 ?? 반면에 A가 1.0.0이 아닌 1.0.0 버전과 실제로 호환되는 경우 매우 좁은 범위 (예 : [1.0.0, 1.0.1))를 지정해야합니다.

마지막으로 ... 마지막 단락은 나를 슬프게합니다. 일반 번들은 서비스를 사용합니다!

+0

닐 (Neil)은 그들이 동일하지 않은 범위라는 사실을 잊어 버립니다. A와 C 모두 B에 범위 [1.0.0, 2.0.0]로 의존한다고 가정 해보십시오. 그러나 A가 출시되었을 때 B_1.0.0 만 존재했기 때문에 A는 B_1.0.0에 연결됩니다. 그런 다음 C가 B_1.0.1과 함께 출시됩니다. A-> B_1.0.0 배선을 C-> B_1.0.1과 같이 보관하기를 원합니다. 시스템에서 A-> B_1.0.1을 연결하는 것을 원하지 않습니다. 범위를 허용하지 않고 이것을 잠글 수있는 방법이 있습니까? 나는 의미 론적 버전 관리에 기반하여 1.0.1을 사용하는 것이 문제가 아니어야한다는 데 동의하지만, 뭔가 새로운 것으로 작동하는 무언가를 변경함으로써 위험> 0을 인정해야합니다. – Hilikus

+0

오, 그리고 저도 더 슬프게 만듭니다. 매일 같이 일해라. – Hilikus

+0

C가 나중에 추가되면'[1.0.0, 2.0)'을 선택하면 1.0.0 버전이 이미 A에 연결되어 있기 때문에 1.0.0 버전을 선택해야합니다. 동일한 경험적 방법이 적용됩니다. OSGi는 동일한 패키지의 내보내기 수를 최소화하려고합니다. 또한 패키지 새로 고침 작업을 수행 할 때까지 A를 다시 연결하지 않습니다. 따라서 C는 A와 동일한 배선을 1.0.0으로 사용합니다. –

관련 문제