OSGi 시작하기 2 – 프레임워크와 연동하기 : [번역] Interacting with the Framework

이 글은 Neil Bartlett 의 연재 글 “Getting started with OSGi”의 번역본입니다.
* 파트 1 – 첫번째 번들 : Your First Bundle
에 이어 2번째 글입니다. 오탈자 및 이상한 번역은 댓글로 남겨주세요

Getting started with OSGi : OSGi 시작하기 파트 2 – 프레임워크와 연동하기

저자 : Neil Bartlett < njbartlett at gmail dot com >
역자 : 권 정혁 < guruguru at gmail dot com >

글원본 : http://www.eclipsezone.com/eclipse/forums/t90448.html – Getting started with OSGi : Interacting with the Framework

EclipseZone OSGi 튜토리얼에 돌아오신걸 환영합니다.

지난 시간에는 시작과 종료시에 메시지를 출력하는 Hello World 번들을 살펴보았는데요. 이것은 BundleActivator 인터페이스를 구현하여 start 와 stop 메소드를 제공함으로서 가능했습니다. 코드를 다른부분을 살펴보면, startstop 메소드의 서명(Method Signature , 역주:메소드의 이름,인자,리턴타입등을 총칭)에서 우리가 BundleContext 라는 인자를 받았다는 것을 알수 있습니다. 이 장의 튜토리얼에서 우린 BundleContext 에 대해 알아보고 이 것으로 무엇을 할수 있는지 살펴볼 것 입니다.

BundleContext 는 OSGi 프레임워크가 우리에게 보내주는 매직티켓 입니다. 코드상에서 프레임워크와 연관된 작업을 해야할 필요가 있을 때 BundleContext 를 사용하게 될것입니다. 실제로 이것은 OSGi API 와 연결하기 위한 단 하나의 방법이며 프레임워크는 번들이 시작될때 BundleActivator 를 통해 각 번들에게 이 티켓중의 하나를 발권하게 됩니다.

지난번에 시작한 Equinox 가 아직 실행중이라면 재시작 할 필요는 없습니다. 실행중이 아니라면, 다시 시작하기 위한 커맨드는

> java -jar equinox.jar -console

입니다. ss 를 입력해서 지난번에 설치한 HelloWorld 번들이 아직 설치되어 있는지 확인해 볼 수 있습니다. 당신이 Equinox 를 종료하고 재 시작했더라도 그것을 볼수 있는데, 왜냐하면 OSGi 프레임워크가 각각의 실행간에 실행 상태를 저장하기 때문입니다.

이번 연습을 위해, 우리는 Hello World 번들을 찾아내고 Uninstall(제거) 하는 번들을 작성해 볼것입니다. 물론 콘솔창에서 uninstall 명령을 내림으로 간단히 해볼수 있지만, 어떻게 OSGi API 를 통해 프로그램적으로 실행가능한지를 알아보기 위해서입니다. 그럼 HelloWorldKiller.java 라는 파일을 만들고 아래의 코드를 복사합니다.

import org.osgi.framework.*;
 
public class HelloWorldKiller implements BundleActivator {
    public void start(BundleContext context) {

        System.out.println("HelloWorldKiller searching...");
        Bundle[] bundles = context.getBundles();
        for(int i=0; i < bundles.length; i++) {
            if("HelloWorld".equals(bundles[i]
                                   .getSymbolicName())) {

                try {
                    System.out.println("Hello World found, "
                                     + "destroying!");
                    bundles[i].uninstall();
                    return;
                } catch (BundleException e) {

                    System.err.println("Failed: "
                                     + e.getMessage());
                }
            }
        }
        System.out.println("Hello World bundle not found");
    }

 
    public void stop(BundleContext context) {
        System.out.println("HelloWorldKiller shutting down");
    }
}

이제 Manifest 를 작성합니다. 마지막줄에 빈줄이 있어야 하는것은 역시 매우 중요합니다. 아래 내용을 HelloWorldKiller.mf 에 복사하세요.

Manifest-Version: 1.0
Bundle-Name: HelloWorldKiller
Bundle-Activator: HelloWorldKiller
Bundle-SymbolicName: HelloWorldKiller
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework

자 이젠 컴파일 하고 Jar 파일을 만듭니다.


> javac -classpath equinox.jar HelloWorldKiller.java
> jar -cfm HelloWorldKiller.jar HelloWorldKiller.mf HelloWorldKiller.class

다시 OSGi 콘솔에서 install file:HelloWorldKiller.jar 를 입력해서 새 번들을 설치하고 ss 를 입력해 봅니다. 상태 리스트는 이제 아래와 같을 것입니다.

id      State       Bundle
0       ACTIVE      system.bundle_3.2.1.R32x_v20060919
1       ACTIVE      HelloWorld_1.0.0
2       INSTALLED   HelloWorldKiller_1.0.0

자 이제 start 2 를 입력해서 Hello World Killer 를 실행하여 봅시다. 아래와 같은 출력을 보실수 있습니다.

HelloWorldKiller searching...
Hello World found, destroying!
Goodbye EclipseZone Readers!

마지막 출력라인은 원본 Hello World 번들에서 나왔다는것을 주목하세요. 우리가 Killer 를 실행하기 전에 그 번들이 active 상태였기 때문에 제거되기 전에 중단 되어야만 했기에 BundleActivator 에게 stop 이 실행 되도록 만들었습니다.

ss 의 출력을 보도록 합시다. Hello World 가 이제 사라졌습니다.

id      State       Bundle
0       ACTIVE      system.bundle_3.2.1.R32x_v20060919
2       ACTIVE      HelloWorldKiller_1.0.0

여기에 보안 문제가 있지 않은가 궁금해 하실수 있습니다. 어떤 번들이라도 다른 어떤 번들을 제거할수 있는것 처럼 보이니까요! 다행스럽게도 OSGi 는 프레임워크와의 모든 연계작업들을 세밀하게 조종할수 있는 종합적인 보안계층을 가지고 있습니다. 예를 들어 특정 “관리” 번들에 의해서만 번들이 제거될수 있도록 할수도 있습니다. 어쨋거나, 보안이 동작하도록 하는것은 대부분 설정(Configuration)상의 문제이니 이 연재에서는 우리는 코드에만 집중하기로 합니다.

이번회는 여기까지 입니다. 다음시간까지 BundleContext 의 인터페이스를 살펴보고 무엇을 할수 있는지 알아보는건 어떨까요 ? 예를 들어 installBundle 메소드를 이용하여 프로그램적으로 새 번들을 설치하는 것을 시도해 볼 수도 있습니다. 또는 현재 설치된 번들들에 대한 리스트를 가져와서 마지막으로 수정된 날짜와 시간을 출력하도록 할 수도 있구요. 시작하는데 도움이 필요하다면 OSGi Release 4 API 에 대한 JavaDoc 을 참고하세요

  1. 안녕하세요.

    HelloWorldKiller.java 코드 중 오탈자가 보입니다.

    for(int i=0; i{
    ^
    for(int i = 0; i < bundle.length; i++) { 고맙습니다.

  2. Helloworldkiller.jar 인스톨해도 resolved 상태로 나오구요 id값은2로 할당받앗는데 start2 콘솔창 입력시
    org.osgi.framework.BundleException: The activator HelloWorldKiller for bundle HelloWorldKiller is invalid
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:141)

    이런 문구가 뜨네요 이유를 모르겟습니다

    • The activator HelloWorldKiller for bundle HelloWorldKiller is invalid 가 나오는 것은
      위에 내용에도 있지만 MANIFEST.MF 가 잘못되어서 Activator 를 못찾기 때문일듯 합니다.
      MANIFEST.MF 파일 맨 마지막에 빈줄이 하나 있는지 확인해 보세요.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>