SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler 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

Mais conteúdo relacionado

Mais procurados

これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?Takahiro YAMADA
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)NTT DATA Technology & Innovation
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
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
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)NTT DATA Technology & Innovation
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...NTT DATA Technology & Innovation
 
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)Yuichi Murata
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座Samir Hammoudi
 
アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門Akira Shimosako
 
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaNorito Agetsuma
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報Masahiko Sawada
 
DBパフォーマンスチューニングの基礎:インデックス入門
DBパフォーマンスチューニングの基礎:インデックス入門DBパフォーマンスチューニングの基礎:インデックス入門
DBパフォーマンスチューニングの基礎:インデックス入門Akira Shimosako
 
KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話imurata8203
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方Takahiro YAMADA
 
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Yuji Kubota
 

Mais procurados (20)

これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
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)
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
 
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
 
アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門
 
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
 
Jenkins 再入門
Jenkins 再入門Jenkins 再入門
Jenkins 再入門
 
DBパフォーマンスチューニングの基礎:インデックス入門
DBパフォーマンスチューニングの基礎:インデックス入門DBパフォーマンスチューニングの基礎:インデックス入門
DBパフォーマンスチューニングの基礎:インデックス入門
 
KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話
 
Quarkus入門
Quarkus入門Quarkus入門
Quarkus入門
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
Helidon 概要
Helidon 概要Helidon 概要
Helidon 概要
 
Spring AMQP × RabbitMQ
Spring AMQP × RabbitMQSpring AMQP × RabbitMQ
Spring AMQP × RabbitMQ
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
 
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
 

Semelhante a 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
 
プロビジョニングの今 ーフルマネージド・サービスを目指してー #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
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQLRyusuke Kajiyama
 

Semelhante a 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
 
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
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
 

Mais de 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
 
mod_cluster
mod_clustermod_cluster
mod_clusternekop
 

Mais de nekop (9)

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
 
mod_cluster
mod_clustermod_cluster
mod_cluster
 

Último

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 

Último (9)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 

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