Whiteship's Note


OSGi 개발에 PDE가 필요한가?

Spring DM/etc : 2008.09.15 20:21


절대로 그렇지 않습니다. 오히려 OSGi를 처음 접할 때 이클립스 PDE(Plug-in Development Environment)로 시작하면, 더 낯설고 복잡해 보입니다. 왠지 꼭 그런 도구가 있어야 개발할 수 있을 것 같은 기분이 들죠. 그래서, 오히려 처음 OSGi 개발을 시작하거나 공부할 때는 PDE를 사용하지 않는게 더 좋은 방법이라고 생각합니다. 최소한의 도구만을 사용하는것이 오히려 OSGi 학습에 도움이 될 수 있습니다.

또한, 도구들은 어느정도 학습자로써 반드시 알아야 할 것을 감추는 경향이 있습니다. 도구를 사용하는 것은 좋치만, 마치 자바를 배울 때 javac Hello.java 랑 java Hello도 안 해보고 이클립스에서 Run As -> Java Application만 실행하는 것에는 큰 차이가 있듯이..말이죠.

그래서 OSGi 학습을 할 때 권장하는 도구는 최소한의 자바 프로젝트 편집기 + bnd 입니다. bnd는 MANIFEST.MF 생성과, 해당 프로젝트를 번들로 묶어주는 역할을 합니다. MANIFEST.MF 파일을 bnd로 만드는 이유는 MANIFEST.MF 파일이 단순한 텍스트 파일이 아니기 때문입니다. 한 행당 길이 제한이 있으며, 사용할 수 있는 헤더와 값을 지켜서 만들어야 합니다. bnd는 그런 불편함을 최소화 해줍니다. 그리고 번들로 만들어 주는 기능을 제공하는 이유는 이 MANIFEST.MF 파일이 jar 파일의 젤 상위 META-INF라는 폴더의 젤 처음에 위치해야 합니다. 그래야 일반 jar가 아닌 OSGi 번들로 인식합니다. 그렇게 패키징 해주는 기능을 제공하는 겁니다.

물론 Maven을 사용한다면, 이야기가 조금 달라집니다. 이때는 M2Eclipse 기반의 메이븐 프로젝트 + 메이븐 번들 플러그인입니다. 메이븐 번들 플러긴은 bnd 툴을 그대로 메이븐 플러긴으로 만든 것인데, 이 플러긴이 메이븐 페이스(phase)에 끼워져있어서, 해당 mvn package를 실행할 때, 해당 프로젝트를 번들화 하는 작업이 추가됩니다. 번들화라고 해봤자, MANIFEST.MF를 생성해서 제 위치에 넣어주는 것 뿐입니다. 따라서 Maven 프로젝트 관리 + 플러긴 하나로 OSGi 개발을 할 수 있습니다.

bnd에서 MANIFEST.MF 파일을 만들기 위한 설명서로 .bnd 파일을 만드는데, 이 파일은 properties 파일 처럼 키= 값 형태 입니다. 이 때 사용하는 키는 Manifest 헤더와 비슷한 것들이 많기 때문에 Manifest 헤더를 이해하는데 도움이 되고, 이클립스 플러긴으로 사용할 수도 있어서 .bnd 파일을 우클릭하면 make bundle이라는 메뉴가 생기는데 이것을 클릭하면 바로 MANIFEST.MF 파일 생성하고 해당 프로젝트를 번들로 만들어줍니다. 이클립스에서 export 하면 길고 긴 마법사 쭉 따라가야 하는데 그런 불편함이 없죠. 그야말로 OSGi 학습과 개발에 매우 유용한 툴이 아닌가 싶습니다.

OSGi를 학습하시는 분들에게 PDE 보다는 bnd 사용을 권해 보면서 마무리 하겠습니다.

2008/06/22 - [Spring DM/exercise] - bnd를 소개합니다.
2008/07/08 - [Screen Casting] - Eclipse에서 bnd 사용해서 번들 만들기
2008/07/10 - [Spring DM/exercise] - bnd 사용해서 API 가져오기(Import)
2008/07/13 - [Spring DM/exercise] - bnd에 번들 실행환경 설정하기
2008/08/18 - [Spring DM/exercise] - pom.xml에서 bnd 설정 파일 분리하기


top

TAG Bnd, OSGi, pde

Write a comment.


pom.xml에서 bnd 설정 파일 분리하기

Spring DM/exercise : 2008.08.18 15:29


사용자 삽입 이미지


bnd 설정 파일을 pom.xml에서 분리하고 pom.xml의 bnd 플러긴 설정은 다음과 같이 수정합니다.

            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <version>1.4.0</version>
                <configuration>
                    <instructions>
                        <_include>-osgi.bnd</_include>
                    </instructions>
                </configuration>
            </plugin>       

pom.xml은 훨씬 가벼워지고, bnd 설정과 pom.xml을 유지보수 할 때도 이렇게 나눠 두는게 좋을 듯 합니다.
top

TAG Bnd, maven

Write a comment.


bnd 사용해서 API 가져오기(Import)

Spring DM/exercise : 2008.07.10 22:48


번들이 사용할 모든 라이브러리는 MANIFEST.MF 파일의 Import-Package에 기술 되어야 한다.

위의 문장은 맞는 문장일까 틀린 문장일까? 틀렸다. 예외가 있다. 바로 java.* 이하의 패키지들은 기술하지 않아도 된다. 별도의 import 없이도 사용할 수 있기 때문에 Import-Package에 굳이 명시할 필요가 없다. 하지만.. javax.*은 Import-Package에 명시해줘야 한다. javax.swing 이나 javax.awt  같은 것 들.. 또는 org.xml.sax와 같은 것들도 물론 명시적으로 선언해 줘야겠다.

그럼 bnd 설정 파일에는 어떻게 설정할까? bnd에도 Import-Package라는 헤더가 있고 필요한 모든 패키지를 import 하도록 * 로 설정해주면 된다.

Import-Package: *

이렇게.. 하지만 이미 이렇게 기본값(CoC)으로 설정되어 있어서 위의 설정을 아예 적지 않아도 알아서 저런 설정이 있는 것으로 인식해서 MANIFEST.MF 파일의 Import-Package를 만들어 준다. 좋다 좋아..

그래도 Import-Package: 헤더를 bnd  설정에서 사용해야 하는 경우가 있는데 바로. 버전을 명시할 때다. 개발 중이 아니라면 버전은 왠만해선 명시해 주는게 베스트 프랙티스라고 생각된다. 버전은 항상 범위로 설정된다. 보통 다음과 같다.

또 하나 필수 여부를 설정할 때도 Import-Package를 사용해야 한다. 기본은 필수 인데, 필수가 아니게 설정하고 싶을 때는 명시적 설정 해줘야 한다.

Import-Package: org.apache.log4j*;version="[1.2.0,1.3.0]",\
                         javax.swing*;resolution:=optional,\
                         *

위의 설정은 log4j 패키지 버전 1.2.0 이상 1.3.0 이하에 있는 클래스나 리소스를 참조하도록 설정했고, swing 패키지는 굳이 없어도 이 번들이 RESOLVE 상태가 되는데 지장이 없도록 설정했다. 마지막으로 그 외 필요한 모든 패키지들은 필수고 버전은 [0.0.0, *] 이렇게 설정되어서 어떤 버전이든 상관 없이 있기만 하면 된다.

마지막으로 Import-Package에 패키지 명을 명시적으로 선언하는 경우가 있는데, 특정 패키지를 아예 빼버리거나 무조건 추가한다. 왜일까? 특정 패키지를 빼는 경우는 번들의 코드 중에 일부는 절대로 실행이 되지 않을 꺼라는 전제가 있다면 그 부분에서 사용한 패키지를 굳이 Import 할 필요는 없을 것이다. 그리고 왜 bnd가 알아서 필요한 패키지를 찾아서 (MANIFEST.MF 에 있는) Import-Package 헤더에 추가해 줄텐데 명시적으로 등록을 하는 경우가 생길까? 그건 동적으로 로딩할 클래스 때문이다. 그런 클래스들을 담고 있는 패키지는 햇갈리게 * 를 사용하지 말고 명시적으로 전체 패키지 명을 적어주자.


top

Write a comment.


bnd 사용해서 API 공개(Export) 하기

Spring DM/exercise : 2008.07.10 22:17


Export-Package 헤더를 사용하면 된다. 예를 들어 다음과 같이..

Export-Package: whiteship.service.*;version=1.0.0

뒤에 버전은 해당 패키지를 1.0.0 버전으로 공개하겠다는 설정이다. 버전에 대해서는 조금 있다가 정리하자. bnd가 저 설정을 읽으면 다음 작업을 하게 된다.

1. 해당 JAR(번들) 안에 명시한 패키지가 들어있는지 검사한다.
2. MANIFEST.MF 파일에 대상이 되는 패키지를 Export-Package 헤더에 추가한다.

*와 !를 적절히 사용해서 다음과 같이 작성할 수 도 있다.

Export-Package: !com.*, *

com. 이하 모든 패키지는 제외하고 그 나머지 패키지들만 공개하겠다는 설정이다. 이 얼마나 간단한가.. 귿!
top

Write a comment.


Spring Dynamic Modules Maven Archetype

Spring DM/Appendix D : 2008.07.09 11:16


스프링 DM은 메이븐 아키타입archetype을 제공하여 스프링 DM 번들 개발 시에 사용할 수 있는 자바 프로젝트 기본 틀을 제공한다. 아키타입을 실행하려면 다음의 명령어를 사용하면 된다.

mvn archetype:generate

메이븐 플러그인이 가용한 archetype을 보여줄 것이다. 그 중에서 spring-osgi-bundle-archetype을 선택하면 된다.(현재 32번으로 설정되어 있다.) 그리고 프로젝트에 필요한 몇 가지 정보를 입력한다.(그룹id, 아티팩트id, 버전, 패키지) 가용한 모든 아키타입과 버전은 여기를 참조하라.

물론 archetype:create를 사용해서 직접 아키타입을 설정하여 프로젝트를 생성할 수도 있다.

mvn archetype:create \
-DarchetypeGroupId=org.springframework.osgi \
-DarchetypeArtifactId=spring-osgi-bundle-archetype \
-DarchetypeVersion=   \
-DgroupId=<your-project-groupId>  \
-DartifactId=<your-project-artifactId> \
-Dversion=<your-project-version>

(과연 누가 저렇게 쓸까;;; 오타 없아 커맨드 창에 저걸 전부 입력 할 수 있는 사람~?)

둘 모두 같은 프로젝트 구조를 생성해준다. 그 안에 두 개의 스프링 설정 파일 src/main/resources/META-INF/spring/bundle-context.xml 와 src/main/resources/META-INF/spring/bundle-context-osgi.xml 가 있다. 프로젝트는 OSGi 번들로 패키지 형태가 설정되어 있다.

프로젝트에 MANIFEST.MF 파일이 없는데, 이 건 메이븐의 bnd 플러그인으로 자동 생성한다. 따라서 번들을 생성하고 싶으면 다음과 같이 하면 된다.

mvn package

번들 말고, MANIFEST.MF 파일만 생성하고 싶을 때는 다음과 같이 한다.

mvn org.apache.felix:maven-bundle-plugin:manifest

D.1. 생성한 프로젝트 살펴보기
  • OSGi 번들로 패키징 함.
  • MATA-INF/MANIFEST.MF 는 자동 생성함.
  • src/main/java/<package> 번들이 공개할 패키지
  • src/main/java/<package>/internal 번들이 공개하지 않을 패키지
  • src/main/resources/META-INF/spring/bundle-context.xml 번들 내부에서 사용할 스프링 설정 파일
  • src/main/resources/META-INF/spring/bundle-context-osgi.xml OSGI 관련 스프링 설정 파일
  • .project, .classpath, 그리고 build.properties 파일은 이 프로젝트를 이클립스 PDE 플러긴 프로젝트로 인식하게 해 줌.



'Spring DM > Appendix D' 카테고리의 다른 글

Spring Dynamic Modules Maven Archetype  (0) 2008.07.09
top

Write a comment.


Eclipse에서 bnd 사용해서 번들 만들기



top

Write a comment.


bnd를 소개합니다.

Spring DM/exercise : 2008.06.23 23:25


bnd는 겉보기에는 간단한 jar 파일 하나지만, 사실 이클립스 플러그인인데다가, Ant 태스크 정의를 가지고 있고, Maven 플러그인이며, 실제 독립적으로 어떤 기능을 수행하는 Java 애플리케이션이기도 하다. 그야말로 본좌라고 할 수 있다.

http://www.aqute.biz/Code/Download

위 링크에 가면 bnd-버전.jar 파일을 바로 다운받을 수 있습니다. 간단하군요. 다른 프로젝트들처럼 zip 파일로 샘플이며 문서며 소스 코드도 묶어두지 않고 바로 jar 파일입니다.

흠...사용법(콜솔 명령어, Eclipse 플러긴, Ant 스크립트, Maven 플러긴)은

http://www.aqute.biz/Code/Bnd

위의 링크 하단에 있습니다.

top

TAG Bnd, OSGi
  1. Favicon of http://gerions.egloos.com BlogIcon 윤걸 2008.06.24 09:04 PERM. MOD/DEL REPLY

    bnd 면 build and deploy 의 약자 정도 되려나?? 왠지 그런 생각이 드네.. ㅎㅎㅎ

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.06.24 10:13 PERM MOD/DEL

    그냥 번들 줄임말이요.ㅋㅋㅋ
    BuNDle.

Write a comment.


OSGi 번들 만들기 2

Spring DM/etc : 2008.04.08 21:54


참조 : Creating OSGi bundle

OSGi 메타데이터 작성하기

손으로
손수 OSGi 메타데이터를 작성하는 일은 비추.
한 줄당 72 스페이스를 넘으면 안 된다.
META-INF/MANIFEST.MF 파일이 압축파일 젤 위에 있어야 한다.
이 방법은 정말 정말 다른 방법이 없을 때나 사용하라.

Bnd
Bnd는 BuNDle 도구로 Peter Kriens(OSGi Technical Officer)님께서 만들었다. OSGi R4 번들용 메타데이터를 만들어주는 도구다. 멋진건 bnd.jar 파일 자체가 실행가능한 파일인데다가, Ant 태스크도 가지고 있고, 이 거 자체로 이클립스 플러그인이기 때문에, Eclipse의 plugins 폴더에 넣으면 번들 만들어 주는 메뉴가 생긴다.

(와.. 정말 죽인다.)

이걸 사용해서, 클래스들을 OSGi 번들로 만들 수도 있고, 이클립스 프로젝트를 OSGi 번들로 만들 수도 있고, 기존의 JAR 파일을 OSGi 번들로 만들 수 도 있다.

예제가 있는데 이건 실습하면서 해보게 생략합니다.

java -jar bnd.jar print c3p0-0.9.1.2.jar

java -jar bnd.jar wrap c3p0-0.9.1.2.jar

java -jar bnd.jar wrap -properties c3p0-0.9.1.2.bnd c3p0-0.9.1.2.jar

Maven용 번들 플러그인

Apache Felix Bundle Plug-in은 Bnd와 Maven2를 연동할 수 있는 메이븐 플러그인이다. 메이븐의 POM에 해당 프로젝트가 필요로 하는 라이브러리 정보가 들어있기 떄문에, Bnd가 MANIFEST를 작성할 때 필요한 추가 정보를 POM을 보고 생성할 수 있다.

예제가 있는데.. 이것도 실습해보기 위해 생략합니다.

(아.. 정말 Maven의 POM이 유용하게 쓰이겠군. 버전도 있지, optional인지도 있지, 캬.. 죽이는데.. OSGi랑  Maven 이랑 찰떡궁합이였군!!!)

Bnd가 번들로 패키징 할 때, 클래스패스에 있는 모든 클래스를 묶어버리는 것을 주의해야 한다. Bnd가  Export/Import 패키지를 보고서 생성할 jar파일에 추가할 라이브러리를 추가/제거 하긴 하는데, 패턴 매칭을 잘 해서 실제로 포함할 패키지만 가지고 묶을 수 있도록 설정을 잘 해야한다.

별도 개발, in-house 툴

바이트코드 분석을 기반으로 새로운 툴을 만들어 사용해도 된다. 스프링은 ASM 기반 바이트 코드 파서를 사용해서 테스트 프레임워크를 만들었다. 보다 효율적으로 간단한 MENIFEST.MF 파일을 만들려고..

OSGi 저장소 사용하기

기존의 JAR를 Bnd를 사용하여 새로운 OSGi 번들로 만들기 전에, 이미 OSGi 저장소에 존재할 수 있으니 거기서 찾아서 사용해도 된다.

OSGi Bundle Repository(ORB)
Eclipse Orbit
Apache Felix Commons
Apache OSGified projects

top

Write a comment.