번들이 사용할 모든 라이브러리는 MANIFEST.MF 파일의 Import-Package에 기술 되어야 한다.

위의 문장은 맞는 문장일까 틀린 문장일까? 틀렸다. 예외가 있다. 바로 java.* 이하의 패키지들은 기술하지 않아도 된다. 별도의 import 없이도 사용할 수 있기 때문에 Import-Package에 굳이 명시할 필요가 없다. 하지만.. javax.*은 Import-Package에 명시해줘야 한다. javax.swing 이나 javax.awt  같은 것 들.. 또는 org.xml.sax와 같은 것들도 물론 명시적으로 선언해 줘야겠다.

그럼 bnd 설정 파일에는 어떻게 설정할까? bnd에도 Import-Package라는 헤더가 있고 필요한 모든 패키지를 import 하도록 * 로 설정해주면 된다.

Import-Package: *

이렇게.. 하지만 이미 이렇게 기본값(CoC)으로 설정되어 있어서 위의 설정을 아예 적지 않아도 알아서 저런 설정이 있는 것으로 인식해서 MANIFEST.MF 파일의 Import-Package를 만들어 준다. 좋다 좋아..

그래도 Import-Package: 헤더를 bnd  설정에서 사용해야 하는 경우가 있는데 바로. 버전을 명시할 때다. 개발 중이 아니라면 버전은 왠만해선 명시해 주는게 베스트 프랙티스라고 생각된다. 버전은 항상 범위로 설정된다. 보통 다음과 같다.

또 하나 필수 여부를 설정할 때도 Import-Package를 사용해야 한다. 기본은 필수 인데, 필수가 아니게 설정하고 싶을 때는 명시적 설정 해줘야 한다.

Import-Package: org.apache.log4j*;version="[1.2.0,1.3.0]",\
                         javax.swing*;resolution:=optional,\
                         *

위의 설정은 log4j 패키지 버전 1.2.0 이상 1.3.0 이하에 있는 클래스나 리소스를 참조하도록 설정했고, swing 패키지는 굳이 없어도 이 번들이 RESOLVE 상태가 되는데 지장이 없도록 설정했다. 마지막으로 그 외 필요한 모든 패키지들은 필수고 버전은 [0.0.0, *] 이렇게 설정되어서 어떤 버전이든 상관 없이 있기만 하면 된다.

마지막으로 Import-Package에 패키지 명을 명시적으로 선언하는 경우가 있는데, 특정 패키지를 아예 빼버리거나 무조건 추가한다. 왜일까? 특정 패키지를 빼는 경우는 번들의 코드 중에 일부는 절대로 실행이 되지 않을 꺼라는 전제가 있다면 그 부분에서 사용한 패키지를 굳이 Import 할 필요는 없을 것이다. 그리고 왜 bnd가 알아서 필요한 패키지를 찾아서 (MANIFEST.MF 에 있는) Import-Package 헤더에 추가해 줄텐데 명시적으로 등록을 하는 경우가 생길까? 그건 동적으로 로딩할 클래스 때문이다. 그런 클래스들을 담고 있는 패키지는 햇갈리게 * 를 사용하지 말고 명시적으로 전체 패키지 명을 적어주자.