본문 바로가기

개발환경/이클립스

[번역]Equinox/p2/Adding Self Update to an RCP Application-3.5

영문: http://wiki.eclipse.org/Equinox/p2/Adding_Self_Update_to_an_RCP_Application-3.5

이 페이지는 3.5에 있는 p2 임시 API를 사용하여 RCP 애플리케이션에 p2 self-updating 지원을  추가하는 방법에 대한 정보를 통합한다.

먼저 RCP 메일 예제 애플리케이션을 만든 다음 다양한 방법으로 변경해 본다.

p2 추가하기, 빌드하기, p2로 애플리케이션 제공하기

p2로 업데이트를 하기위한 애플리케이션 설정 절차는 다음과 같이 몇 단계를 거친다.
  • 애플리케이션에 p2 번들을 추가해야한다. 가이드와 같이 org.eclipse.equinox.p2.user.ui 피처를 사용하여 제품 피처(product's features)중의 하나로 p2 번들을 추가함으로써 나타낼 수 있다. 이것은 또한 피처에서 필요한 것들을 나타낼 것이고 애플리케이션에 p2를 설치함으로써 올바른 코드를 작성할 수 있게 한다.
  • 제품 빌드 설정
    • UI없이 빌드하기(headless build)위한 델타팩 설치
    • build.properties에 일반적인 빌드단계 기술
    • 빌드에 p2-고유 단계 추가
      • p2 저장소에 빌드를 위한 메타데이터 내보내기
      • 애플리케이션을 제공하는 p2 디렉터(director) 실행

이 절차는 앤드류 니퍼(Andrew Niefer)의 블로그 게시글 에서 보다 자세히 다루고 있다.

예제는  변경된 RCP 메일 애플리케이션을 기반으로 빌드하며 여기 에서 찾을 수 있다.

사용자의 기본 저장소(repository) 설정하기

처음에 애플리케이션 안에 있어야만 하는 저장소(레파지토리)를 터치포인트 명령(touchpoint instructions) 사용으로 관리할 수 있다. addRepository 명령은 각 저장소에 대해 사용해야 한다. p2 UI에서, 메타데이터(metadata)와 산출물(artifact) 저장소를 같은 장소에 지정하는 것으로 간주한다. 사용자가 UI에서 저장소를 추가하면 메타데이터와 산출물 저장소에는 그 위치가 추가된다. 터치포인트 명령을 사용할 때면, 반드시  메타데이터와 산출물 저장소에 추가되어야만 한다.

애플리케이션에 포함된 터치포인트 어드바이스 파일(touchpoint advice file)(p2.inf)을 사용하여 이 명령들을 기술한다. 보다 자세한 내용은 Equinox/p2/Engine/Touchpoint_Instructions 를 참고한다.

여기에 p2 RCP 메일 예제들 중의 하나로 사용된 p2.inf 샘플파일이 있다.

p2 UI 설정하기

사용자에게 어떻게 보여줄 것인가에 따라서 p2 UI 를 통합하는 다양한 방법이 있다.

이클립스 SDK UI 통째로 재사용하기

여러분의 목적이 단순히 RCP 앱(app) 내부의 SDK에서 사용하고 있는 업데이트 UI와 동일한 것을 사용하는 것이라면, 변경할 것이 거의 없다. 이렇게 하는 방법을 보여주는 RCP 메일 애플리케이션 샘플은   here 에서 찾을 수 있다. 코드안에서 'XXX' 태스크 태그를 찾아 봄으로써 표준 RCP 메일 애플리케이션에 요구된 변화를 볼 수 있다.

애플리케이션에 org.eclipse.equinox.p2.user.ui 피처를 포함해야 할 것이다. 이것은 p2 core 및 다른 요구되는 모든 번들외에도 여러분의 애플리케이션에 다음과 같은 UI 번들을 추가할 것이다.:

  • org.eclipse.equinox.p2.ui
  • org.eclipse.equinox.p2.ui.sdk
  • org.eclipse.equinox.p2.ui.sdk.scheduler

변경되지 않은 p2 SDK UI 번들을 사용하기 위해서는 p2 UI로 여길만큼 동일한 UI 서비스를 제공할 필요가 있다. 이것은 다음을 포함한다:

  • ApplicationWorkbenchWindowAdvisor 는 p2 자동 업데이트 상태 및 진행상황을 보여주는 상태라인(status line)과 진행상황 영역(progress area)을 정의한다.

public void preWindowOpen() {
    IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
    configurer.setInitialSize(new Point(600, 400));
    configurer.setShowCoolBar(true);
    // XXX We set the status line and progress indicator so that
    // update information can be shown there
    configurer.setShowStatusLine(true);
    configurer.setShowProgressIndicator(true);
}
  • ApplicationActionBarAdvisor 는 메뉴바에 Help 메뉴가 있어야 하고 p2 기여(contributions)가 만들어 질 수 있도록 additions 그룹이 정의되어 있어야만 한다.  In order to make the update preferences available to the user, there must also be access to the preferences from some menu.
protected void fillMenuBar(IMenuManager menuBar) {
    MenuManager fileMenu = new MenuManager("&File", IWorkbenchActionConstants.M_FILE);
    // XXX Window menu
    MenuManager windowMenu = new MenuManager("&Window", IWorkbenchActionConstants.M_WINDOW);
    MenuManager helpMenu = new MenuManager("&Help", IWorkbenchActionConstants.M_HELP);
   
    menuBar.add(fileMenu);

    // XXX Window menu
    menuBar.add(windowMenu);

    ...
    
    // XXX Window menu
    windowMenu.add(preferencesAction);
    
    // Help
    // XXX add an additions group because this is what SDK UI expects
    helpMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
    helpMenu.add(new Separator());
    helpMenu.add(aboutAction);
}

Since the RCP Mail application does not define preferences of its own, the resulting preference dialog will only show the preferences contributed by p2 and its required bundles.

...

애플리케이션을 시작할 때 UI 없이 업데이트하기

때때로 가장 간단한 UI는 UI가 없는 것이다. 고도로 관리되는 제품 설치 중에 사용자의 개입없이 애플리케이션이 시작될 때마다 자동으로 업데이트 되는 것이 가치있는 것일 수도 있다.

이렇게 처리하는 방법을 보여주는 RCP 메일 애플리케이션 예는 여기 에서 찾을 수 있다.

업데이트가 정말 UI가 없는 것(headless)은 아닌데 그 이유는 진행지시기(progress indicator)가 보이기 때문이다.  진행지시기는 스플래쉬 화면이후 업데이트를 찾을 때 보인다. 사용자가(그리고 애플리케이션으로 인하여) 업데이트를 취소할 수도 있다. 그렇지 않고서는 업데이트에 개입할 수 없다. 애플리케이션을 실행하기 위해서,  사용자는 실행전에 업데이트를 찾을 때까지 그리고 찾은 업데이트를 설치할 때까지 기다려야만 할 것이다.

이 설정에서, p2 UI 클래스 라이브러리 번들(org.eclipse.equinox.p2.ui)은 전체가 필요하지 않다. 핵심코드만이 업데이트에 사용된다. 다음과 같은 변경이 필요하다.:

  • Activator 시작코드는 p2 기반 번들이 시작된 것을 보장해야만 한다. 그렇지 않으면, 업데이트를 체크할 때 요구되는 서비스를 찾지 못할 수도 있다.
public void start(BundleContext context) throws Exception {
    super.start(context);
    plugin = this;
    bundleContext = context;
      
    packageAdminRef = bundleContext.getServiceReference(PackageAdmin.class.getName());
    packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminRef);
  
    // XXX start up the p2 infrastructure.  Normally the p2 UI class library does
    // this, but we are running without UI.
    getBundle("org.eclipse.equinox.p2.exemplarysetup").start(Bundle.START_TRANSIENT); //$NON-NLS-1$
    getBundle("org.eclipse.equinox.frameworkadmin.equinox").start(Bundle.START_TRANSIENT); //$NON-NLS-1$
    getBundle("org.eclipse.equinox.simpleconfigurator.manipulator").start(Bundle.START_TRANSIENT); //$NON-NLS-1$
}
  • 애플리케이션을 시작할 때 위 코드가 실행되는 것을 보장하기 위해서, 예제 번들 자신은 애플리케이션을 실행할 때 반드시 시작되어야만 한다. 이는 예제를 어떻게 실행하느냐에 따라서, 여러가지 방법으로 명시된다.:
    • 번들 시작 레벨을 실행(launch) 환경으로 설정한다.
    • 번들 시작 레벨을 프러덕트 편집기의 환경설정 탭에서 설정한다.(빌드를 위한 .product 파일)(releng 프로젝트 예에서 필요했던...)
    • 이미 빌드된 앱(app)의 config.ini에서 번들이 시작되도록 한다.
  • ApplicationWorkbenchAdvisor는 preStartup() 메소드를 정의해야만 한다.
public void preStartup() {
    // XXX check for updates before starting up.
    // If an update is performed, restart.
    if (P2Util.checkForUpdates()) {
        PlatformUI.getWorkbench().restart();
    }
}