The problem is that I do not even know what exactly I should search for on google, so that's why I am asking for a short explanation here on SO.
検索したいのは「Classloader」です。このタイプのオブジェクトは、Java クラスのロードを担当します。JVM によってロードされる各クラスは、その完全修飾名とそれをロードしたクラスローダーのインスタンスの両方によって識別されます。これは、単一の JVM で、正確に「com.example.Test」という名前のいくつかのクラスを持つことができ、それぞれが異なるクラスローダーによってロードされ、それぞれに独自の静的フィールドがあることを意味します。さらに、これらのクラスは実行時に異なると見なされます。あるクラスローダから「com.example.Test」を別のクラスローダの「com.example.Test」にキャストすると、ClassCastException が発生します。
多数の共通クラス (java.util.List など) が複数回ロードされる状況を回避するために、通常、クラスローダーはクリーンな階層に保持されます。各クラスローダは、その「親」、つまり「より一般的なクラス」のロードを担当するクラスローダを認識しています。「com.example.OtherTest」のように、(通常は「名前で」行われる) クラスをロードしようとすると、現在のクラスローダーは、そのクラスをロードできるかどうかをその親に尋ねようとします (そして、親はその親に尋ねます) 、 等々)。このようにして、各クラスは、それをロードできる最も一般的なクラスローダによってロードされます (java.lang.String は、他のクラスローダが別のバージョンを利用できる場合でも、標準のブートストラップ クラスローダによって常にロードされます)。
war をデプロイすると、glassfish はそれ用に別のクラスローダーを作成します。クラスローダーは、WEB-INF/lib および WEB-INF/classes からクラスをロードする方法を認識しています。その親 (または少なくとも祖父) は、すべてのアプリケーションに共通のドメイン クラスローダーです。そのため、アプリケーションのクラスローダーがクラスをロードする前に、Glassfish にそれを行うように要求します。
プロセス全体は非常に構成可能であり、共通ライブラリのコピーを 1 つだけ JVM にロードすることができます (たとえば、ライブラリを AFAIR domain1/lib/ext に配置すると、それらはドメイン クラスローダーで利用可能になります。各アプリケーションのクラスローダー; または、JRE の lib/ext フォルダーに配置して、実行するアプリケーションのクラスをロードするメインのクラスローダーで使用できるようにすることもできます)。そのような場合、それらは静的フィールドを共有します。または、war クラスローダーによってライブラリをロードし、すべての静的フィールドをアプリケーションに対して「プライベート」にすることもできます。