SlideShare a Scribd company logo
1 of 48
Download to read offline
JBoss AS 7 / EAP 6
modules and class loading


                     Takayoshi Kimura
 Senior Software Maintenance Engineer
      Global Support Services, Red Hat
The Class Path is Dead.



          2
3
Agenda
●   クラスローディングの基本
●   JBoss Modules と MSC
●   JBoss 6 のクラスローディング
●   ユースケース別クラスローディング設定
●   まとめ




                   4
クラスローディングの基本



     5
クラスパス

●   特定のクラスローダがクラスをロードす
    るパスを示す用語
●   大抵「システムクラスパス」を指す
    ●   System Class Loader で利用される
        -classpath オプション値
●   ごくまれにアプリケーションクラスパス



                     6
クラスローダ種別

●   Bootstrap Class Loader
    ●   コア API
●   Extension Class Loader
    ●   Extension Mechanism
●   System Class Loader
    ●   -classpath
●   Application Class Loader
    ●   ユーザレベルクラスローダ
                        7
状況によるクラスローダの呼び名

●   Initiating Class Loader
    ●   Foo.class.getClassLoader()
●   Parent Class Loader
    ●   classLoader.getParent()
●   Thread Context Class Loader
    ●   Thread.currentThread().
        getContextClassLoader()


                          8
システムクラスローダ

      Bootstrap


      Extension


       System



          9
クラスローダの確認
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
システムクラスローダ

●   同一ライブラリの異なるバージョンが扱
    えない
●   見えてはいけないクラスやリソースが見
    えてしまう
●   クラスローダの作りなおしによるクラス
    の再ロードができない



            12
Java EE の階層型クラスローダ


          System

         Container

   EAR               EAR

   WAR               WAR

             13
Java EE の階層型クラスローダ

●   異なるバージョンを扱える
●   アプリケーション毎のクラスローダ再作
    成によるクラス再ロード可能




            14
Java EE の階層型クラスローダ

●   複雑
●   クラス検索が遅い
●   重複配置
●   ロード順によるデッドロック
●   クラス共有
●   問題を回避するための仕組みがさらに複
    雑度を増してしまう悪循環

               15
以上設計ミス



  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 のリポジトリと類似
●   モジュールのリソース (jar ファイルなど )
    と、ディスクリプタ module.xml を配置


                     23
モジュールディスクリプタ
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
import と export


     A                  B            C



                            export

     A            B (+ C)            C



                   25
JBoss MSC

●   Modular Service Container
●   JBoss Modules 上にサービス層を提供
●   API
    ●   ServiceContainer
    ●   Service
    ●   ServiceController
●   サービスの追加、削除、依存関係の管
    理、インストール、ステート管理
                            26
JBoss EAP 6 の
クラスローディング


      27
JBoss EAP 6 のクラスローディング

●   デプロイされたものもモジュールとなる
    ●   deployment.mywar.war
    ●   deployment.myear.ear.mywar.war
    ●   ローカルモジュールに対し、サービスモ
        ジュールと呼ばれる
●   デプロイされたアプリケーションに応じ
    て必要な依存モジュールが自動 import
    ●   EJB が含まれていれば EJB 関連の API

                     28
JBoss EAP 6 のクラスローディング

●   WAR は一つのモジュール扱い
    ●   WEB-INF/classes, WEB-INF/lib 内の jar は同
        じモジュールクラスローダでロードされる
●   EAR
    ●   EAR/lib は一つのモジュールとなる
    ●   サブデプロイメント同士もデフォルトで参
        照可能
        ●   EE 仕様には反しているが、仕様が微妙

                       29
デプロイメントとモジュール

 EAR   EAR/lib


       EJB1.jar


       EJB2.jar

                  WAR のみ片方向 import
        WAR       以前と同様、 WAR 内の
                  クラスは他から参照不可


        30
デプロイメントに対する
クラスローディング優先順
●   システムモジュール
    ●   コンテナが import
●   ユーザモジュール
    ●   アプリケーションで import
●   ローカルリソース
●   デプロイメント内リソース


                       31
デプロイメントに対する
クラスローディングのカスタマイズ
●   META-INF/jboss-deployment-structure.xml
    ●   WAR の場合は WEB-INF
    ●   おすすめ
●   グローバルモジュール
●   META-INF/MANIFEST.MF
    ●   Dependencies: org.slf4j



                          32
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
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
lib/ext ディレクトリ

●   $JBOSS_HOME/lib/ext ディレクトリ
    ●   lib ディレクトリ自体にはまったく意味はな
        い
    ●   jar を置いても何も起こらない
●   Extension Mechanism
    ●   lib/ext ディレクトリに jar を配置
    ●   マニフェストエントリ Extension-List で参照


                     35
モジュール依存関係のデバッグ

●   JMX
    ●   ローカルモジュール
        ●   jboss.modules:type=ModuleLoader,name=Local
            ModuleLoader-3 dumpAllModuleInformation
    ●   デプロイメント ( サービスモジュール )
        ●   jboss.modules:type=ModuleLoader,name=Servic
            eModuleLoader-5 dumpAllModuleInformation




                            36
コンテナ側モジュールの利用

●   利用可能
    ●   Java EE 関連 API
    ●   ロギング API
    ●   拡張ポイント
●   利用不可能
    ●   その他全てのサードパーティモジュール



                         37
ユースケース別
クラスローディング設定


     38
ユースケース別
クラスローディング設定
●   プロパティファイル
●   既存の WAR
●   共有ライブラリ
●   他モジュールのアノテーションスキャン




              39
プロパティファイル

●   基本は 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
プロパティファイル

●   グローバルモジュールとして参照

<subsystem xmlns="urn:jboss:domain:ee:1.0">
  <global-modules>
    <module name="conf" slot="main" />
  </global-modules>
</subsystem>




                                41
プロパティファイル

●   jboss-deployment-structure.xml から参照

<jboss-deployment-structure>
  <deployment>
    <dependencies>
      <module name="conf" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>




                                42
既存の WAR

●   フレームワークやライブラリを利用した
    多数の jar ファイルを含むレガシーな
    WAR ファイル
    ●   アプリケーション EAR/WAR 内に依存 jar が
        全て含まれている
●   基本的にはクラスローディングに関して
    は無修正で OK


                   43
共有ライブラリ

●   既存のアプリケーションが共有ライブラ
    リを利用している
    ●   アプリケーション EAR/WAR 内に依存 jar が
        全て含まれていない
●   共有ライブラリをモジュール化
●   モジュール依存を定義



                   44
他モジュールを JBoss の
アノテーションスキャン対象にする
●   jandex を利用して jar にアノテーションイ
    ンデックスを事前に作成
●   アノテーションを import
<jboss-deployment-structure>
  <deployment>
    <dependencies>
      <module name="foo.bar" annotations="true"/>
    </dependencies>
  </deployment>
</jboss-deployment-structure>




                                45
まとめ



 46
まとめ

●   JBoss Modules / JBoss EAP 6 の
    クラスローディング
    ●   シンプル
    ●   高速
    ●   フレキシブル




                    47
Thanks
Questions?


    48

More Related Content

What's hot

[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)
[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)
[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)Amazon Web Services Japan
 
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
20191016 AWS Black Belt Online Seminar Amazon Route 53 ResolverAmazon Web Services Japan
 
基礎からのEBS
基礎からのEBS基礎からのEBS
基礎からのEBS宗 大栗
 
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方Recruit Lifestyle Co., Ltd.
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
[AWSマイスターシリーズ] Amazon SQS / SNS
[AWSマイスターシリーズ] Amazon SQS / SNS[AWSマイスターシリーズ] Amazon SQS / SNS
[AWSマイスターシリーズ] Amazon SQS / SNSAmazon Web Services Japan
 
20210526 AWS Expert Online マルチアカウント管理の基本
20210526 AWS Expert Online マルチアカウント管理の基本20210526 AWS Expert Online マルチアカウント管理の基本
20210526 AWS Expert Online マルチアカウント管理の基本Amazon Web Services Japan
 
AWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAmazon Web Services Japan
 
20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation 20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation Amazon Web Services Japan
 
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ UndertowについてYoshimasa Tanabe
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方Yoshiyasu SAEKI
 
Amazon s3へのデータ転送における課題とその対処法を一挙紹介
Amazon s3へのデータ転送における課題とその対処法を一挙紹介Amazon s3へのデータ転送における課題とその対処法を一挙紹介
Amazon s3へのデータ転送における課題とその対処法を一挙紹介Tetsunori Nishizawa
 
Java EE から Quarkus による開発への移行について
Java EE から Quarkus による開発への移行についてJava EE から Quarkus による開発への移行について
Java EE から Quarkus による開発への移行についてShigeru Tatsuta
 
왕초보를 위한 도커 사용법
왕초보를 위한 도커 사용법왕초보를 위한 도커 사용법
왕초보를 위한 도커 사용법GeunCheolYeom
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5Takahiro YAMADA
 
Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성 Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성 rockplace
 

What's hot (20)

[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)
[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)
[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)
 
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
 
基礎からのEBS
基礎からのEBS基礎からのEBS
基礎からのEBS
 
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
Java11へのマイグレーションガイド ~Apache Hadoopの事例~
Java11へのマイグレーションガイド ~Apache Hadoopの事例~Java11へのマイグレーションガイド ~Apache Hadoopの事例~
Java11へのマイグレーションガイド ~Apache Hadoopの事例~
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 
[AWSマイスターシリーズ] Amazon SQS / SNS
[AWSマイスターシリーズ] Amazon SQS / SNS[AWSマイスターシリーズ] Amazon SQS / SNS
[AWSマイスターシリーズ] Amazon SQS / SNS
 
20210526 AWS Expert Online マルチアカウント管理の基本
20210526 AWS Expert Online マルチアカウント管理の基本20210526 AWS Expert Online マルチアカウント管理の基本
20210526 AWS Expert Online マルチアカウント管理の基本
 
AWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormation
 
20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation 20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation
 
Metaspace
MetaspaceMetaspace
Metaspace
 
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
Amazon s3へのデータ転送における課題とその対処法を一挙紹介
Amazon s3へのデータ転送における課題とその対処法を一挙紹介Amazon s3へのデータ転送における課題とその対処法を一挙紹介
Amazon s3へのデータ転送における課題とその対処法を一挙紹介
 
Java EE から Quarkus による開発への移行について
Java EE から Quarkus による開発への移行についてJava EE から Quarkus による開発への移行について
Java EE から Quarkus による開発への移行について
 
왕초보를 위한 도커 사용법
왕초보를 위한 도커 사용법왕초보를 위한 도커 사용법
왕초보를 위한 도커 사용법
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성 Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성
 
Redis at LINE
Redis at LINERedis at LINE
Redis at LINE
 

Similar to JBoss AS 7 / EAP 6 modules and class loading

Module classloading
Module classloadingModule classloading
Module classloadingnekop
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-PE-BANK
 
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)torutk
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッションYuichi Hasegawa
 
Javaクラスファイルの読み方
Javaクラスファイルの読み方Javaクラスファイルの読み方
Javaクラスファイルの読み方y torazuka
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 
JBoss AS7 rev2
JBoss AS7 rev2JBoss AS7 rev2
JBoss AS7 rev2nekop
 
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)Yoshiro Tokumasu
 
プロビジョニングの今 ーフルマネージド・サービスを目指してー #cmdevio2016 #E
プロビジョニングの今 ーフルマネージド・サービスを目指してー  #cmdevio2016 #Eプロビジョニングの今 ーフルマネージド・サービスを目指してー  #cmdevio2016 #E
プロビジョニングの今 ーフルマネージド・サービスを目指してー #cmdevio2016 #EShuji Watanabe
 
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajoOpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajoTakahiro YAMADA
 
Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2shozon
 
AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)Akio Katayama
 
20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-public20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-publicAmazon Web Services Japan
 

Similar to JBoss AS 7 / EAP 6 modules and class loading (20)

Module classloading
Module classloadingModule classloading
Module classloading
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
Java 7
Java 7Java 7
Java 7
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
 
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッション
 
Javaクラスファイルの読み方
Javaクラスファイルの読み方Javaクラスファイルの読み方
Javaクラスファイルの読み方
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 
JBoss AS7 rev2
JBoss AS7 rev2JBoss AS7 rev2
JBoss AS7 rev2
 
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
 
Java in the World of Container by David Buck
Java in the World of Container by David BuckJava in the World of Container by David Buck
Java in the World of Container by David Buck
 
プロビジョニングの今 ーフルマネージド・サービスを目指してー #cmdevio2016 #E
プロビジョニングの今 ーフルマネージド・サービスを目指してー  #cmdevio2016 #Eプロビジョニングの今 ーフルマネージド・サービスを目指してー  #cmdevio2016 #E
プロビジョニングの今 ーフルマネージド・サービスを目指してー #cmdevio2016 #E
 
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajoOpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
 
Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2
 
Plugman code-reading
Plugman code-readingPlugman code-reading
Plugman code-reading
 
serverless
serverlessserverless
serverless
 
AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)
 
20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-public20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-public
 
Hello Java
Hello JavaHello Java
Hello Java
 

More from nekop

Java Drag Race Tuning
Java Drag Race TuningJava Drag Race Tuning
Java Drag Race Tuningnekop
 
JBoss AS7 rev3
JBoss AS7 rev3JBoss AS7 rev3
JBoss AS7 rev3nekop
 
Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2nekop
 
JBoss AS7
JBoss AS7JBoss AS7
JBoss AS7nekop
 
CDI, Seam 3 and Forge
CDI, Seam 3 and ForgeCDI, Seam 3 and Forge
CDI, Seam 3 and Forgenekop
 
Infinispan - Open Source Data Grid
Infinispan - Open Source Data GridInfinispan - Open Source Data Grid
Infinispan - Open Source Data Gridnekop
 
Iteratorパターン
IteratorパターンIteratorパターン
Iteratorパターンnekop
 
Proxy
ProxyProxy
Proxynekop
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
mod_cluster
mod_clustermod_cluster
mod_clusternekop
 

More from nekop (10)

Java Drag Race Tuning
Java Drag Race TuningJava Drag Race Tuning
Java Drag Race Tuning
 
JBoss AS7 rev3
JBoss AS7 rev3JBoss AS7 rev3
JBoss AS7 rev3
 
Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2
 
JBoss AS7
JBoss AS7JBoss AS7
JBoss AS7
 
CDI, Seam 3 and Forge
CDI, Seam 3 and ForgeCDI, Seam 3 and Forge
CDI, Seam 3 and Forge
 
Infinispan - Open Source Data Grid
Infinispan - Open Source Data GridInfinispan - Open Source Data Grid
Infinispan - Open Source Data Grid
 
Iteratorパターン
IteratorパターンIteratorパターン
Iteratorパターン
 
Proxy
ProxyProxy
Proxy
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
mod_cluster
mod_clustermod_cluster
mod_cluster
 

Recently uploaded

20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 

Recently uploaded (11)

20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 

JBoss AS 7 / EAP 6 modules and class loading

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