Bundle과 Resource

PDE 2010. 10. 28. 18:33

플러그인 내부로 부터 파일을 읽어들이는 작업은, 개발자들이 자주 실수를 저지르는 부분입니다. 많은 사람들이 플러그인의 위치를 알아내어 File을 읽어 들이려고 합니다. 그러나 이러한 접근법은 많은 문제를 일으킬 수 있습니다

Bundle bundle = MyPlugin.getDefault().getBundle(); 
URL resource = bundle.getResource("/icon/test.gif");
Image image = new Image(null, resource.openStream());

뭐 물론 구글해 보면, 위와 같이 번들을 이용해서 리소스를 사용해야 한다는 것은 쉽게 알 수 있습니다. 이 문서가 설명하려는 것은 왜 그렇게 해야 하는가 하는 것입니다.

플러그인은 생각보다 역동적입니다.

우선 플러그인은 jar로 묶여 있을수도 있고 아닐 수도 있습니다. 또, 다른 플러그인들과 같은 위치에 있을수도 있고 그렇지 않을 수도 있습니다. 예를 들어 PDE를 디버깅 모드로 실행하면, Target에 지정된 이클립스의 플러그인들과 작업 중이던 워크스페이스에 있는 플러그인들이 로드됩니다.

뿐만아니라 플러그인은 여러개의 프로젝트로 구성될 수 있으며, 한 개의 jar가 아니는 여러 jar로 구성될 수도 있습니다. (Fragment Project)

게다가 리소스도 동적이에요!

다국어 지원 매커니즘을 번들이 어떻게 지원하는지 간단히 알아 봅시다.

번들에 포함된 모든 리소스는 번들을 통해서 로드됩니다. 여러분이 작성한 아이콘, html 도움말 파일, toc.xml목차등과 같이 플러그인에 담긴 모든 리소스들도 그러합니다. 번들은 리소스를 찾을 때 다음과 같은 매커니즘을 가집니다:

개발자 -> 번들: /icon/test.gif 내놔
번들 -> 이클립스: 지금 사용자 로케일이 뭐냐?
이클립스 -> 번들: ko (한글)
번들 -> 번들 :nl/ko/icon/test.gif 탐색
alt 찾은 경우
번들 -> 개발자: nl/ko/icon/test.gif
else 없는 경우
번들 -> 번들: icon/test.gif 탐색
번들 -> 개발자: icon/test.gif
end

이는 이해를 돕기 위한 그림으로, 정확히 이와 같이 동작하지는 않습니다. 하지만 이렇게 이해해도 좋습니다. 이 이외에도 번들을 통한 리소스 탐색은 몇몇 매커니즘이 있지만, 이 정도면 왜 그렇게해야 하는지는 충분히 이해가 되셨으리라 믿습니다.

Posted by 지이이이율
,