2014-11-07 4 views
0

maven felix 플러그인을 사용하여 OSGi 번들을 만들었지 만, project1과 project2에 "com.example"패키지가 있다고 가정합니다. 또한 project2는 project1에 종속됩니다.Maven OSGi 번들

project2에서 패키지를 내 보내면 project1의 project2 의 코드를 갖게됩니다. 이것은 저에게 정말로 이상한 행동입니다. OSGi가 어떻게 든 그것을 필요로하기 때문에 그러한 행동을 가능하게했다고 생각할 수있는 유일한 이유는 무엇입니까? (나는 이미 http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html을 보았지만 이것을 끌 수있는 방법을 찾지 못하는 것 같습니다.)

두 개의 jar (A와 B)가 같은 패키지이지만 다른 클래스를 내보내고 세 번째 jar 그 패키지에 대한 의존성은 C가 A & B를 런타임에 모두 볼 수 있다고 가정합니다. 또는 OSGi는 항아리마다 다른 패키지가 필요합니까?

OSGi가이를 강제하지 않으면 어떻게이 "기능"을 끌 수 있습니까?

OSGi 인 경우, 그 이유는 무엇입니까?

UPDATE는

기독교 제공하는 대답은 다른 단지에 다른 패키지 OSGi의 요구 사항을 지 웁니다. 그러나 나는 아직도 내가 포함 된 "API"항아리가 펠릭스에 문제가 :

  • com.example.api : 실제 인터페이스
  • com.example : 팩토리 클래스, 유틸리티 클래스 ,. ..

그리고이 구현 패키지 :

  • com.example.impl을
,

이제 felix로 구현 패키지를 빌드하고 "com.example.impl"을 내 보내면 실제로 "com.example.impl"의 모든 내용을 갖지만 어떤 이유로 든 "com.example"의 모든 클래스를 포함합니다 "(.api에있는 사람들이 아닙니다.) 내가 시도한 설정의 어떤 조합도 펠릭스가 어떤 이유로 "기본"패키지를 추가하는 것을 막지 못할 것입니다 ...

기본적으로 "impl"프로젝트의 결과 jar에 실제로 com.example 클래스가 있습니다. MyFactory는 api 패키지에 있습니다. 이것을 어떻게 막을 수 있습니까?

답변

2

OSGi는 두 프로젝트에서 동일한 패키지를 사용하도록 요구하지 않습니다. 실제로 서로 다른 내용을 가진 두 묶음에 같은 패키지/버전 조합을 사용하지 않아야합니다.

OSGi에서 번들이 설치되어 해결 될 때 배선이 발생합니다. 이 단계에서 프레임 워크는 각 Import-Package 문을 이름 및 버전 범위와 일치하는 내 보낸 패키지와 일치시킵니다. OSGi에서는 여러 번들이 동일한 패키지를 내보내더라도 각 번들마다 하나의 패키지 만 연결됩니다. 이것은 표준 Java와는 다른데, 패키지가있는 모든 jar의 클래스를 혼합하여 예측할 수없는 결과를 얻을 수 있습니다.

OSGi에는 여러 번들에서 동일한 패키지가있는 패턴이 하나 있습니다. OSGi의 공식 API에 많이 사용됩니다. API를 구현할 때 API 패키지를 포함하고 API 패키지의 Export-Package 문뿐만 아니라 Import-Package를가집니다.이를 통해 구현 번들을 추가 API 번들없이 설치할 수 있습니다. 프레임 워크가 API 패키지 중 하나를 선택하고 다른 모든 API 패키지를 동일한 패키지에 연결하기 때문에 API가 포함 된 둘 이상의 번들이 있더라도 잘 작동합니다. 그래서 그들은 모두 같은 종류의 수업을보고 갈등이 없습니다.

당신도 자신의 응용 프로그램에 대해이 작업을 수행 할 수 있지만 한 묶음에 API 패키지 만 있고 다른 모든 묶음에는 API 패키지를 가져 오는 것이 더 일반적입니다.

당신은 업데이트 된 질문에 대답하기 위해 아파치 펠릭스 OSGi Frequently Asked Questions


에서 몇 가지 정보를 찾을 수 있습니다. com.example.api 패키지 만 내보내는 것 같습니다. 따라서 maven 번들 플러그인은 Import-Package 문을 사용하여이 패키지를 참조 할 수 있음을 알고 있습니다. com.example이 반출되지 않았기 때문에 플러그인은 Import-Package가 작동하지 않는다는 것을 안다. 따라서 클래스를 포함합니다.

그래서 다른 번들에서 필요로하는 모든 패키지를 내 보내야합니다. Btw. 일반적으로 OSGi에서 impl 패키지를 내 보내지 않습니다. 오히려 서비스의 의미를 숨 깁니다. 서비스 인터페이스는 API에 배치됩니다. 그런 다음 impl 번들은 인터페이스를 구현하고 impl을 OSGi 서비스로 내 보냅니다. 따라서 다른 번들은 인터페이스로 서비스를 바인딩 할 수 있으며 전체 impl은 비공개로 유지 될 수 있습니다.

+0

의견을 보내 주셔서 감사합니다. 이미 상당히 많은 부분이 정리되어 있지만, 원래의 질문에 계속 좌절감을주는 좀 더 구체적인 사용법을 추가했습니다. – nablex