시소당
- 이클립스가 구동될 떄, 런타임이 최초로 하는 일은 플러그인을 확인하는 것.
- \eclipse\plugin 의 서브 디렉토리 안에 plugin.xml이 있는지를 찾는다.
- 그리고 이 파일을 보고 플러그인의 구성, 플러그인이 갖고 있는 확장/확장점을 확인한다.
- 이클립스 sdk의 default 어플리케이션은 org.eclipse.ui.ide.workbench 임.
1. 이클립스로 툴을 만들기
- 1.1 사용자 시나리오를 기술한다
: 사용자 관점에서 가장 좋은 흐름을 결정하는 것 , 활용하는 시나리오를 생각해보기
- 1.2 이클립스의 통합 점을 찾기
: 사용할 확장점을 찾기
- 1.3 모델로부터 사용자 인터페이스 분리하기
: 모델과 사용자 인터페이스 컴포넌트는 반드시 분리된 플러그 인으로 해야 함
(일반적으로 플러그인 id에 ui는 ui를 , 모델은 core가 들어감)
: 기동 시간을 줄일 수 있음
- 1.4 툴을 별개의 기능 그룹으로 분리하여 다른 플러그인으로 만든다
: 성능과 메모리 양을 줄이기 위해 툴을 분리하여 따로 로딩할 수 있도록 하는 것이 필수.
2. 확장과 확장점 시작하기
2.1 확장점
-<extension-point> 새로운 확장점
- 자바 패키지 이름 형태로 된 식별자(id)를 가짐
2.2 확장
-<extension> 이미 정의된 확장점에 대한 기여
3. 플러그인을 구현하는 기본 과정
3.1 플러그인이 어떻게 플랫폼에 통합되고, 각각의 확장점(우리가 기여할)을 찾을지 결정한다.
3.2 확장점의 요구사항을 결정한다.
3.3 플러그인 설명서를 선언한다.
- PDE의 플러그인 설명서 편집기를 사용하도록 함
3.4 확장에 대한 기능을 구현한다.
- 확장점의 저자는 반드시 구현해야 하는 메소드를 정의한 인터페이스 또는 추상 클래스를 제공한다.
3.5 플러그인 클래스를 정의한다.(옵션)
3.6 플러그인을 설치한다.
4. 플러그인 설명서 선언하기
- XML로 명세됨
- PLUGIN.XML 이름을 가져야 함
<plugin
id="com.ibm.jdge2e.hellowworld"
name="hellow hworld"
version="3.0.0"
vendor="the haha"
class="com.ibm.jdg2e.helloworld.HelloWorldPlugin">
- id,name,version 필수 속성
- id는 중복 방지를 위해 , 자바 패키지 이름의 규칙 이용
- class는 시동/종료와 같은 생명 주기 이벤트를 통지 받기 위한 클래스
- class는 플러그인 클래스를 지정할 수 있음 ,
이것은 Plugin 또는 그것의 서브 클래스인 AbstractPlugin을 상속한 클래스 임.
이것은 start,stop 메소드를 통해 워크벤치의 생명주기 이벤트를 통지받음.
<requires>
<import
plugin="org.eclipse.ui"
version="3.0.0'
match="compatible"
optional="false'
export="false" />
</requires>
- 의존적인 플러그인을 정의하는 곳
- 런타임 시, 이정보를 이용하여 플러그인이 어떤 jar 파일에 접근해야 되는지 결정한다
- version=major,minor,service 로 구성
- match는 매칭 알고리즘에 따라 호환 정도를 지정한다
<runtime>
<library name="runtime.jar">
<export name="*"/>
</library>
</runtime>
- 런타임 코드를 정의하는 라이브러리 지정
- 자바 가시성 수정자가 클래스의 접근에 어떻게 영향을 주는지 알 수 있음
즉, public으로 정의된 클래스가 다른 플러그인에는 보이지 않도록 설정할 수 있음
- 가장 실용적인 것은 내보내기(export)를 최소화 하는 것
( 그렇지 않으면, 플러그인같에 타이트 하게 결합하여, 유연성이 감소함)
5. 플러그인 클래스 정의
- <plugin> 태그의 class 속성 에서 플러그인 클래스를 사용함
- Plugin 또는 이것의 서브 클래스인 AbstractUIPlugin 을 상속함
- 워크벤치 생명주기 이벤트를 start,stop 메소드를 통지 받음
- 제공 메소드
.getStateLocation() : 영속적인 데이터를 쓸 수 있는 파일 데렉토리를 리턴, .metadata 서브 디렉토리를 리턴.
.openStream()
.getPluginPreferences()
- AbstractUIPlugin 제공 메소드
.getImageRegisty()
.getDialogSettings()
.getWorkbench()
- 주어진 플랫폼 구성에서 잘 동작할 수 있도록 런타임에 플러그인의 서브 디렉토리는 읽기전용으로 다루어야 함
- 워크 스페이스의 .metadata\.plugins 서브 디렉토리 아래에서 플러그인관련 파일을 읽고 쓰기 위해 작업 디렉토리를 사용함
- Platform.getBundle("pluginID").getEntry("/") : 플러그인이 설치된 위치를 검색할 수 있음
6. 플러그인 설치
6.1 업데이트 관리자 없이 플러그인 설치하기
[플러그인 설치 구조]
- plugins 라는 예약된 서브 디렉토리
- 그 아래 플러그인 아이디 + 버전 의 이름의 디렉토리 존재
- 그 디렉토리 아래에는 플러그인 설명서, plugin.xml 포함
- JAR,HTML,이미지,프로퍼티 파일을 포함한 모든 플러그인 리소스 는
플러그 인 설치 디렉토리 또는 상대적인 위치에 저장해야 함
- Target platform 설정
- Run-time Workbench 로 실행
- export> deployable plugins and fragments 옵션 이용해서 새로운 서브 디렉토리에 복사하고, 이클립스의 테스트 설치본을 다시 시작함
6.2 업데이트 관리자 피처로서 플러그인을 배달하기
- feature.xml 정의 , features 이름의 서브 디렉토리 존재
[출처] 플러그인 개발 시작|작성자 2skfro