JBoss AS 7 / EAP 6modules and class loading                     Takayoshi Kimura Senior Software Maintenance Engineer     ...
The Class Path is Dead.          2
3
Agenda●   クラスローディングの基本●   JBoss Modules と MSC●   JBoss 6 のクラスローディング●   ユースケース別クラスローディング設定●   まとめ                   4
クラスローディングの基本     5
クラスパス●   特定のクラスローダがクラスをロードす    るパスを示す用語●   大抵「システムクラスパス」を指す    ●   System Class Loader で利用される        -classpath オプション値●   ...
クラスローダ種別●   Bootstrap Class Loader    ●   コア API●   Extension Class Loader    ●   Extension Mechanism●   System Class Load...
状況によるクラスローダの呼び名●   Initiating Class Loader    ●   Foo.class.getClassLoader()●   Parent Class Loader    ●   classLoader.get...
システムクラスローダ      Bootstrap      Extension       System          9
クラスローダの確認public class Test {    public static void main(String... args) {        // System Class Loader        System.out....
システムクラスローダ●   モノリシック●   理解が簡単             11
システムクラスローダ●   同一ライブラリの異なるバージョンが扱    えない●   見えてはいけないクラスやリソースが見    えてしまう●   クラスローダの作りなおしによるクラス    の再ロードができない            12
Java EE の階層型クラスローダ          System         Container   EAR               EAR   WAR               WAR             13
Java EE の階層型クラスローダ●   異なるバージョンを扱える●   アプリケーション毎のクラスローダ再作    成によるクラス再ロード可能            14
Java EE の階層型クラスローダ●   複雑●   クラス検索が遅い●   重複配置●   ロード順によるデッドロック●   クラス共有●   問題を回避するための仕組みがさらに複    雑度を増してしまう悪循環              ...
以上設計ミス  16
17
JBoss Modules     18
モジュールクラスローダ        B1       B2  A          C   E  F          D        19
モジュールクラスローダ●   モジュールひとつに対して一つのクラス    ローダ●   各モジュールはランタイムで必要とする    依存モジュールを定義●   階層型ではなくグラフ構造●   「クラスパス」は存在しない            20
JBoss Modules●   モジュールクラスローダ環境●   モジュールを定義するための API や設定    ファイル●   シンプル●   超高速                21
モジュール●   クラスロードするときのひとまとまりの    単位●   通常は jar ひとつ●   複数の jar や、プロパティファイルなどの    リソースを含む場合も                  22
モジュールの配置●   ローカルモジュールディレクトリ    ●   $JBOSS_HOME/modules●   階層化されたモジュール名と一致する    ディレクトリ構造    ●   Maven のリポジトリと類似●   モジュールのリソ...
モジュールディスクリプタmodule.xml<module xmlns="urn:jboss:module:1.1" name="org.jboss.remoting3">    <resources>        <resource-roo...
import と export     A                  B            C                            export     A            B (+ C)          ...
JBoss MSC●   Modular Service Container●   JBoss Modules 上にサービス層を提供●   API    ●   ServiceContainer    ●   Service    ●   Se...
JBoss EAP 6 のクラスローディング      27
JBoss EAP 6 のクラスローディング●   デプロイされたものもモジュールとなる    ●   deployment.mywar.war    ●   deployment.myear.ear.mywar.war    ●   ローカル...
JBoss EAP 6 のクラスローディング●   WAR は一つのモジュール扱い    ●   WEB-INF/classes, WEB-INF/lib 内の jar は同        じモジュールクラスローダでロードされる●   EAR ...
デプロイメントとモジュール EAR   EAR/lib       EJB1.jar       EJB2.jar                  WAR のみ片方向 import        WAR       以前と同様、 WAR 内の...
デプロイメントに対するクラスローディング優先順●   システムモジュール    ●   コンテナが import●   ユーザモジュール    ●   アプリケーションで import●   ローカルリソース●   デプロイメント内リソース  ...
デプロイメントに対するクラスローディングのカスタマイズ●   META-INF/jboss-deployment-structure.xml    ●   WAR の場合は WEB-INF    ●   おすすめ●   グローバルモジュール● ...
jboss-deployment-structure.xml<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">  <deployment>    <de...
EE サブシステムのグローバルモジュール●   全てのデプロイメントにシステムモ    ジュールとして import<subsystem xmlns="urn:jboss:domain:ee:1.0">  <global-modules>   ...
lib/ext ディレクトリ●   $JBOSS_HOME/lib/ext ディレクトリ    ●   lib ディレクトリ自体にはまったく意味はな        い    ●   jar を置いても何も起こらない●   Extension M...
モジュール依存関係のデバッグ●   JMX    ●   ローカルモジュール        ●   jboss.modules:type=ModuleLoader,name=Local            ModuleLoader-3 dum...
コンテナ側モジュールの利用●   利用可能    ●   Java EE 関連 API    ●   ロギング API    ●   拡張ポイント●   利用不可能    ●   その他全てのサードパーティモジュール              ...
ユースケース別クラスローディング設定     38
ユースケース別クラスローディング設定●   プロパティファイル●   既存の WAR●   共有ライブラリ●   他モジュールのアノテーションスキャン              39
プロパティファイル●   基本は jar にまとめてアプリケーションと    一緒にデプロイ●   アプリケーションの外に置きたい場合は    モジュールにするmkdir -p $JBOSS_HOME/modules/conf/main/pro...
プロパティファイル●   グローバルモジュールとして参照<subsystem xmlns="urn:jboss:domain:ee:1.0">  <global-modules>    <module name="conf" slot="mai...
プロパティファイル●   jboss-deployment-structure.xml から参照<jboss-deployment-structure>  <deployment>    <dependencies>      <module ...
既存の WAR●   フレームワークやライブラリを利用した    多数の jar ファイルを含むレガシーな    WAR ファイル    ●   アプリケーション EAR/WAR 内に依存 jar が        全て含まれている●   基本...
共有ライブラリ●   既存のアプリケーションが共有ライブラ    リを利用している    ●   アプリケーション EAR/WAR 内に依存 jar が        全て含まれていない●   共有ライブラリをモジュール化●   モジュール依存...
他モジュールを JBoss のアノテーションスキャン対象にする●   jandex を利用して jar にアノテーションイ    ンデックスを事前に作成●   アノテーションを import<jboss-deployment-structure...
まとめ 46
まとめ●   JBoss Modules / JBoss EAP 6 の    クラスローディング    ●   シンプル    ●   高速    ●   フレキシブル                    47
ThanksQuestions?    48
Upcoming SlideShare
Loading in...5
×

JBoss AS 7 / EAP 6 modules and class loading

4,174

Published on

Slide used in JBoss partner technical seminar in Red Hat Tokyo

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,174
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
62
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

JBoss AS 7 / EAP 6 modules and class loading

  1. 1. JBoss AS 7 / EAP 6modules and class loading Takayoshi Kimura Senior Software Maintenance Engineer Global Support Services, Red Hat
  2. 2. The Class Path is Dead. 2
  3. 3. 3
  4. 4. Agenda● クラスローディングの基本● JBoss Modules と MSC● JBoss 6 のクラスローディング● ユースケース別クラスローディング設定● まとめ 4
  5. 5. クラスローディングの基本 5
  6. 6. クラスパス● 特定のクラスローダがクラスをロードす るパスを示す用語● 大抵「システムクラスパス」を指す ● System Class Loader で利用される -classpath オプション値● ごくまれにアプリケーションクラスパス 6
  7. 7. クラスローダ種別● Bootstrap Class Loader ● コア API● Extension Class Loader ● Extension Mechanism● System Class Loader ● -classpath● Application Class Loader ● ユーザレベルクラスローダ 7
  8. 8. 状況によるクラスローダの呼び名● Initiating Class Loader ● Foo.class.getClassLoader()● Parent Class Loader ● classLoader.getParent()● Thread Context Class Loader ● Thread.currentThread(). getContextClassLoader() 8
  9. 9. システムクラスローダ Bootstrap Extension System 9
  10. 10. クラスローダの確認public class Test { public static void main(String... args) { // System Class Loader System.out.println(Test.class.getClassLoader()); // System Class Loader System.out.println(ClassLoader.getSystemClassLoader()); // Extention Class Loader System.out.println(Test.class.getClassLoader().getParent()); // null == Bootstrap Class Loader System.out.println(ClassLoader.class.getClassLoader()); }} 10
  11. 11. システムクラスローダ● モノリシック● 理解が簡単 11
  12. 12. システムクラスローダ● 同一ライブラリの異なるバージョンが扱 えない● 見えてはいけないクラスやリソースが見 えてしまう● クラスローダの作りなおしによるクラス の再ロードができない 12
  13. 13. Java EE の階層型クラスローダ System Container EAR EAR WAR WAR 13
  14. 14. Java EE の階層型クラスローダ● 異なるバージョンを扱える● アプリケーション毎のクラスローダ再作 成によるクラス再ロード可能 14
  15. 15. Java EE の階層型クラスローダ● 複雑● クラス検索が遅い● 重複配置● ロード順によるデッドロック● クラス共有● 問題を回避するための仕組みがさらに複 雑度を増してしまう悪循環 15
  16. 16. 以上設計ミス 16
  17. 17. 17
  18. 18. JBoss Modules 18
  19. 19. モジュールクラスローダ B1 B2 A C E F D 19
  20. 20. モジュールクラスローダ● モジュールひとつに対して一つのクラス ローダ● 各モジュールはランタイムで必要とする 依存モジュールを定義● 階層型ではなくグラフ構造● 「クラスパス」は存在しない 20
  21. 21. JBoss Modules● モジュールクラスローダ環境● モジュールを定義するための API や設定 ファイル● シンプル● 超高速 21
  22. 22. モジュール● クラスロードするときのひとまとまりの 単位● 通常は jar ひとつ● 複数の jar や、プロパティファイルなどの リソースを含む場合も 22
  23. 23. モジュールの配置● ローカルモジュールディレクトリ ● $JBOSS_HOME/modules● 階層化されたモジュール名と一致する ディレクトリ構造 ● Maven のリポジトリと類似● モジュールのリソース (jar ファイルなど ) と、ディスクリプタ module.xml を配置 23
  24. 24. モジュールディスクリプタmodule.xml<module xmlns="urn:jboss:module:1.1" name="org.jboss.remoting3"> <resources> <resource-root path="jboss-remoting-3.2.8.GA-redhat-1.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="org.jboss.logging"/> <module name="org.jboss.marshalling" export="true"/> <module name="org.jboss.sasl" services="import"/> <module name="org.jboss.xnio" export="true"/> <module name="org.jboss.xnio.nio" services="import"/> </dependencies></module> 24
  25. 25. import と export A B C export A B (+ C) C 25
  26. 26. JBoss MSC● Modular Service Container● JBoss Modules 上にサービス層を提供● API ● ServiceContainer ● Service ● ServiceController● サービスの追加、削除、依存関係の管 理、インストール、ステート管理 26
  27. 27. JBoss EAP 6 のクラスローディング 27
  28. 28. JBoss EAP 6 のクラスローディング● デプロイされたものもモジュールとなる ● deployment.mywar.war ● deployment.myear.ear.mywar.war ● ローカルモジュールに対し、サービスモ ジュールと呼ばれる● デプロイされたアプリケーションに応じ て必要な依存モジュールが自動 import ● EJB が含まれていれば EJB 関連の API 28
  29. 29. JBoss EAP 6 のクラスローディング● WAR は一つのモジュール扱い ● WEB-INF/classes, WEB-INF/lib 内の jar は同 じモジュールクラスローダでロードされる● EAR ● EAR/lib は一つのモジュールとなる ● サブデプロイメント同士もデフォルトで参 照可能 ● EE 仕様には反しているが、仕様が微妙 29
  30. 30. デプロイメントとモジュール EAR EAR/lib EJB1.jar EJB2.jar WAR のみ片方向 import WAR 以前と同様、 WAR 内の クラスは他から参照不可 30
  31. 31. デプロイメントに対するクラスローディング優先順● システムモジュール ● コンテナが import● ユーザモジュール ● アプリケーションで import● ローカルリソース● デプロイメント内リソース 31
  32. 32. デプロイメントに対するクラスローディングのカスタマイズ● META-INF/jboss-deployment-structure.xml ● WAR の場合は WEB-INF ● おすすめ● グローバルモジュール● META-INF/MANIFEST.MF ● Dependencies: org.slf4j 32
  33. 33. jboss-deployment-structure.xml<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment></jboss-deployment-structure> 33
  34. 34. EE サブシステムのグローバルモジュール● 全てのデプロイメントにシステムモ ジュールとして import<subsystem xmlns="urn:jboss:domain:ee:1.0"> <global-modules> <module name="org.apache.commons.logging" /> <module name="org.apache.log4j" /> <module name="org.slf4j" /> </global-modules></subsystem> 34
  35. 35. lib/ext ディレクトリ● $JBOSS_HOME/lib/ext ディレクトリ ● lib ディレクトリ自体にはまったく意味はな い ● jar を置いても何も起こらない● Extension Mechanism ● lib/ext ディレクトリに jar を配置 ● マニフェストエントリ Extension-List で参照 35
  36. 36. モジュール依存関係のデバッグ● JMX ● ローカルモジュール ● jboss.modules:type=ModuleLoader,name=Local ModuleLoader-3 dumpAllModuleInformation ● デプロイメント ( サービスモジュール ) ● jboss.modules:type=ModuleLoader,name=Servic eModuleLoader-5 dumpAllModuleInformation 36
  37. 37. コンテナ側モジュールの利用● 利用可能 ● Java EE 関連 API ● ロギング API ● 拡張ポイント● 利用不可能 ● その他全てのサードパーティモジュール 37
  38. 38. ユースケース別クラスローディング設定 38
  39. 39. ユースケース別クラスローディング設定● プロパティファイル● 既存の WAR● 共有ライブラリ● 他モジュールのアノテーションスキャン 39
  40. 40. プロパティファイル● 基本は jar にまとめてアプリケーションと 一緒にデプロイ● アプリケーションの外に置きたい場合は モジュールにするmkdir -p $JBOSS_HOME/modules/conf/main/properties/cat $JBOSS_HOME/modules/conf/main/module.xml<module xmlns="urn:jboss:module:1.1" name="conf"> <resources> <resource-root path="properties"/> </resources></module> 40
  41. 41. プロパティファイル● グローバルモジュールとして参照<subsystem xmlns="urn:jboss:domain:ee:1.0"> <global-modules> <module name="conf" slot="main" /> </global-modules></subsystem> 41
  42. 42. プロパティファイル● jboss-deployment-structure.xml から参照<jboss-deployment-structure> <deployment> <dependencies> <module name="conf" /> </dependencies> </deployment></jboss-deployment-structure> 42
  43. 43. 既存の WAR● フレームワークやライブラリを利用した 多数の jar ファイルを含むレガシーな WAR ファイル ● アプリケーション EAR/WAR 内に依存 jar が 全て含まれている● 基本的にはクラスローディングに関して は無修正で OK 43
  44. 44. 共有ライブラリ● 既存のアプリケーションが共有ライブラ リを利用している ● アプリケーション EAR/WAR 内に依存 jar が 全て含まれていない● 共有ライブラリをモジュール化● モジュール依存を定義 44
  45. 45. 他モジュールを JBoss のアノテーションスキャン対象にする● jandex を利用して jar にアノテーションイ ンデックスを事前に作成● アノテーションを import<jboss-deployment-structure> <deployment> <dependencies> <module name="foo.bar" annotations="true"/> </dependencies> </deployment></jboss-deployment-structure> 45
  46. 46. まとめ 46
  47. 47. まとめ● JBoss Modules / JBoss EAP 6 の クラスローディング ● シンプル ● 高速 ● フレキシブル 47
  48. 48. ThanksQuestions? 48
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×