본문 바로가기
SW Programming/Eclipes RCP

이클립스 기반이 되는 OSGi 와 이클립스 RCP

by Crystal.k 2018. 4. 19.

 

 

  • 이클립스란 무엇인가?
    • 문제 해결을 돕기 위한 자바 기반의 도구
    • 도구의 기반구조를 개발하는 사람들의 오픈 소스 커뮤니티
    • 이클립스 자바 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을 접근 할 수 있다.
  • BundleContext
    • 번들->시스템 한테 요청
    • Ex) 다른 번들을 설치하거나, 서비스를 등록하는일을 시스템에게 요청 -> 시스템은 번들의 ID를 알아내서 권한을 확인하거나, 서비스에게 일을 맡김
    • 시스템 내부에서 생성하고 관리
    • 단순한 전달, 필요한 사항을 물어보는데 사용.
  • BundleActivator
    • 시작과 종료이벤트를 알아내서 필요한 작업을 수행
  •  
    이클립스 런타임
    OSGi
    다른 구성요소에 대한 정체성
    플러그인은 Plugin객체로 전달 및 기능 제공
    Bundle
    시스템에 대한 정체성
    Plugin 객체를 생성해서 시스템 상태를 보존 및 표현
    BundleContext
    생명주기 핸들러
    Plugin 객체는 Start, Stop메소드를 구현해서 초기화,마무리 작업 수행
    BundleActivator
    간편한 접근점
    Plugin 클래스는 플러그인 동작에 대한 내외부 접근가능한 메소드제공
    ex)ResourcePlugin.getWorkspace() 현재 작업공간을 반환함
     
  • 디렉토리번들구조 / 표준JAR형태번들구조
    • 네이티브 파일 시스템에서 직접 존재해야하는 파일을 포함
    • 공유 라이브러리, 프로그램 실행 파일, jar 등을 포함
    • 플러그인 용량이 크다면 디렉토리로 패키지화 추천
    • 작은파일, 압축 효율이 좋은 파일, 플러그인 서명 및 보안 검증을 지원
    • 효율성 낮을 수 잇음, 사본을 꺼내는 작업은 디스크용량을 2배로 필요하고 시간도 오래걸림.
    • 디렉토리
    • JAR
  • 프래그먼트
    • 1. 특정 플랫폼 전용 컨텐츠
      • 여러 플랫폼 - 부피 커짐, 지저분, 관리 어려움
    • 2. 특정 로케일 전용 컨텐츠
      • 로케일 나누워서 배포
    • 프래그먼트 내역서 MANIFEST.MF
    • 프래그먼트에는 자체 플러그인 생명주기가 없고, 연관된 플러그인의 생명주기에 의존한다.
    • BundleActivator 속성이 필요 없음.  프래그먼트가 스스로 종속관계를 선언하지 않는다. 
    • 독립형 플러그인이라기 보다 런타임시 자신의 컨텐츠를 호스트 플러그인의 컨텐트에 통합.
    • 플러그인을 하나로 패키징할 수 없을 때 사용
    • 프래그먼트는 첨가물이다.
    • 사전요구사항일 수 없다.
    • API를 추가할 의도로 사용하지 않는다.
    • 내보낼 요소의 추가가 가능하다........?
    • 프래그먼트(이클립스 플러그인 책 16장 참고)
    • 플러그인과의 차이
  • 버전 번호 규칙
    • major
      • 하위 호환이 보장되지 않는 큰 변화
    • minor
      • api 변경
    • service
      • 사소한 구현, 버그수정
    • qualifier
      • osgi 에서는 인식하지 않는 수식자, 문자열 비교를 통해서 비교함
    • 플러그인 ID + 버전조합 1.2.10.
    • major.minor.service.qualifier
  • 서비스
    • 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)

      • 플러그인 모양

      • 프래그먼트

      • 버전 번호 규칙

      • 서비스

      • 번들 생명주기

      • 활성화 앞당기기

      • 늦은 활성화

      • 데이터 영역

반응형

'SW Programming > Eclipes RCP' 카테고리의 다른 글

[eclipes plugin] UI작업할 때 WIndow Builder  (0) 2020.05.29

댓글