2012-11-22 2 views

답변

13

OSGi 컨테이너의 런타임에는 아무 것도 수행하지 않습니다. 사실, OSGi 사양에서 언급조차되지 않았습니다 (R4를 확인했습니다).

그러나 빌드시 bnd에서 사용하기 위해 .bnd 파일에서 지정할 수 있습니다. 그렇다면, 번들에 들어갈 내용을 결정하는 데 사용할 수 있습니다. bnd는 번들을 빌드 할 때 번들에 들어가야하는 클래스를 자동으로 결정합니다. 내 보낸 패키지의 모든 클래스가 포함되며, 종속 클래스가 종속되어있는 모든 클래스도 포함됩니다. 즉, 클래스가 사용 된 것으로 보이지 않으면 클래스가 번들에 포함되지 않습니다. 그러나 Private-Package 명령을 사용하면 패키지의 내용을 번들에 포함 시키도록 bnd에 지시 할 수 있습니다 (사용하지 않는 것처럼 보일지라도). Private-Package 명령이 지정되지 않으면 bnd가 자동으로 생성합니다.

개인 패키지를

포함하는 방법은 수출-Package 헤더에 동일은, 유일한 차이는,이 패키지는 아니라는 것이다 다음과 같이

Private-Package에 대한 문서 읽기 수출. 이 헤더는 매니페스트에 복사됩니다. 패키지가 내보내기 W 개인용 패키지 헤더의 noth에 의해 선택되면,] 출이 우선합니다.

민간 패키지 = COM. *

3

사실 민간 패키지는 패키지를 수출하지 않는 것보다 더 많은 않습니다. Private-Package에 지정된 패키지가 자신의 프로젝트 내에 정의되어 있지 않고 Import-Package로 가져 오지 않은 경우 자동으로 항아리로 인라인됩니다. 따라서 이것은 비 OSGi 종속성을 포함하는 쉬운 방법입니다. 인라인하면 쉽게 클래스 패스 문제가 발생할 수 있지만주의해야합니다.

11

정적 연결이 무엇인지 알고 있다면 비공개 패키지를 이해합니다. 그렇지 않으면 계속 읽으십시오.

Private-Package는 jar 안에 있어야하지만 내 보내지 않은 패키지를 알려주는 방법입니다. 이 아니라이고 OSGi 헤더는 bnd 'instruction'입니다.

이 명령어는 JAR에 포함되어야하는 클래스 경로의 패키지 (와일드 카드 포함)를 정의합니다. bnd는 대부분의 빌드 도구처럼 일부 디렉토리가 아닌 사양에서 JAR을 채우는 고유 한 기능입니다. 그 이유는 모듈이 '설계'되지 않고 레이아웃이 신중하게 고려되지 않는 한 모듈 식 혜택을 거의 제공하지 않기 때문입니다.

일반적으로 Private-Package는 다른 번들, 즉 구현 클래스와 공유해서는 안되는 클래스를 보유하고있는 패키지를 지정합니다. 일반적으로 bnd가 사용되는 해당 프로젝트에서 온 것이지만 classpath에있는 다른 JAR에서 가져올 수 있습니다.

하나의 사용 사례는 utils이있는 라이브러리입니다. utils는 많은 관련이없는 것들에 의존하는 경향이 있기 때문에 번들에서 util 라이브러리를 돌리는 것은 일반적으로 의존성에 혼란을 야기합니다. 하나의 작은 메소드를 사용하고 갑자기 30Mb의 의존성을 드래그합니다. bnd 자체는이 모델을 aQute.lib * 패키지와 함께 많이 사용합니다.이 라이브러리의 패키지는 절대로 내보내 지 않아야합니다. 번들 크기와 '인터넷 다운로드'사이의 거래입니다.차이점은 Eclipse와 Apache Felix의 세계에서 볼 수 있습니다. Apache Felix 번들은 일반적으로 독립형이며 모든 종류의 지원과 util 번들을 요구하지는 않지만 Eclipse 번들은 많은 배관 번들을 필요로하는 경향이 있습니다. 필자는이 차이가 Eclipse의 PDE로 인해 발생했다고 생각합니다.이 PDE를 사용하면 소스 코드를 복사하지 않는 한 다른 프로젝트의 패키지를 포함 할 수 없게됩니다.

C 세계에는 정적 연결이라는 것이 있습니다. 프로그램이 링크되면 라이브러리에서 미해결 된 파일을 검색하여 대상에 추가합니다. 어느 정도 Private-Package는 같은 생각입니다. 실제로는 지정된 패키지와 패키지에 정적으로 의존하는 모든 것을 정적으로 연결하는 헤더 Conditional-Package가 있습니다 (패턴에 속하는 한).

결국 bnd는 매니페스트의 Private-Package 헤더에서 내 보낸 확장 패키지를 보여줍니다. > 개인-패키지

+0

을 < _removeheaders와 (또는 받는다는에 민간 패키지 : 모든 후, 매니페스트는 ... 내용을 설명하기 위해 당신이 작가라면

당신이 -removeheaders와 헤더를 제거 할 수 있습니다 가정된다 BND가 모든 비공개 클래스를 "개인 패키지"하지 않는 이유를 물어봐도 될까요? 프로젝트에 수업이 있다면 수업이 필요하기 때문에 그것이 수출되지 않으면 비공개가되어서는 안됩니다. 단어는 언제 export-package도 private 패키지도 패키지하지 않습니까? – Hilikus

+1

bnd는 src 디렉토리의 모든 클래스가 포함되어야한다고 가정하지 않기 때문에 비공개 패키지를 지정해야합니다. 따라서 내 보낸 패키지의 빼기를 허용하는 범위가 없습니다. 패키지의 bnd 클래스 경로에있는 패키지는 번들에 포함될 수 있습니다. ivate 또는 exported. 이렇게하면 bnd는 대부분의 빌드 환경과 달리 단일 프로젝트에서 여러 번들을 빌드 할 수 있습니다. 또한 번들이 제공하는 API 패키지를 다른 번들/jar에서 가져온 경우에도 내보낼 수 있습니다. –

관련 문제