이 문서는 이클립스 도움말 중 Plug-ins and bundles를 번역한 것입니다.
플러그인을 지원하는 기술들은 OSGi 프레임 워크를 이용하여 구현되었다. 이러한 관점에서, 플러그인은 OSGi Bundle과 동일한 것이다. Bundle과 그에 연관된 클래스들이 클래스로딩, 관리 그리고 bundle의 수명주기에 관한 문제들을 구체화 하고 구현한다. 이후로, 프레임워크의 특정한 클래스를 언급하지 않는 이상 plug-in과 bundle을 동일한 용어로서 사용하겠다.
Plugin
Plugin 클래스는 플랫폼에서 수행되는 plug-in을 대표한다. 이 클래스는 Plug-in 전반의 관심사나 수명주기와 같은 문제를 모아두기 편리하다. Plug-in은 수명주기를 다루기 위해 특화된 start와 stop 기능을 구현할수 있다. 각각의 수명 주기메소드는 추가적인 정보를 제공할수 있는 BundleContext 객체의 레퍼런스를 가지고 있다.
생명 주기의 시작부분은 따로 논의할만한 가치가 있다. Plug-in의 manifest 파일을 접근함으로써 plug-in의 어떠한 코드도 수행하지 않아도 Plug-in을 얻을 수 있다. 일반적으로 워크밴치의 몇몇 사용자 액션들은 플러그인의 시작을 필요로 하는 연계적 이벤트를 일으킨다. 구현관점에서, plug-in은 plug-in을 구성하는 클래스들 중 하나가 로드되기 전까지 시작되지 않는다.
Start 메소드는 초기화와 등록들과 같은 코드를 넣기 좋은 곳이다. 하지만 plug-in이 다양한 상태에서 시작될 수도 있다는 것을 알아두는 것은 매우 중요하다. 객체를 데코레이트하기 위해 아이콘을 얻는 간단한 작업이 플러그인의 특정 클래스를 로드한다면, 이것이 plug-in을 시작시킨다. 강한 초기화는 플러그인의 코드와 데이터가 필요하기도 전에 로딩을 시작하는 문제를 야기할수 있다. 따라서, 플러그인 초기화 작업은 모든 대안을 면밀히 고려하는 것이 중요하다.
- Registration : 리스너를 등록하거나 백그라운드 스레드를 시작하는 등과 같은 작업은 이들이 빠르게 수행될 수만 있다면 plug-in이 시작될 때 처리하는 것도 좋다. 하지만 등록작업이 대용량의 데이터를 초기화 하거나별 연관성 없는 작업을 수행하는등의 부작용을 가지고 있다면, 이러한 작업을들 접근 부분으로 돌리는 것이 현명하다.
- Initialization : 데이터의 초기화는 데이터가 처음으로 억세스될때 까지 가능한한 미루는 것이 좋다. 이것은 대용량의 데이터가 정말 필요로되기 전까지 만들어지지 않는 것을 보장한다.
Bundle Context
생명주기 관리는 OSGi의 “bundle”이라는 용어와 플랫폼의 “plug-in”이란 용어가 만나는 곳이다. Plug-in 이 시작될 때, plug-in 정보를 얻을 수 있는 곳 (plugin.xml) 으로 부터 plug-in 에 대한 레퍼런스를 BundleContext에게 부여하게 된다. BundleContext는 시스템 안의 다른 번들/플러그인을 찾는데 쓰일 수도 있다.
시스템의 모든 Bundle의 배열을 얻기 위해 BundleContext.getBundles()을 이용할 수 있다. Bundle의 생명 주기 변화를 감지하고 대처하기 위해 BundleEvent에 대한 리스너를 부착할 수도 있다. 추가 정보를 얻기 위해, BundleContext 와 BundleEvent에 대한 javadoc을 읽어보라.
3.0 이전의 버전에서는, plug-in registry (IPluginRegistry)가 이와 유사한 기능들을 제공하기 위해서 사용되었다. 예를 들어 모든 플러그인을 얻기 위한 쿼리와 같은 것이 있다. 현재 이 registry는 deprecate 되었고, BundleContext 가 이 기능을 대신한다. Platform registry는 현재 확장과 확장점에 대해 배타적으로만 사용된다.
Bundle Activator
BundleActivator 인터페이스는 Plugin 에서 구현된 시작과 정지를 정의한다. Plugin 클래스가 이를 구현하기에 적합한 곳이기는 하지만, 개발자는 BundleActivator 인터페이스에 대한 구현을 plug-in 의 디자인에 맞추어 아무곳이나 자유롭게 할수 있다. 사실, 특별한 생명주기 관리 매커니즘이 필요없다면 plug-in 이 굳이 이를 구현해야할 필요도 없다.
Bundles
모든 plug-in들이 프레임워크가 관리하는 OSGi bundle을 기반으로 한다. Bundle은 OSGi 의 모듈화 단위이다. 본질적으로 Bundle 은 플랫폼에 설치된 단순한 파일의 집합이다. (리스스와 코드) 각각의 Bundle은 고유 자바 클래스 로더를 가지고 있고, 시작 정지 그리고 언인스톨에 대한 프로토콜들을 포함한다.이클립스 플랫폼이라는 관점에서 Bundle은 단지 구현 클래스일 뿐이다. Plug-in 개발자들은 Bundle을 확장하지 말고, Plugin 이나 BundleActivator 구현을 이용해서 Plug-in을 대표하면 된다.
- 원문: 이클립스 3.3 도움말