そもそもクラスローディングとは
クラスローディングというのは、クラスをメモリーに読み込むことです。
例えば、レシピの本を使って料理を作ることを考えてみたら、クラスローディングは、レシピの本の必要なページを探し出して、開いておくことです。
レシピを開いた状態で、具体的な材料や手順を参照して、料理ができるようになるわけです。
Mulesoftクラスローディングの分離
クラスローディングの分離の目的
Mule app,外部コネクター、ライブラリの中に、バージョンのコンフリクトや競合の問題を解決する。
クラスローディング分離メカニズム
-
Muleプロジェクトは、jarファイルとして外部に提供する。
-
Muleランタイム、Muleアプリケーション、Muleモジュールのクラスがjarファイルに含まれる
-
Mule 4 のクラスローディングは、ランタイム、アプリケーション、モジュールのクラスを同時にローディングするではなく、互いに分離して、ローディングを行う。
考慮事項
-
エクスポートされていないリソースとクラスは他のアーティファクトから参照できない。
-
アーティファクトから最小限必要なパッケージとリソースのセットを公開する。
-
必要でない限り、サードパーティのライブラリはエクスポートしない。
-
Guava、Apache common-collections などのサードパーティの共通ライブラリは絶対公開しない。公開すると、他のアーティファクトと競合します。
-
理想的には、アーティファクト (または JDK) のクラスのみを公開する。
例
次の拡張ファイル構造を考えてみます。
com/example/extension/api/MyClass.class
com/example/extension/internal/Util.class
transformations/customer-to-user.dwl
license.txt
META-INF/mule-artifact/mule-artifact.json
また、この拡張には次の mule-artifact.json 記述子ファイルがあります。
{
"name": "my-test-extension",
"minMuleVersion": "4.0.0",
"classLoaderModelLoaderDescriptor": {
"id": "mule",
"attributes": {
"exportedResources": [
"transformations/customer-to-user.dwl"
],
"exportedPackages": [
"com/example/extension/api"
]
}
}
}
次の図は mule-artifact.json によってエクスポートされたリソースがアプリケーション内に適用される方法を示しています。