OSGI 번들을 작성하려고하는데 다음과 같은 문제가 발생합니다.종속성에 필요한 것과 다른 버전의 패키지를 사용하려면 어떻게해야합니까?
내 플러그인을 "P"라고 부릅시다. 이제, P는 다른 플러그인 "D"에 의존합니다. 그것으로 export 된 인터페이스를 사용할 필요가 있습니다. 동시에, 나는 플러그인 P에서 라이브러리 "L"의 버전 2를 사용하고 싶다. 그러나 D는 라이브러리의 버전 1에 의존한다는 점을 제외하면 L도 사용한다. 버전 1은 컨테이너에 의해 제공됩니다.
사실 L의 클래스와 인터페이스는 D API의 어느 곳에서도 표시되지 않습니다 (적어도 사용하고있는 API는 없습니다). 즉, P와 D는 각각 L 클래스를 내부적으로 사용하지만 절대 교환하지 않습니다.
내가 알 수있는 한, Lv2의 사본을 제공하는 한 각자가 서로 다른 버전의 L을 사용하는 것이 안전해야합니다. 그러나, 나는 내 인생을 위해 그것이 작동하게하는 방법을 이해할 수 없다.
내가 가지고있는 것 : P의 pom.xml에는 D에 대한 "종속"종속성과 "컴파일"종속성 L이 있습니다. D에 대한 소스가 없지만 OSGI에 가져 오기 - L; version = [1,2] 용 패키지.
내가 시도한 번들 지침 조합이이 작업을 관리 할 수 없었습니다. 내가하는 것이 무엇이든, D가 v2를 가져 와서 D에서 BundleException이 발생하거나 P의 클래스가 L의 v1을 얻습니다. 그러면 코드를 실행할 때 NoClassDefFoundError가 발생합니다. (누락 된 클래스가 내 코드에 의해 명시 적으로 사용되는 것은 아니며 L의 다른 패키지에있는 다른 클래스의 정적 멤버로 사용되었습니다.)
아이디어가 있으십니까?
나는 당신의 대답을 오해하는지 아니면 내 질문을 오해하는지 잘 모르겠다. D는 * 이미 * OSGI 플러그인이며 구성 요소 가져 오기를 통해 가져 오는 공용 구성 요소가 있습니다. D를 묶으려고하지 않고 패키지를 가져옵니다. L *을 번들로 만들려고 노력하고 있는데, D가 다른 버전의 L을 가져 오기 때문에 내가 할 수 없다고 말할 수 있습니다. – bogdanb
명확성을 위해 P는 제 플러그인이고 D는 Greenhopper이고 L은 구아바이고 OSGI 컨텍스트는 JIRA입니다. JIRA 자체는 Guho v11 (또는 버전에 따라 10 개)을 제공하며, Greenhopper는이를 가져옵니다 ([10,11] 버전 경계 포함). 구아바 v18을 사용하려고합니다. 내 플러그인과 Greenhopper 사이의 인터페이스를 통해 구아바 객체가 교환되지 않더라도 작동하지 않습니다. – bogdanb
@bogdanb L은 그 자체로도 플러그인입니까? 나는 당신이 L을 묶으려고한다는 것을 이해하지만, 원래의 설명에서, D가 L의 OSGi import를하고있는 것처럼 들린다. –