먼저 Required-Bundle이 뭔지 알아야겠다. Import-Package를 이해했으면 이건 뭐 아주 간단하다.

1. Resolved 상태가 되기 위한 조건

Import-Package 헤더에 명시한 패키지들이 어떤 번들들에 의해서 Export-Package 헤더이 설정 되어 있으면 해당 번들은  RESOLVED가 될 것이다.(물론 필수 였다는 가정하에.)

Required-Bunlde은 번들 단위로 바꿔서 생각하면 된다. 이 번들의 Required-Bundle에 설정한 번들이 RESOLVED 상태가 되어야 이 번들도 RESOLVED 상태가 될 수 있다.

2. Import 하는 패키지의 정적이냐 동적이냐

Import-Package로 패키지를 참조하면, 해당 패키지들만 참조할 수 있다. Required-Bundle로 참조하면 거기에 설정한 번들이 Export-Package에 명시한 모든 패키지들을 Import 한다. 따라서, Required-Bundle에 설정한 번들이 공개하는 패키지의 설정이 바뀌면 이 번들이 가져오겠다고 선언하는 패키지들도 달라지는 것이다.

자 그럼 이제 이 설정을 비추하는 이유를 살펴보자.

1. 위에서도 언급했듯이 Import 대상이 되는 패키지가 변한다. 그게 문제가 될 수 있다. 만약 이 번들이 꼭 필요로 하는 패키지를 저 번들이 가지고 있었는데, 저 번들이 갑자기 그 패키지를 Export-Package 목록에서 빼버렸다. 그래도 저 번들은 RESOLVED가 되었고, 그랬기 때문에 이 번들도 따라서 RESOLVED가 되었다. 하지만 이 번들이 동작하다가 ClassNotFoundException이나 NoClassDefinitionError를 발생시킬 여지가 다분하다.

2. 만약 Required-Bundle에 설정한 번들의 기능이 너무 많아져서 분리해야 된다고 생각해보자. 그럼 Requied-Bundle에 이 번들을 설정했던 모든 (소비자 격인) 번들들의 설정을 전부 고쳐줘야 한다. 얼마나 힘들고 고된 작업인가... 그냥 Import-Package를 썼었다면, 기능이 많아져서 분리를 해도 그냥 Export-Package도 같이 분리해서 가지고 가기만 하면 된다. 소비자 입장에선 아무것도 바꾸지 않아도 된다.

3. 낭비다. 필요 없이 Import 하는 패키지가 생길 것이다.

Required-Bundle 은 OSGi R4에 추가된 기능인데 Eclipse의 영향이 컸다고 한다.