javaにおけるモジュラリティ元年
DESCRIPTION
QConTokyo2010でお話させていただいた資料です。写真を多用しているため、分からない部分はお気軽にメッセージをください。TRANSCRIPT
QCon Tokyo 2010 1
近藤寛喜株式会社チェンジビジョン開発部
JavaJavaにおけるにおけるモジュラリティ元年モジュラリティ元年
QCon Tokyo 2010 2
謝辞謝辞
• 参加を認めてくれた平鍋さん始め参加を認めてくれた平鍋さん始め• Change VisionChange Visionのみんなのみんな• 講演させてくださった講演させてくださったInfoQ JapanInfoQ Japanの皆様の皆様• 事前にレビューしてくださった事前にレビューしてくださった• 原田さん、安井さん、河村さん、原田さん、安井さん、河村さん、• 雄介さん、北條さん雄介さん、北條さん• ありがとうございました!ありがとうございました!
自己紹介
QCon Tokyo 2010 4
アジェンダアジェンダ
• モジュラリティの重要性モジュラリティの重要性• Project Jigsaw Project Jigsaw と と OSGiOSGi• モジュール設計の勘どころモジュール設計の勘どころ
QCon Tokyo 2010 5
アジェンダアジェンダ
• モジュラリティの重要性モジュラリティの重要性• Project Jigsaw Project Jigsaw と と OSGiOSGi• モジュール設計の勘どころモジュール設計の勘どころ
QCon Tokyo 2010 6
InfoQInfoQでも記事多数でも記事多数 !!!!
• Neil BartlettNeil Bartlett氏氏– Introduction of OSGiIntroduction of OSGi– Neil Bartlett on OSGi(Neil Bartlett on OSGi(インタビューインタビュー))
• Alex BletwittAlex Bletwitt氏氏– Modular JavaModular Javaシリーズシリーズ– Bundle.updateBundle.updateシリーズシリーズ
QCon Tokyo 2010 7
日本では・・・日本では・・・
未だ未だ情報少ない情報少ない
QCon Tokyo 2010 8
なぜモジュール化がなぜモジュール化が重要になってきたか?重要になってきたか?
ソフトウェアはソフトウェアは複雑複雑
http://www.flickr.com/photos/15928286@N07/2168229708/
http://www.flickr.com/photos/cytech/4386280055/
QQ:自動車の場合?:自動車の場合?
A:1A:1億億LOCLOC
http://www.flickr.com/photos/cytech/4386280055/
QCon Tokyo 2010 12
19901990
12001200億億((原文原文))http://users.jyu.fi/~koskinen/smcosts.htmhttp://users.jyu.fi/~koskinen/smcosts.htm
http://www.flickr.com/photos/royalport/416330036/
QCon Tokyo 2010 13
20002000
25002500億億((原文原文))http://users.jyu.fi/~koskinen/smcosts.htmhttp://users.jyu.fi/~koskinen/smcosts.htm
http://www.flickr.com/photos/listener42/3665881441/
QCon Tokyo 2010 14
7年毎に2倍((原文原文))http://users.jyu.fi/~koskinen/smcosts.htmhttp://users.jyu.fi/~koskinen/smcosts.htm
QCon Tokyo 2010 15
毎年11%↑
QCon Tokyo 2010 16
20102010
50005000億億
http://www.flickr.com/photos/thelastminute/4371562997/
QCon Tokyo 2010 17
20172017
11兆兆
http://www.flickr.com/photos/15928286@N07/2168229708/
大変大変
規模の拡大から来る複雑性を軽減する仕組みが必要
構造化指向も構造化指向もオブジェクト指向もオブジェクト指向も
複雑性を軽減させる仕組み複雑性を軽減させる仕組み
http://www.flickr.com/photos/procsilas/392877509/
見通しよく見通しよく整理する整理する
http://www.flickr.com/photos/cheltenham/4100341188/
QCon Tokyo 2010 22
システムの中にシステムの中にいくつかの境界を作り、いくつかの境界を作り、
分ける分ける→→モジュール化モジュール化
QCon Tokyo 2010 23
モジュラリティとは、モジュラリティとは、モジュールを使ってモジュールを使って
システムを構成することシステムを構成すること
QCon Tokyo 2010 24
モジュール化のレイヤモジュール化のレイヤ
OS
システム
APP
SOA
マイクロカーネル
???
モジュール化の利点モジュール化の利点 (1)(1)情報隠蔽の促進情報隠蔽の促進
http://www.flickr.com/photos/8011986@N02/2681415971/
モジュール化の利点モジュール化の利点 (2)(2)依存関係の整理依存関係の整理
http://www.flickr.com/photos/oddwick/1765661986/
モジュール化の利点モジュール化の利点 (3)(3)再利用を促進再利用を促進
http://www.flickr.com/photos/comedynose/4012525634/
QCon Tokyo 2010 28
再利用の二つの軸再利用の二つの軸
時間軸時間軸((使いつづける使いつづける ))
機能軸機能軸((機能機能 ::ライブラリ等ライブラリ等 ))
QCon Tokyo 2010 29
モジュール化の利点のまとめモジュール化の利点のまとめ
• 情報隠蔽の促進情報隠蔽の促進• →→実装を公開しないでもよい実装を公開しないでもよい• 依存関係を定義依存関係を定義• →→システムの動作に必須のものが分かるシステムの動作に必須のものが分かる• 再利用を促進再利用を促進• →→実装量を削減と継続利用の促進実装量を削減と継続利用の促進
JavaJavaだったら・・・だったら・・・http://www.flickr.com/photos/morberg/3146874095/
JARJARで運用で運用http://www.flickr.com/photos/alexkerhead/3123914969/
QCon Tokyo 2010 32
Q.Q.JARJARだけでだけでモジュールシステムを構成モジュールシステムを構成
できないの?できないの?
QCon Tokyo 2010 33
A.A.JARJARだけでだけでははモジュールシステムとしモジュールシステムとして運用するのは厳しいて運用するのは厳しい
QCon Tokyo 2010 34
JavaJavaのクラスロードモデルのクラスロードモデルブート
クラスローダ
A B C
D E F
G
拡張クラスローダ
アプリケーションクラスローダ
JAR
依存
中身を展開中身を展開http://www.flickr.com/photos/shareski/3481154470/
ごちゃごちゃ ごちゃ ごちゃ
http://www.flickr.com/photos/joiseyshowaa/2402764792/
QCon Tokyo 2010 37
VisibilityVisibilityととAccessibilityAccessibility参照性とアクセス可能性参照性とアクセス可能性
参照可能
参照可能とは、あるタイプが他のタイプを参照できるか?JARがVMに読み込まれた状態
タイプ=interface+class
QCon Tokyo 2010 38
VisibilityVisibilityととAccessibilityAccessibility参照性とアクセス可能性参照性とアクセス可能性
利用可能
参照可能
アクセス可能とは、モジュールの公開範囲を指す。
タイプ=interface+class
アクセス可能
アクセス可能範囲で整理アクセス可能範囲で整理http://www.flickr.com/photos/joiseyshowaa/2402764792/
QCon Tokyo 2010 40
モジュール化の欠点モジュール化の欠点
• 開発コスト開発コスト– 意識しない時の意識しない時の33倍倍
• 独立性の担保独立性の担保• 依存関係の整理依存関係の整理
• 規模が小さい時は規模が小さい時は×× →例 →例::設計したら設計したら11モジュールモジュール
宮本武蔵・五輪書より武器や流派にこだわるな
使うべき場所を見誤らないように
既存システムの既存システムのモジュール化モジュール化
http://www.flickr.com/photos/tanaka_juuyoh/4294409831/
難しい難しいhttp://www.flickr.com/photos/tanaka_juuyoh/4294409831/
モジュール化はモジュール化は早い時期から検討を早い時期から検討を
http://www.flickr.com/photos/alaina_marie/4377282773/
QCon Tokyo 2010 44
アジェンダアジェンダ
• モジュラリティの重要性モジュラリティの重要性• Project Jigsaw Project Jigsaw と と OSGiOSGi• モジュール設計の勘どころモジュール設計の勘どころ
QCon Tokyo 2010 45
Project JigsawProject Jigsawを一言でを一言で
• 次世代次世代JavaJava標準の標準の• モジュールシステムモジュールシステム
QCon Tokyo 2010 46
OSGiOSGiを一言で言うとを一言で言うと
モジュールシステムのモジュールシステムのデファクトスタンダードデファクトスタンダード
OSGi vsOSGi vsProject JigsawProject Jigsaw
http://www.flickr.com/photos/laurelfan/46009085/
協力協力http://www.flickr.com/photos/aidan_jones/1234618279/
QCon Tokyo 2010 49
EclipseCon 2010EclipseCon 2010にてにて
Project JigsawProject JigsawととOSGiOSGiの相互運用の相互運用→→OSGiOSGiのモジュールがのモジュールがJigsawJigsawでも使えるでも使えるOracleOracleの の Steve HarrisSteve Harris氏と氏とJeet Kaul Jeet Kaul 氏氏
QCon Tokyo 2010 50
Project JigsawProject Jigsaw
QCon Tokyo 2010 51
Project JigsawProject Jigsawとはとは
問題問題:Java:Javaプロセスの起動が遅いプロセスの起動が遅い→→起動時間・メモリフットプリントの改善したい起動時間・メモリフットプリントの改善したい
• JDKJDKクラスライブラリをモジュール化クラスライブラリをモジュール化• Java SEJava SEもモジュールで分割もモジュールで分割
– 起動時に必要なモジュール構成で起動時に必要なモジュール構成で
• Java7Java7の目玉の一つ!の目玉の一つ!
QCon Tokyo 2010 52
VisibilityVisibilityととAccessibilityAccessibility参照性とアクセス性参照性とアクセス性
利用可能
参照可能
アクセス可能とは、モジュールが公開しているか?識別子public/protected/default/privateにmodule追加publicとmoduleはmodule外への公開/非公開の区分
タイプ=interface+class
アクセス可能
QCon Tokyo 2010 53
メタデータに必要なものメタデータに必要なもの
• 名前名前• 依存関係依存関係
– 必要なもの必要なもの– 公開範囲公開範囲
• バージョンバージョン
QCon Tokyo 2010 54
JavaJava言語拡張言語拡張メタデータメタデータ
modulemodule M1 @ 1.0 { M1 @ 1.0 {• requires M2 @ 2.0, M3 @ 3.0;requires M2 @ 2.0, M3 @ 3.0;• provides M4 @ 4.0, M5 @ 5.0;provides M4 @ 4.0, M5 @ 5.0;• permits M6;permits M6;• class com.foo.bar;class com.foo.bar;• }}
module-info.java JSR294module-info.java JSR294
QCon Tokyo 2010 55
複雑に絡みあう複雑に絡みあうJDKJDK
http://www.flickr.com/photos/adc/411821495/
大変大変
Project JigsawProject Jigsaw絶賛開発中絶賛開発中
http://www.flickr.com/photos/tanaka_juuyoh/4294409831/
QCon Tokyo 2010 58
OSGiOSGi
QCon Tokyo 2010 59
OSGiOSGiとはとは
• Open Service Gateway initiativeOpen Service Gateway initiativeの略の略• 直訳「オープンなサービスゲートウェイの推進」直訳「オープンなサービスゲートウェイの推進」
• OSGi AllianceOSGi Allianceで標準化で標準化
• Dynamic Dynamic Module SystemsModule Systems for Java for Java
• JavaJavaのための動的なのための動的なモジュールシステムモジュールシステム
QCon Tokyo 2010 60
増える利用例増える利用例
QCon Tokyo 2010 61
astah*astah*の事例の事例
• 既存機能のカスタマイズや拡張既存機能のカスタマイズや拡張• モジュールによるプラグインシステムモジュールによるプラグインシステム
QCon Tokyo 2010 62
Linked inLinked inの事例の事例
• 約約22ヶ月かけて自社サービスをモジュール化ヶ月かけて自社サービスをモジュール化複数バージョンのモジュールを利用複数バージョンのモジュールを利用
http://www.springsource.com/files/uploads/datasheets/Linkedin-Case-Study.pdfhttp://www.springsource.com/files/uploads/datasheets/Linkedin-Case-Study.pdf
OSGiOSGiのの33大要素大要素モジュールシステムモジュールシステムサービス連携サービス連携動的動的 ((DynamicDynamic))
http://www.flickr.com/photos/yourdon/2921734152/
OSGiOSGiのの33大要素大要素モジュールシステムモジュールシステムサービス連携サービス連携動的動的 (Dynamic)(Dynamic)
http://www.flickr.com/photos/yourdon/2921734152/
QCon Tokyo 2010 65
OSGiOSGiを使ってを使って
モジュールシステムを構築すると、モジュールシステムを構築すると、
クラスローダの関係はこうなります。クラスローダの関係はこうなります。
QCon Tokyo 2010 66
OSGiOSGiのクラスロードモデルのクラスロードモデル
System
A B C
D E FJAR+メタデータ• Bundle(バンドル)
G
クラスローダにより区分けクラスローダにより区分けhttp://www.flickr.com/photos/joiseyshowaa/2402764792/
QCon Tokyo 2010 68
バージョンの異なるバージョンの異なるJARJARへの依存への依存• java -cp a.jar;b.jar;c.jar;a_v2.jarjava -cp a.jar;b.jar;c.jar;a_v2.jar• ((通常フラットなクラスパスの場合通常フラットなクラスパスの場合))
先に見つけた先に見つけたJARJARで解決で解決
app
a
Ext Boot
b c a2
QCon Tokyo 2010 69
バージョンの異なるバージョンの異なるBundleBundleへの依存への依存• OSGiOSGi環境下の場合環境下の場合
宣言された宣言されたBundleBundleで解決で解決
app
a
Ext Boot
b c
a2
System
QCon Tokyo 2010 70
Bundle = Bundle = JARJAR + + メタデータメタデータ
QCon Tokyo 2010 71
JARJARとしてとして使える使える
http://www.flickr.com/photos/suewaters/2011571473/
QCon Tokyo 2010 72
欠点欠点
• 独自のクラスロード構造独自のクラスロード構造– ContextClassLoaderContextClassLoaderを頼ったライブラリのを頼ったライブラリの
利用が困難利用が困難
• 対処法対処法::• →→クラスローダの入れ替えクラスローダの入れ替え• →→ライブラリ側で順次対応ライブラリ側で順次対応• →→OSGiOSGi実装での拡張実装での拡張
System
A B C
D E F
G
QCon Tokyo 2010 73
メタデータに必要なものメタデータに必要なもの
• 名前名前• 依存関係依存関係
– 必要なもの必要なもの– 公開範囲公開範囲
• バージョンバージョン
QCon Tokyo 2010 74
OSGiOSGiのメタデータの書き方のメタデータの書き方
META-INF/MANIFEST.MFMETA-INF/MANIFEST.MFに記述に記述 シンボル名 シンボル名:Bundle-SymbolicName:Bundle-SymbolicName
バージョン バージョン:Bundle-Version:Bundle-Version
依存関係 依存関係
必要なパッケージ 必要なパッケージ:Import-Package:Import-Package
公開パッケージ 公開パッケージ:Export-Package:Export-Package• ローカルクラスパスローカルクラスパス:Bundle-ClassPath:Bundle-ClassPath
QCon Tokyo 2010 75
VisibilityVisibilityととAccessibilityAccessibility参照性とアクセス性参照性とアクセス性
利用可能
参照可能
アクセス可能とは、モジュールが公開しているか?
MANIFEST.MFでアクセス可能範囲を宣言
タイプ=interface+class
アクセス可能
OSGiOSGiのの33大要素大要素モジュールシステムモジュールシステムサービス連携サービス連携動的動的 (Dynamic)(Dynamic)
http://www.flickr.com/photos/yourdon/2921734152/
QCon Tokyo 2010 77
Declarative ServiceDeclarative Service
• Consumer(Consumer(要求側要求側))ととProvider(Provider(供給側供給側))• ConsumerConsumerは、必要なは、必要なIFIFを宣言を宣言• ProviderProviderは供給できるは供給できるIFIFと、実装を宣言と、実装を宣言
POJOPOJO
QCon Tokyo 2010 78
DIDIコンテナ→コンテナ→OSGiOSGiコンテナコンテナ
サービスはサービスはDIDIパターンが非常に有効パターンが非常に有効
→→テスト容易性の向上テスト容易性の向上
インタフェースと実装を明確に分離インタフェースと実装を明確に分離
http://www.flickr.com/photos/danielspils/58586596/
QCon Tokyo 2010 79
Whiteboard-modelWhiteboard-model
QCon Tokyo 2010 80
ExtenderExtenderパターンパターン
• Declarative SeriviceDeclarative Seriviceには内部互換性には内部互換性
QCon Tokyo 2010 81
Declarative ServiceDeclarative Service実装実装• Equinox DSEquinox DS• Felix DSFelix DS• iPOJOiPOJO• Google Guice Google Guice peaberrypeaberry• Blueprint ServiceBlueprint Service系系
– Eclipse Gemini(Spring DM)Eclipse Gemini(Spring DM)– Apache AriesApache Aries
OSGiOSGiのの33大要素大要素モジュールシステムモジュールシステムサービス連携サービス連携動的動的 (Dynamic)(Dynamic)
http://www.flickr.com/photos/yourdon/2921734152/
QCon Tokyo 2010 83
DynamicDynamic
VMVM稼働中に稼働中にBundleBundleの構成を変更の構成を変更→→install,update,uninstall,start,stop,refreshinstall,update,uninstall,start,stop,refresh
実行中の実行中のBundleBundleの状態が見えるの状態が見える
http://www.flickr.com/photos/clearlyambiguous/165316414/
OSGiOSGiの実装の実装http://www.flickr.com/photos/yourdon/2921734152/
QCon Tokyo 2010 85
OSGiOSGiの実装の実装
• オープンソースプロジェクトがオープンソースプロジェクトが44種類種類
スタンスが異なる
QCon Tokyo 2010 86
EquinoxEquinox
• よみ:いくいのっくすよみ:いくいのっくす• 開発元開発元:Eclipse Foundation:Eclipse Foundation• EclipseEclipseの基盤の基盤OSGi Core Spec R4.2 OSGi Core Spec R4.2 の参照実装の参照実装
• 実践主義実践主義((仕様へフィードバック仕様へフィードバック))• アプリケーションの基盤向けアプリケーションの基盤向け
QCon Tokyo 2010 87
EquinoxEquinoxの特徴の特徴
• Eclipse-BuddyPolicyEclipse-BuddyPolicy– 境界を制御する宣言境界を制御する宣言– 例例::スクリプト言語、スクリプト言語、log4jlog4j
• Bundle-ActivationPolicyBundle-ActivationPolicy– BundleBundleが必要になるまでロードせず。が必要になるまでロードせず。– →→起動時間の改善起動時間の改善
QCon Tokyo 2010 88
Eclipse-BuddyPolicyEclipse-BuddyPolicy
System
A B C
DE
ModelF
JAR+メタデータ• Bundle(バンドル)
ScriptEngine
QCon Tokyo 2010 89
FelixFelix
• よみ:ふぇりっくすよみ:ふぇりっくす• 開発元開発元:Apache Foundation:Apache Foundation
OSGi Service Spec R4OSGi Service Spec R4を実装を実装
• 仕様への互換性を重視仕様への互換性を重視• 既存アプリケーションへの組み込みを視野既存アプリケーションへの組み込みを視野
QCon Tokyo 2010 90
FelixFelixの特徴の特徴
• 既存のアプリと既存のアプリとFelixFelix内の内のBundleBundleで連携で連携
QCon Tokyo 2010 91
knopflerfishknopflerfish
• よみよみ::ノプラフィッシュノプラフィッシュ• 開発元開発元:makewave:makewave• OSGi R3OSGi R3を実装済み を実装済み R4R4を実装中を実装中
商用サポートあり商用サポートあり
QCon Tokyo 2010 92
Concierge OSGiConcierge OSGi
• よみ:コンシェルジュよみ:コンシェルジュ• 開発元開発元:Sourceforge.net:Sourceforge.netのプロジェクトのプロジェクト• OSGi R3OSGi R3を実装を実装
• 組込向けに特化組込向けに特化– ファイルフットプリント等ファイルフットプリント等
QCon Tokyo 2010 93
Pax Runner Pax Runner
• Equinox,Felix,knopflerfish,ConciergeEquinox,Felix,knopflerfish,Conciergeのの• 切り替えをサポート切り替えをサポート
OSGiOSGiの導入効果の導入効果http://www.flickr.com/photos/yourdon/2921734152/
QCon Tokyo 2010 95
OSGiはすべてのメンバーでのソリューション作成を強力に支援。
その力のいくらかはシステムエンジニアリングを越えて拡大し、ソーシャルエ
ンジニアリングに及んでいます。
Equinoxのリード開発者Jeff McAffer氏の言葉
QCon Tokyo 2010 96
ソーシャルエンジニアリングとはソーシャルエンジニアリングとはチーム開発が変わっていく事チーム開発が変わっていく事
• 開発チーム毎に開発チーム毎にBundleBundleを担当を担当• プロセスや実装を独自に改善プロセスや実装を独自に改善
http://www.flickr.com/photos/jragon/299011871/
プラットフォームチーム アプリ開発チーム
QCon Tokyo 2010 97
ソーシャルエンジニアリングとはソーシャルエンジニアリングとはチーム開発が変わっていく事チーム開発が変わっていく事
• プラットフォームチームの提供プラットフォームチームの提供IFIFでで• アプリケーションを開発アプリケーションを開発
http://www.flickr.com/photos/jragon/299011871/
プラットフォームチーム アプリ開発チーム
QCon Tokyo 2010 98
ソーシャルエンジニアリングとはソーシャルエンジニアリングとはチーム開発が変わっていく事チーム開発が変わっていく事
• アプリチームは提供アプリチームは提供IFIFを拡張してを拡張して開発を進める事もできる開発を進める事もできる
http://www.flickr.com/photos/jragon/299011871/
プラットフォームチーム アプリ開発チーム
QCon Tokyo 2010 99
ソーシャルエンジニアリングとはソーシャルエンジニアリングとはチーム開発が変わっていく事チーム開発が変わっていく事
• 提供提供IFIFの拡張はプラットフォームにの拡張はプラットフォームにフィードバックフィードバック
http://www.flickr.com/photos/jragon/299011871/
プラットフォームチーム アプリ開発チーム
QCon Tokyo 2010 100
インテグレーションの手違いをインテグレーションの手違いを撲滅撲滅
http://www.flickr.com/photos/jragon/299011871/
アプリAチームPFチーム アプリBチーム
インテグレーション環境
集めたバイナリの間違いを実行時に確認できる。
QCon Tokyo 2010 101
Polyglot(Polyglot(多言語多言語 )OSGi)OSGi
System
A B C
JRuby Scala Groovy
G
JVM上の言語もモジュール対応進行中
BundleBundleのテストのテストhttp://www.flickr.com/photos/yourdon/2921734152/
QCon Tokyo 2010 103
単体テストと統合テスト単体テストと統合テスト
System
A B C
D E FJAR+メタデータ• Bundle(バンドル)
G
QCon Tokyo 2010 104
Mock ServiceMock Serviceをコンテナに注入をコンテナに注入
動作の大まかな確認動作の大まかな確認Mockito (http://mockito.org/)Mockito (http://mockito.org/)
Mock ServiceMock Serviceの注入の注入
http://www.flickr.com/photos/takuma104/4311374934/
QCon Tokyo 2010 105
Pax Exam Pax Exam
• 統合テスト用のツール統合テスト用のツール• BundleBundleの構成やの構成やOSGiOSGiコンテナの変更コンテナの変更
QCon Tokyo 2010 106
アジェンダアジェンダ
• モジュラリティの重要性モジュラリティの重要性• Project Jigsaw Project Jigsaw と と OSGiOSGi• モジュール設計の勘どころモジュール設計の勘どころ
良い垣根は良い隣人を育む良い垣根は良い隣人を育むby Jeff McAfferby Jeff McAffer
http://www.flickr.com/photos/tambako/3451214734/
依存関係を小さく依存関係を小さく
http://www.flickr.com/photos/tambako/3451214734/
QCon Tokyo 2010 110
まとめ:複雑なシステム→小さく・独立・組み合わせ
QCon Tokyo 2010 111
参考文献参考文献
QCon Tokyo 2010 112
何か質問は何か質問はございますか?ございますか?