태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

 

 

 

 
블로그 검색:
분류 전체.. (270)
나의 관심사 (167)
connec2u.com (66)
기술 분석/.. (34)
iBeacon  Google  IOT  안드로이드  NFC  Microsoft  Qualcomm  Safari  개발자 인생  Android 
 Content manag..
└>mindwing
 Nouveautés
└>mindwing
 Marque
└>mindwing
 Découvrez le..
└>mindwing
 Par date de d..
└>mindwing
«   2018/10   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
+ Total : 309,229
+ Today : 1
+ Yesterday : 265
  

 

 

 

Equinox _해당되는 글 1건
2008.02.04   Equinox 기술문서 
Google 의 재반격: Google Wallet

Google 처럼 시장을 맘대로 주무르면서 편하게 사업하는 기업도 없다는 없는 것 같지만, 사실 알고보면 Google 도 많은 실패를 겪었던 전력이 있습니다. 대표적으로 Google Wallet 을 들 수 있는데요. Googl..

iTunes Pass, 애플의 새로운 결제모델 실험일지도...

2일전, 애플은 iTunes Pass 라는 Apple Store 에 한해 사용할 수 있는 선불형 지불시스템을 발표했습니다. 그리고, 오늘은 미국과 호주에서도 사용할 수 있도록 적용국가를 늘렸다고 발표했습니다. iTunes Pa..

Thread Group 설립, Nest 와 ARM 과 삼성의 전략적 동거

Microsoft 와 삼성이 Intel 주도의 OIC 에 참여한다는 뉴스가 나온지 얼마 되지 않아서, 이번에는 Nest 가 주도하는 Thread Group 에 ARM 과 삼성이 참여한다는 뉴스가 나왔습니다. Nest 는 Goo..

NFC 와 Bluetooth 의 신경전

NFC 와 Bluetooth 의 승부는 아직 전운이 감도는 하지만, 본격적인 전투는 벌어지지 않은 전장과도 같습니다. 대체적인 평가로는 POS 같이 물리적인 접촉행위가 소비자에게 안심을 주거나 비교적 자유롭게 통행해도 괜찮은 ..

OIC, AllJoyn 의 대항세력 등장

Open Interconnect Consortium, 줄여서 OIC 라는 단체가 출범했습니다. 이 단체는 이름만 들어도 쟁쟁한 회사들이 모여서 설립되었는데요. Intel, Dell, Samsung, Atmel, Broadcom..

WiGig, Connected home 에서 네트워크의 중요성

IoT 는 기본적으로 사물들이 인터넷에 직접 혹은 간접적으로 자유롭게 연결될 수 있어야 한다는 중요한 전제가 있습니다. 기업시장에서는 BYOD 와 각종 센서들까지 접속을 필요로 하는 기기들이 엄청나게 많아질 것이므로, 접속속도..

 

Equinox 기술문서
+   [기술 분석/동향/OSGi]   |  2008.02.04 17:58  

문서의 목적

Equinox 을 이용해서 OSGi 번들을 만들고 실행해보는 방법을 이해하고, Equinix 의 사용현황을 알아본다.

Equinox 개요

Equinix 는 Eclipse 재단에서 만들고 있는 OSGi Core Framework 및 기타 부속물의 구현물이다. Eclipse 재단은 Eclipse 3.0 버전부터 Eclipse 의 내부 프레임워크로 OSGi 를 채택했으며, OSGi 구현을 위한 프로젝트가 Equinix 이다.

현재 Equinix 는 별개의 프로젝트가 아니라 Eclipse RCP 와 IDE 플랫폼 개발 프로젝트로 흡수되었다.

Equinix 는 OSGi 가 (웹애플리케이션으로서의) Server Side 에서 주목받게 됨에 따라 Eclipse 플랫폼으로서가 아니라 Server Side 의 독자적인 플랫폼으로서의 가능성에 주목받고 있다. Equinox 를 Server Side 에서 쓰기 위한 작업도 진행되고 있다.

Eclipse 재단은 EPL (Eclipse Public License) v1.0 라이선스을 사용하는데, 이 라이선스에 의하면 상업적인 목적으로 소스 및 오브젝트 파일들을 쓰는 것은 허용되나 이로 인해 발생되는 모든 책임을 질 것과 EPL v1.0 라이선스 파일을 제품에 포함시킬 것을 요구하고 있다.

Equinox 사용하기

Equinox 는 Eclipse 플랫폼의 기반 Framework 이지만, Eclipse 와 관계없이 Equinox 만을 쓰는 것도 가능하다.

Eclipse 설치본에서 다음 파일을 사용하면 osgi> 로 표기되는 Equinox 런타임의 콘솔을 볼 수 있다.

java -jar <install location>/eclipse/plugins/org.eclipse.osgi_3.3.0_xxx.jar -console

그러면 osgi> 라는 프롬프트가 나오면서 Equinox 콘솔이 나온다.

다음은 org.eclipse.osgi_3.3.0.v20070530.jar 파일을 써서 콘솔을 띄운 모습이다.

image_thumb131

 

Equinox 에서 실행할 Bundle 은 jar 파일 형태를 가지며, jar 파일내에는 org.osgi.framework.BundleActivator 인터페이스를 구현한 Activator 클래스가 포함되어 있어야 하고, MANIFEST.MF 파일에는 Bundle 이 구동되기 위한 정보가 담겨 있어야 한다.

이런 Bundle 을 만드는 데에는 Eclipse 를 이용하면 편리하다. 이에 앞서 Bundle 의 구조를 간단하게 살펴보기 위해 Console 에서 직접 만드는 예를 먼저 살펴본다.

Console 에서 Equinox 용 Bundle 작성 및 실행

Bundle 소스코드 작성과 컴파일하기

Console에서 텍스트 편집기로 직접 작성해서 빌드하고 실행하는 예이다.

먼저, org.eclipse.osgi_3.3.0.v20070530.jar 파일이 있는 디렉토리로 이동한다.

다음과 같은 내용으로 MyFirstBundle.java 소스파일을 만든다.

package mindwing;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class MyFirstBundle implements BundleActivator
{
    public void start(BundleContext bc)
    {
        System.out.println("생애 첫 번들 시작~");
    }

    public void stop(BundleContext bc)
    {
        System.out.println("생애 첫 번들 끝~");
    }
}

BundleActivator 는 OSGi 런타임이 Bundle 을 로딩하는데 필요한 인터페이스이다.

start() 메소드는 Bundle 이 기동될 때, stop() 메소드는 Bundle 이 중지될 때 호출된다.

소스파일을 다음과 같이 컴파일한다.

javac -d . -cp org.eclipse.osgi_3.3.0.v20070530.jar MyFirstBundle.java

다음과 같은 내용으로 MANIFEST.MF 파일을 만든다.

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: mindwing.MyFirstBundle
Bundle-Version: 1
Bundle-Activator: mindwing.MyFirstBundle
Import-Package: org.osgi.framework;version="1.3.0"


(파일의 총 라인수가 7라인이 되도록 편집기에서 맨 마지막 줄을 타이핑 한 후 엔터키를 한 번 쳐주어야 한다.)

다음과 같이 Bundle 파일로 삼을 .jar 파일을 만든다.

jar cvmf MANIFEST.MF myfirstbundle.jar mindwing

Equinox 에 Bundle 올려서 기동하기

myfirstbundle.jar 파일이 만들어졌다면 다음 그림과 같이 osgi 콘솔상에서 로딩해서 기동한다.

image_thumb18

 

ss 명령어를 이용해서 OSGi 와 Bundle 의 상태를 파악할 수 있다.

image_thumb20

 

참고로, Bundle 의 Life Cycle 은 다음과 같다.

image_thumb1

간략한 콘솔 명령어 사용법은 다음과 같다.

  • install <bundle path>
    • Bundle 을 설치한다. 설치가 완료되면 설치된 Bundle 의 id 를 출력해준다.
  • start <bundle id>
    • 지정된 Bundle id 에 해당하는 Bundle 을 기동시킨다.
  • stop <bundle id>
    • 지정된 Bundle id 에 해당하는 Bundle 을 중지시킨다.
  • update <bundle id>
    • 지정된 Bundle id 에 해당하는 Bundle 을 중지시키고, .jar 파일을 다시 로딩한 후 기동시킨다.
  • ss
    • OSGi 와 Bundle 의 상태를 보여준다.
  • services
    • 기동중인 service 들에 대한 정보를 보여준다.
  • launch
    • OSGi Framework 을 기동시킨다. 콘솔을 기동했다면 OSGi Framework 은 이미 기동된 상태이다.
  • uninstall <bundle id>
    • 설치된 Bundle 중 지정된 Bundle id 에 해당하는 Bundle 을 제거한다.
  • shutdown
    • OSGi Framework 을 중지시킨다.
  • exit
    • 콘솔을 종료한다.

 

Bundle 을 update 하기

다음 그림은 update 명령을 실행한 경우이다.

image_thumb22

 

다음은 소스코드를 수정한 후 .jar 파일을 다시 만들어서 update 명령을 실행한 경우이다.

package mindwing;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class MyFirstBundle implements BundleActivator
{
    public void start(BundleContext bc)
    {
        System.out.println("생애 첫 번들 시작~ 2번째~");
    }

    public void stop(BundleContext bc)
    {
        System.out.println("생애 첫 번들 끝~ 2번째~");
    }
}

image_thumb26

 

stop() 메소드가 호출되는 것은 이전 소스코드 내용이고, 다시 한 번 update 1 을 실행하면 수정된 소스코드 내용이 실행된 것을 알 수 있다.

다음 그림은 다시 한 번 update 1 을 실행한 모습이다.

image_thumb24 

 

Eclipse 에서 Equinox 용 Bundle 작성 및 실행

Eclipse에서 Bundle 을 작성해서 빌드하고 실행하는 예이다.

 

Project Wizard 를 이용한 Bundle Project 만들기

Eclipse에는 명시적으로 OGSi Bundle 을 만들 수 있는 Project Wizard 가 없는 것처럼 보인다. 하지만, Eclipse Plug-in 이 사실 OSGi Bundle 이기 때문에 Eclipse Plug-in Project Wizard 를 이용하면 Eclipse 에서 OSGi Bundle 을 만들 수 있다.

다음 그림처럼 Plug-in Project Project Wizard 를 선택해서 예제 Project 를 선택한다.

image_thumb2

 

이제 Project name 을 입력하고, Target Platform 으로 OSGi 를 선택한다. OSGi framework 으로는 standard 와 Equinox 를 선택할 수 있는데, 여기에서는 Equinox 를 선택한다.

image_thumb4

 

그 다음 화면에서 Finish 버튼을 누르지 말고, Next 버튼을 눌러야 예제 소스코드를 선택할 수 있다.

image_thumb6

 

Hello OSGi Bundle 예제를 선택하고 Finish 버튼을 누르면 다음 화면과 같이 예제 Project 를 볼 수 있다.

image_thumb8

 

이 화면에서는 MANIFEST.MF 파일의 내용을 바로 수정하거나 OSGi framework 런타임을 기동/기동시키는 등의 조작이 가능하다.

이제, 왼쪽 Package Explorer 에서 mindwing_bundle.Activator.java 파일을 연다.

이 상태에서 다음 그림과 같이 실행환경을 만든다.

image_thumb13

 

Target Platform 은 다음과 같이 하나만 선택하도록 한다.

image_thumb15

 

이제 Run 버튼을 누르면 다음 그림과 같이 Equinox 의 Console 이 뜨면서 Bundle 이 실행되는 것을 볼 수 있다. (ss 명령으로 현재 실행중인 Bundle 의 상태도 조회하였다.)

image_thumb17

참고로, 생성된 소스코드는 다음과 같다.

 

package mindwing_bundle;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator
{
    public void start(BundleContext context) throws Exception
    {
        System.out.println("Hello World"); 
    }

    public void stop(BundleContext context) throws Exception
    {
        System.out.println(" === A번들 stop");
    }
}

 

소스코드 수정 후 바로 Bundle 을 update 하기

Bundle 이 실행된 상태에서 소스코드를 수정하면 Eclipse 에서 알아서 빌드 후 Bundle jar 파일까지 만들어준다. 소스코드를 수정한 다음 Bundle 의 ID 인 1 번으로 update 를 하면 별도로 컴파일을 하고 Bundle jar 파일을 만드는 과정이 없이 바로 결과를 확인할 수 있는 것을 볼 수 있다.

image_thumb19 

 

Bundle 간 메소드 호출하기

Bundle 은 package 단위별로 외부에 자신을 노출시킬 수 있다.

노출시킬 package 와 pacage 의 버전등에 관한 정보는 모두 MANIFEST.MF 파일에 기재되어야 하는데, Eclipse 에서는 MANIFEST.MF 파일을 수정하기 위한 다양한 view 를 제공한다.

 

Package 노출하기

A Bundle 과 B Bundle 이 있을 때, B Bundle 이 노출시킨 package 를 A Bundle 이 사용하는 예이다.

다음과 같이 A 와 B 라는 이름으로 2개의 Bundle 프로젝트를 만든 상태에서 설명을 시작한다.

image_thumb29

 

B Bundle 에는 b_export 패키지가 있는데, MANIFEST.MF 파일에 패키지 이름을 써주면 된다. Eclipse 에서 B Bundle 의 MANIFEST.MF 파일을 더블클릭하면 다양한 view 로 편집할 수 있는 편집기를 볼 수 있다.

다음 그림과 같이 아래에 있는 탭에서 Runtime 을 선택한다.

image_thumb7

 

Export Packages 부분에 있는 Add... 버튼을 눌러서 다음 화면을 띄우고, b_export 패키지를 선택한다.

image_thumb9

 

그러면, 다음과 같이 b_export 가 export 되고 있다는 것을 알 수 있다.

image_thumb11

 

여기에서 Properties... 버튼을 눌러서 다음 그림과 같이 버전을 1.0.0 으로 기입한다. (기입하지 않았을 때의 기본값은 1.0.0 이다. 최대 4자리까지 숫자를 입력할 수 있다.)

image_thumb17[1]

 

이제, 아래 탭에 있는 MANIFEST.MF 를 눌러서 실제 파일에는 어떻게 기재되어 있는지 살펴본다.

image_thumb21

 

이제 이 파일을 저자한 다음에 다음 그림과 같이 export 된 package 를 이용할 A Bundle 의 MANIFEST.MF 를 더블클릭해서 열고, Dependency 탭을 누른 다음 Imported Packages 의 Add... 버튼을 누르고. b_export 을 선택한다.

image_thumb23

 

다음 그림과 같이 MANIFEST.MF 파일에서 수정내용을 확인할 수 있다.

image_thumb33

 

실행결과를 보기전에 관련 소스코드를 살펴보면, B Bundle 의 노출된 패키지에 속한 클래스인 b_export.B_Export 클래스는 다음과 같다.

package b_export;

public class B_Export
{
    public void b_export()
    {
        System.out.println(" === B번들의 b_export() 메소드 호출됨.");
    }
}

 

이 클래스를 사용하기 위한 A Bundle 에서 a.Activator 클래스와 a.A_Import 클래스는 각각 다음과 같으며, 클래스를 바로 사용할 수 있는 것을 알 수 있다.

package a;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator
{
    A_Import a;

    public void start(BundleContext context) throws Exception
    {
        System.out.println(" === A번들 start");

        a = new A_Import();
        a.callme();
    }

    public void stop(BundleContext context) throws Exception
    {
        System.out.println(" === A번들 stop");
    }
}

 

package a;

import b_export.B_Export;

public class A_Import
{
    B_Export b;

    public void callme()
    {
        b.b_export();
    }
}

 

이제 Equinox 를 기동하면 다음과 같은 화면과 같이, dependency 가 걸려있는 Bundle B 가 먼저 start 되고, 그 다음에 Bundle A 가 start 되고, Bundle A 에서 Bundle B 의 b_export() 메소드가 호출되는 것을 볼 수 있다.

image_thumb35

 

Service 등록과 사용하기

Eclipse에서 Service 를 작성해서 다른 Bundle 에서 이를 이용하는 예이다.

Service 는 어떤 Bundle 이 다른 Bundle 에게 자신을 노출할 수 있는 또 하나의 방법이다. Bundle 의 Package 노출은 Package 이름이나 Class 이름을 원치 않는 상황에서도 노출해야만 하며, 노출된 Class 가 정확히 노출된 목적에만 맞게 만들어진 것이 아닐 수도 있다.

이에 비해 Service 를 이용하면 잘 알려진 Interface 를 이용해서 구현 및 탐색이 이루어지기 때문에, Bundle 상호간 정확한 목적하에 상호작용이 이루어질 수 있으며, Service 구현체는 해당 Interface 의 뒤에 가려져있기 때문에 상황에 따라 런타임에 구현체만 바꾸는 것도 가능하다.

Service 는 일반적인 Java 인스턴스면 모두 Service Registry 에 등록이 가능하며, 명시적으로 BundleContext 에서 unregister  하거나 Service 를 제공한 Bundle 이 stop 되면 자동으로 Service Registry 에서 제거된다.

 

Service 를 만들고 등록하고 사용하기

앞서 설명한 Bundle 만드는 방식대로 S1 Bundle 을 만들고, 다음 소스코드를 참고해서 인터페이스인 hello.HelloService 클래스와 구현체인 hello.impl.HelloService 클래스를 만든다. 그리고, 이를 Service Registry 에 등록하기 위한 코드도 Activator 클래스에 추가한다.

package hello;

public interface HelloService
{
    public void sayHello();
}

 

package hello.impl;

import hello.HelloService;

public class HelloServiceImpl implements HelloService
{
    public void sayHello()
    {
        System.out.println(" === S1서비스의 sayHello() 메소드 호출됨.");
    }
}

 

다음 소스코드의 주황색 부분이 hello Service 를 등록하는 부분이다.

package s1;

import hello.HelloService;
import hello.impl.HelloServiceImpl;

import java.util.Hashtable;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator
{
    private HelloService service;

    public void start(BundleContext context) throws Exception
    {
        System.out.println(" === S1번들 start");

        service = new HelloServiceImpl();

        context.registerService(HelloService.class.getName(), service,
                new Hashtable());

        System.out.println(" === S1번들에서 hello서비스 등록");
    }

    public void stop(BundleContext context) throws Exception
    {
        service = null;

        System.out.println(" === S1번들 stop");
    }
}

 

S1 Bundle 은 인터페이스도 제공하기 때문에 다음 그림과 같이 hello package를 export 해야 한다.

image_thumb37

 

이전에 만들었던 A Bundle 에서 hello Service 를 사용하기 위해 다음 그림과 같이 A Bundle 에서 hello package 와 org.osgi.util.tracker package 를 추가로 등록한다.

image_thumb39

 

hello Service 를 쓰기 위해 다음과 같이 a.Activator 와 a.A_Import 클래스를 수정한다.

package a;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;

import hello.HelloService;

public class Activator implements BundleActivator
{
    A_Import a;

    HelloService service;

    ServiceTracker helloServiceTracker;

    public void start(BundleContext context) throws Exception
    {
        System.out.println(" === A번들 start");

        helloServiceTracker = new ServiceTracker(context, HelloService.class
                .getName(), null);
        helloServiceTracker.open();

        service = (HelloService) helloServiceTracker.getService();

        a = new A_Import(service);
        a.callme();

    }

    public void stop(BundleContext context) throws Exception
    {
        helloServiceTracker.close();
        helloServiceTracker = null;

        service = null;

        System.out.println(" === A번들 stop");
    }
}

 

package a;

import hello.HelloService;
import b_export.B_Export;

public class A_Import
{
    B_Export b;

    HelloService service;

    public A_Import(HelloService service)
    {
        b = new B_Export();
        this.service = service;
    }

    public void callme()
    {
        b.b_export();

        service.sayHello();
    }
}

 

이제 Equinox 를 실행하면 다음과 같은 화면을 볼 수 있다.

image_thumb41

 

Service 를 같은 이름으로 2개 만들고 등록하고 사용하기

다음 그림처럼 S1 Bundle 과 같은 형식으로 S1 Bundle 을 만들고, 구현체는 다른 클래스로 하되, 같은 인터페이스로 또 하나의 Service 를 Service Registry 에 등록해서 실행한다.

image_thumb43

 

S1 의 Service 가 먼저 등록되었기 때문에, A Bundle 에서는 S1 의 Service 를 호출한 것을 볼 수 있다.

이제 S1 을 stop 시키고, A 를 update 해보면 다음 그림과 같은 결과를 볼 수 있다.

image_thumb45

우선순위이던 S1 의 Service 가 내려가자 S2 의 Service 가 A Bundle 에서 이용된 것을 볼 수 있다.

 

 

Equinox 사용현황

Equinix 는 관련 스펙과 구현을 주도하고 있는 IBM 에 의해서 Websphere 나 Lotus Notes, Eclipse, Tivoli 등에서 널리 쓰이고 있다.

게다가 Java ME 나 Java SE 뿐만 아니라 엔터프라이즈 영역에서도 널리 접목되고 있는데, Spring-DM 이 대표적인 예이다.

Eclipse 를 통해 Equinox 를 이용한 OSGi 관련 개발이 진행되고 있으며, 그로 인해 관련 스펙 및 기술이 태동기를 넘어 성숙기에 접어들고 있다. 그러므로, 적용되는 분야나 제품도 빠르게 늘어가는 것을 볼 때 시장에서의 검증은 이미 끝난 단계라고 보여진다.

 

참고자료

http://www.eclipse.org/equinox/documents/quickstart.php

http://download.eclipse.org/eclipse/equinox/

http://underlap.blogspot.com/2007/01/creating-osgi-bundle.html

http://www.eclipse.org/legal/epl-v10.html

http://live.eclipse.org/node/387

'기술 분석/동향 > OSGi' 카테고리의 다른 글

Equinox 기술문서  (0) 2008.02.04
OSGi 기술분석  (0) 2008.01.30

 
 
     ,
     5   0

아이디 
비밀번호 
홈페이지 
비밀글   

 

<<이전 | 1 | 다음>>

mindwing's Blog is powered by Daum

 

티스토리 툴바