- 참고
- 이클립스란 무엇인가?
- 문제 해결을 돕기 위한 자바 기반의 도구
- 도구의 기반구조를 개발하는 사람들의 오픈 소스 커뮤니티
- 이클립스 자바 IDE는 커뮤니티의 결과물
- Plug in(이클립스), Bundle(OSGi)
- 기능의 기본단위, 이클립스 안에 있는 모든 것은 플러그인이다.
- 컨텐츠의 구룹화와 전달, 코드 관리를 위한 메커니즘.
- 플러그인 = 번들, 둘은 같다. 본질적으로나, 기능에 있어서 차이가 없다.
- 프로덕트 > (RCP 어플리케이션 == 플러그인의 집합 + 플러그인을 실행하는 프레임워크) + (브랜딩, 스플래시 화면, 아이콘, 화경설정, 구성파일)
UI(액션 시트, 편집기, 퍼스펙티브, 뷰, 워크벤치)
이퀴낙스(확장, 애플리케이션, Product) | JFace (Action, viewer, 마법사, 데이터 바인딩) |
표준 OSGi (번들) | SWT (위젯) |
자바 런타임 환경(JRE:Java Runtime Environment) 위에 RCP가 있는 구조
rcp는 언제든지 어플리케이션을추가할 수 있음. (이런점은 OS나 JRE자체와 비슷함)
+ 파운데이션 자바 라이브러리 (JVM+JCL 파운데이션) : 임베디드나 작은 환경을 의미하는 J2NE 표준 클래스 집합. 파운데이션 지원 API만 사용하여 개발한다면 J2SE JRE 대신 비교적 작은 용량의 JRE에 탑제된다.
- 플러그인
- manifest에서 플러그인 자체와 의존관계가 있는 플러그인을 설명, 실행 명세
- plugin.xml 플러그인이 기여하는 확장과 확장점 정보, 확장 명세
27장.OSGi
- 이퀴낙스와 이클립스의 근간이 되는 OSGi의 개념과 요소알기
- 애플리케이션이 시작해서 끝날때까지 수행하는 일
- 플러그인과 프래그먼트 집합을 설계할 때 알면 유용
- 문제가 발생해서 밤을 새야 할 때 필요한 정보임...
- 'OSGi and Eclipes',http://equinoxosgi.org
- (?) 프레임워크 - 명세를 구현해서 다양한 범위의 플랫폼과 환경에서 실행되도록 정해진 사항
- 이클립스 플러그인 컴포넌트 모델은 OSGi 프레임워크의 이퀴낙스(Equinox) 구현을 기반으로 함.
- OSGi가 하는일, 역할?
- 번들이나, 컴포넌트의 정의, 조합, 실행에 대한 프레임워크를 형성함.
- 설치된 플러그인이 서로 협력하고 상호작용하게 잘 엮어주는 역할.
- 기대? 장점? 의존관계와 클래스경로를 관리하기 때문에 번들간의 상호작용을 상세하고 명시적으로 제어가능하고 유연하고 쉽게 조합되는 시스템이 가능해짐.
- OSGi 프레임워크
- JRE와 동일한 수준의 기반기능을 제공한다.
- 각각의 번들이 가진 클래스 로더를 나눠 번들과 번들의 코드를 관리함, 번들의 클래스 경로는 내역서안에 지정된 의존관계에 따라 동적으로 구성.
- 이퀴낙스 (Equinox)
- java 의 main처럼 실행시키는 부분
- OSGi 시스템은 무엇을 해줘야할지 지정해줘야함,
- 이퀴낙스가 시작되고 나면, 지정된 애플리케이션을 찾아서 실행함. (애플리케이션은 확장을 통해 정의된다)
- 애플리케이션이 종료되면 이클립스도 종료됨
- 애플리케이션 보다 상위 수준의 개념
- 여러 정보들을 하나의 개념으로 묶어서 사용자가 인식하고 실행할 수 잇는 단위 (ex. 브랜딩, 스플래시 화면, 아이콘, 환경설정, 구성파일등)
- 확장점과 확장
- 모든것은 선언적이며, 최대한 늦게 동작한다. 레지스트리 메커니즘과 이클립스 전체의 핵심적인 특징이다.
- 애플리케이션
- Product 제품
- 확장 레지스트리
- OSGi와 이클립스 런타임
- 다른 번들은 시스템에게 Bundle객체를 요청해서 번들의 상태를 질의
- getEntries()로 파일을 찾음
- start(), stop()을 사용해서 Bundle객체 제어
- Bundle객체는 필수, 정의 및 관리 작업은 이미 구현되어있음. (plugin객체는 선택사항)
- Bundle
- Platform과 BundleContext의 메소드를 이용해서 bundle을 접근 할 수 있다.
- 다른 번들은 시스템에게 Bundle객체를 요청해서 번들의 상태를 질의
- BundleContext
- 번들->시스템 한테 요청
- Ex) 다른 번들을 설치하거나, 서비스를 등록하는일을 시스템에게 요청 -> 시스템은 번들의 ID를 알아내서 권한을 확인하거나, 서비스에게 일을 맡김
- 시스템 내부에서 생성하고 관리
- 단순한 전달, 필요한 사항을 물어보는데 사용.
- BundleActivator
- 시작과 종료이벤트를 알아내서 필요한 작업을 수행
- 이클립스 런타임OSGi다른 구성요소에 대한 정체성플러그인은 Plugin객체로 전달 및 기능 제공Bundle시스템에 대한 정체성Plugin 객체를 생성해서 시스템 상태를 보존 및 표현BundleContext생명주기 핸들러Plugin 객체는 Start, Stop메소드를 구현해서 초기화,마무리 작업 수행BundleActivator간편한 접근점Plugin 클래스는 플러그인 동작에 대한 내외부 접근가능한 메소드제공ex)ResourcePlugin.getWorkspace() 현재 작업공간을 반환함
- 디렉토리번들구조 / 표준JAR형태번들구조
- 네이티브 파일 시스템에서 직접 존재해야하는 파일을 포함
- 공유 라이브러리, 프로그램 실행 파일, jar 등을 포함
- 플러그인 용량이 크다면 디렉토리로 패키지화 추천
- 작은파일, 압축 효율이 좋은 파일, 플러그인 서명 및 보안 검증을 지원
- 효율성 낮을 수 잇음, 사본을 꺼내는 작업은 디스크용량을 2배로 필요하고 시간도 오래걸림.
- 디렉토리
- JAR
- 프래그먼트
-
- 특정 플랫폼 전용 컨텐츠
- 여러 플랫폼 - 부피 커짐, 지저분, 관리 어려움
-
- 특정 로케일 전용 컨텐츠
- 로케일 나누워서 배포
- 프래그먼트 내역서 MANIFEST.MF
- 프래그먼트에는 자체 플러그인 생명주기가 없고, 연관된 플러그인의 생명주기에 의존한다.
- BundleActivator 속성이 필요 없음. 프래그먼트가 스스로 종속관계를 선언하지 않는다.
- 독립형 플러그인이라기 보다 런타임시 자신의 컨텐츠를 호스트 플러그인의 컨텐트에 통합.
- 플러그인을 하나로 패키징할 수 없을 때 사용
- 프래그먼트는 첨가물이다.
- 사전요구사항일 수 없다.
- API를 추가할 의도로 사용하지 않는다.
- 내보낼 요소의 추가가 가능하다........?
- 프래그먼트(이클립스 플러그인 책 16장 참고)
- 플러그인과의 차이
-
- 버전 번호 규칙
- major
- 하위 호환이 보장되지 않는 큰 변화
- minor
- api 변경
- service
- 사소한 구현, 버그수정
- qualifier
- osgi 에서는 인식하지 않는 수식자, 문자열 비교를 통해서 비교함
- 플러그인 ID + 버전조합 1.2.10.
- major.minor.service.qualifier
- major
- 서비스
- osgi 의 아키텍처의 핵심요소
- 하나의 번들을 서비스 제공자로 등록, 다른번들이 그 서비스를 찾고 사용하게 됨
- 매우 강력하고 유연하다
- 이클립스 rcp는 서비스를 많이 사용하지 않음, 하지만 앞으로 사용빈도 많아질듯
- 번들 생명 주기 == plugin의 생명주기
- 번들이 배치되면, 디스크에 올라감 -> 물리적으로 상용가능한 상태
- 번들은 서버에 배치되서 실행중인 컴퓨터에 실존하지 않을 수 있음.
- 번들에서 어떤일이 언제 왜 발생하는지, 무엇을 할 수 있는지 알아보자
- deployed
- deployed상태를 시스템에 명시적으로 표현하진 않음
- installed
- 실행 요소로서 osgi프레임워크에 배치되고 제출된 번들.
- 아직 클래스 로더를 갖지 않음.
- 확장 레지스트리 추가 안된 상태 (이퀴낙스 확장 레지스트리가 실행중이라면, 번들이 갖는 레지스트리 컨트리뷰션은 확장 레지스트리에 추가되지 않는 상태)
- resolved
- 번들은 설치되고 다른 번들로부터 사전요구사항을 만족한 상태이다.
- 이퀴낙스 확장레지스트리 번들이 활성화 됬다면, 번들의 커트리뷰션은 확장 레지스트리에 추가된다
- 클래스 로더를 가지며 정상적으로 동작한다.
- 시작되지 않고 해석된 상태에 머물르기도 한다.
- Starting
- plug-in 이 시작할 때,
- start(BundleContext) 메소드를 실행하고 있는 상태
- starting 상태를 거쳐서 Active상태로 전이됨
- Active
- After a successful start, it becomes ACTIVE.
- 클래스 로더를 가지며, 모든 동작 수행이 가능하다.
- Stopping
- stop(BundleContext)메소드가 실행되는 상태
- 활성 번들은 Stopping 상태를 거쳐 resolved상태로 전이 함
- Uninstalled
- 설치되었다가 제거된 번들, 설치되기 상태이전의 번들과 동일.
- 배치된 상태와 동일, 다시 설치가능한 상태 (= 여전히 시스템에 남아있으며, 의도하지 않는 방향으로 동작할 가능성이 있음)
- BundleActivator
- osgi프레임워크가 Activator 인스턴스 생성 -> 번들 시작/중지 start(BundleContext),stop(BundleContext)
- 번들의 상태전이를 지원하기 위한 클래스
- plugin class 는 BundleActivator 인터페이스를 구현
- BundleActivator 메소드는 번들 상태 변경시에 실행하는 스레드에서 호출 됨으로 start(BundleContext),stop(BundleContext)는 적절하게 작성해야함.
- Activator 주의사항
- 필요할 때 캐시와 자료구조를 초기화하는 방법을 사용하자
- 이클립스의 기본사상 중 하나는 '게으름이 좋다' 때가 되기 전에는 코드를 실행하지 마라'
- start(BundleContext),stop(BundleContext)은 구현하는 경우가 드물다
- 활성화 시간이 너무 길면 애플리케이션이 느리다고 느낌?
- Activator 사용
- 서비스나 리스너 등록
- start(BundleContext) 에 리스너를 등록하고, stop(BundleContext)은 리스너를 삭제한다. 형식에 잘 맞고 작고 빠르다.
- 공유 메커니즘 시작
- start - 소켓 결고, 포트감시 , stop - 소켓 닫고, 자원 반환
- 웹 컨테이너 번들
- 청소
- 번들이 중지될 때, 할당받은 공유 자원을 반환
- 모든 청소가 완료 될 때 까지 stop(BundleContext)메소드가 완료 되지 않게 한다.
- 장점, 강점, 이래서 씁니다^^
- 서비스나 리스너 등록
- 활성화 앞당기기
- org.eclipse.ui.startup 정의해서 사용.
- 워크벤치를 초기화하고 실행하고 나면 startup 확장이 실행됨 -> 확장마다 클래스 로드하고 인스턴스 생성, 생성된 객체의 earlyStartup() 호출
- 임의의 순서대로 실행되며, 확장을 실행하는 데 사용한 스레드에 대한 어떤 가정도 할 수 없음.
- Plugin, BundleActivator가 IStartup을 구현하지 마라!
- IDE 환경설정 > general>startup and Shutdown
- 번들을 실행할 때 작업을 하면 안좋다고하지만 필요할 때가 있음.
- ex) 웹 브라우저를 통해 외부 접근하는 어플리케이션 - tcp포트 열고, http요청 받기 등 수행필요함
- 이른 활성화 확장
- osgi.bundle
- 이클립스를 실행할 때 자동으로 설치하고 선택적으로 시작하는 번들을 콤마로 구분해놓은 목록이다.
- 시스템 프로퍼티로 유지
- config.ini
- 늦은 활성화
- 지정한 클래스를 제공하는 번들을 활성화,
- IConfigurationElement.crateExecutableExtension()
- 데이터 영역
- 이클립스 자체가 설치된 곳. 읽기전용.
- 참고. platform.getInstallLocation(), osgi.install.area
- 이클립스 설치 환경
- 이클립스의 실행 구성을 정의한 영역. 쓰기 가능. 구성의 모든 인스턴스에서 사용가능
- 참고. platform.getConfigurationLoaction(), osgi.confiuration.area
- 이클립스 개발환경 workspace의 Applicion들?
- 사용자 정의 데이터를 위한 기본 위치. (ex.workspace) , 쓰기 가능. 여러세션이 동시에 접근 할 수 있도록 허용한다.(????) 하지만 수정사항을 잃지않도록 주의 해야한다.
- 참고.Platform.getInstanceLocation(), osgi.instance.area
- 도구 실행 시 도구의 workspace
- 인스턴스와는 독립적, java home, osgi 프로퍼티 초기값을 기반함.
- Platform.getUserLocation(), osgi.user.area
- 설치
- 구성
- 인스턴스
- 사용자
- 상대위치
- 인스턴스 영역의 메타데이터 내의 위치.
- Plugin.getStateloaction()
- 데이터 위치
- 구성의 메타데이터 내의 위치.
- Bundle.getDataFile()
- 데이터 영역의 위치는 이클립스를 시작하기 전에 설정한 시스템 프로퍼티(config, ini)로 제어한다. .....*.ini 파일
- 심볼 값
- @none
- 지정한 위치는 명시적으로 설정되지도 않고, 기본 값을 설정하지도 않는다는 의미
- ex. 어떤 인스턴스데이터도 갖지않은 rcp스타일의 애플리케이션은 관련 없는 파일을 디스크에 기록하지 않도록 'osgi.instance.area=@none'을 사용함. '@none'뒤에는 어떤 경로도 붙이면 안됨.
- @noDefault
- 위치가 정의되지 않거나, 명시적으로 정의되게 한다.
- @user.home
- @user.dir
-
- RCP는 어떻게 구성되어 있고, 각각의 구성요소의 역할과 특징을 알아보자?
- 어플리케이션
- 제품
- 확장 레지스트리
- 컨트리뷰션에 의한 확장
- 퍼스펙티브, 뷰, Editor
- Eclipse IDE는 RCP인가?
- OSGi 프레임워크
- 이퀴낙스
- SWT
- JFACE
- UI 워크벤치
- 이클립스의 기반이되는 OSGi를 좀 더 자세히 알아보자. (27장)
- BundleActivator
- 액티베이터 주의 사항
- 액티베이터 사용
- 이른 활성화 확장
- osgi.bundles
- 시작 레벨
- osgi와 이클립스 런타임(runtime.plugin)
- 플러그인 모양
- 프래그먼트
- 버전 번호 규칙
- 서비스
- 번들 생명주기
- 활성화 앞당기기
- 늦은 활성화
- 데이터 영역
- RCP는 어떻게 구성되어 있고, 각각의 구성요소의 역할과 특징을 알아보자?
반응형
'SW Programming > Eclipes RCP' 카테고리의 다른 글
[eclipes plugin] UI작업할 때 WIndow Builder (0) | 2020.05.29 |
---|
댓글