DevLOVE 20100823 EnterpriseOSGi

Preview:

DESCRIPTION

2010/8/23 DevLOVE モジュール指向勉強会の資料です

Citation preview

DevLOVE: モジュール指向勉強会エンタープライズ OSGi

2010/8/23須江 信洋 (@nobusue)

※ この資料は 2010/8/23 時点での公開情報に基づいて記載されています。また、資料の内容は個人としての見解を述べたものであり、所属する企業・組織が内容を保証するものではありません。

自己紹介氏名 : 須江 信洋 ( すえ のぶひろ )所属 : 日本 IBM ソフトウェア事業仕事 : JavaEE 関連のプリセールスお世話になっているコミュニティ

JJUG, JGGUG, JSUGその他

http://twitter.com/nobusueGroovy と猫が好きです

menuなぜ今 OSGi か?OSGi 概要エンタープライズ OSGi

なぜ今 OSGi ?

Answer:Java はモジュール指向プラットフォーム

じゃないから

モジュール指向を実現するには モジュール境界が定義できること

外部に公開するインターフェース モジュールに閉じたリソース 物理的なパッケージングの仕様

モジュール間の依存性管理が可能であること 依存先モジュールの明示 モジュールのバージョン管理 依存関係の解決

モジュールのライフサイクル管理が可能であること インストール / アンインストール 開始 / 停止 ライフサイクルイベントへの対応

Java の現状 モジュール境界が定義できること

クラスやメソッドの可視性だけでは制御が難しい public ではクラスローダー全体に公開されてしまう そもそも、 Java のクラスはモジュールとしては細かすぎ

JAR はモジュールとしては不十分 単に複数のクラスやリソースをまとめる機能のみ ロードされた後はクラスと同じ扱い

モジュール間の依存性管理が可能であること 静的な依存関係はコンパイルしてみないと分からない 実行時の依存関係は実行してみないと分からない バージョン管理機能はない

モジュールのライフサイクル管理が可能であること ロードしたクラスはアンロードできない ライフサイクルという概念はない ( ロードされたら直ちに有効と

なる )

7

OSGi の歴史 1999 年:「 Open Service Gateway Initiative 」が設立

当初は家庭や小規模オフィス向けのゲートウェイ装置で動作するサービスプログラムの実行基盤

2003 年:名称を「 OSGi Alliance 」に変更 対象を車載機器やモバイル端末、エンタープライズシステム

に拡大 2003 年: Eclipse 3.0 が

プラグイン管理システムとして OSGi 仕様を採用 Java の世界での知名度が一気に向上

2010 年: OSGi R4.2 の一部として Enterprise Specification公開 Java EE 環境で OSGi を活用するための拡張仕様 Spring Framework 由来の DI コンテナ機能も標準化

8

OSGi の提供する機能 Moduleレイヤー

依存関係の解決複数バージョンの管理

Life Cycleレイヤーモジュールの動的ロード

Serviceレイヤー Securityレイヤー

実行環境が依存関係を管理

同一モジュールの異なるバージョンが存在しても OK

JVM を起動したままモジュールの入れ替えが可能

9

OSGi におけるモジュール「 Bundle 」

Manifest-Version: 1.0Bundle-SymbolicName: com.ibm.jp.myappBundle-Name: My Application BundleBundle-Vendor: IBM JapanBundle-Version: 2.0.0Import-Package: com.ibm.jp.mylib1.ui;version="[1.2.0,1.3.0)", com.ibm.jp.mylib1.util;version="[1.2.0,1.3.0)"Export-Package: com.ibm.jp.myapp;version="2.0.0"Bundle-RequiredExecutionEnvironment: J2SE-1.5Bundle-Activator: com.ibm.jp.myapp.MyAppActivator

Manifest-Version: 1.0Bundle-SymbolicName: com.ibm.jp.myappBundle-Name: My Application BundleBundle-Vendor: IBM JapanBundle-Version: 2.0.0Import-Package: com.ibm.jp.mylib1.ui;version="[1.2.0,1.3.0)", com.ibm.jp.mylib1.util;version="[1.2.0,1.3.0)"Export-Package: com.ibm.jp.myapp;version="2.0.0"Bundle-RequiredExecutionEnvironment: J2SE-1.5Bundle-Activator: com.ibm.jp.myapp.MyAppActivator

Jar のマニフェストファイルにMetadata を記述

バンドルは OSGi Framework 実装が管理する「 Repository 」に登録されその管理下でロード・実行される

10

バージョン管理ImportExport

com.foo.bar

1.4.5

com.foo.bar

1.3.12

com.foo.bar

[1.2.0, 1.4.0)

com.foo.bar

[1.4.0, 1.5.0)

11

ライフサイクル管理

package com.ibm.jp.myapp;import org.osgi.framework.BundleActivator;import org.osgi.framework.BundleContext;public class MyAppActivator implements BundleActivator { public void start(BundleContext context) throws Exception { System.out.println("Bundle is starting."); } public void stop(BundleContext context) throws Exception { System.out.println("Bundle is stopping."); }}

package com.ibm.jp.myapp;import org.osgi.framework.BundleActivator;import org.osgi.framework.BundleContext;public class MyAppActivator implements BundleActivator { public void start(BundleContext context) throws Exception { System.out.println("Bundle is starting."); } public void stop(BundleContext context) throws Exception { System.out.println("Bundle is stopping."); }}

OSGi R4.2 Enterprise SpecOSGi Alliance Enterprise Expert

Group(EEG) によって定められたEnterprise 向けの仕様http://www.infoq.com/news/2010/03/osgi-

enterprise-42-released以下が規定されている

アプリケーションのアセンブリ・フォーマットの拡張

JavaEE コンテナ・サービスとの統合宣言的な DI 仕様 (Blueprint)

デプロイメント・モデル

OSGi Bundle(.jar)

OSGi Bundle(.jar)

OSGi Bundle(.jar)

Web App Bundle(.war)

EnterpriseBundle App

(.eba)

EnterpriseBundle App(.eba)

EnterpriseBundle App(.eba)

BusinessLevel

Application

VirtualHost

Context

Path

OSGimetadat

a

Bundle の入れ替え : WAS の例

14

バージョンを指定して保存⇒アプリケーション再起動で反映

Blueprint と宣言的サービス あるBundleが提供するサービスを、 Client(他のBundle)から

動的に参照 JNDIサービスにより、OSGiのサービスレジストリに JNDI経由でアク

セス可能

OSGi Bundle(.jar)

<blueprint xmlns:tx="http://www.ibm.com/appserver/schemas/8.0/blueprint/transactions" xmlns:jpa="http://www.ibm.com/xmlns/ibm-blueprint-jpa/v1.0.0"><bean id="blabberImpl" class="com.ibm.ws.eba.example.blabber.persistence.BlabberImpl"> <jpa:context property="entityManager" unitname="blabber" /> <tx:transaction method="*" value="Required"/></bean><service id="blabberService" ref="blabberImpl" interface="com.ibm.ws.eba.example.blabber.persistence.spi.BlabberUserInterface" /></blueprint>

[OSGI-INF/blueprint/xxx.xml]

InitialContext ic = new InitialContext(); return (BlabberUserInterface) ic.lookup("osgi:service/" + BlabberUserInterface.class.getName());

Client

OSGi の利点 (1)設計モデルと実行モデルの一致

設計モデル

実行モデル (Java)

A.jar B.jar

C.jar

A.jar B.jar

C.jar

flat classloader

実行モデル (OSGi)

A.jar B.jar

C.jar

classloader by bundle

OSGi の利点 (2)依存関係のトレーサビリティ

A.jar B.jar

C.jar D.jar

E.jarF.jar G.jar

モジュールを入れ替える際に影響のあるモジュールが機械的に特定できる

18

参考資料 OSGi R4.2 Specs

http://www.osgi.org/Download/Release4V42 Introduction to OSGi by Neil Bartlett

http://www.slideshare.net/njbartlett/introduction-to-osgi-tokyo-jug

"Enterprise OSGi in Action"(Manning) http://www.manning.com/alves/ PDF(MEAP版 ) が購入可能

エンタープライズ OSGi入門 : 第 1回 OSGi概要と実行環境の導入 http://

www.ibm.com/developerworks/jp/websphere/library/was/was7_fep_osgi/1.html