コンテキストではなく、クラスパス階層に関連していると思います。Java インフラストラクチャはクラスパス階層を構築するメカニズム ( ClassLoader
) を提供し、Tomcat (他の多くのサーブレット コンテナー/アプリケーション サーバーと同様) はそれを使用して、特定のアプリケーションで使用されているさまざまな JAR/クラス フォルダーを分離します。
ルート クラス ローダーは、階層内の可視性が低いクラス ローダーです。ネストされたクラス ローダーは、スコープ内のクラスを探すか、見つからない場合は親クラス ローダーに問い合わせることができます。一部のアプリケーション サーバーでは、クラス ローダーが最初に親に問い合わせ、親が見つからない場合は独自のスコープ内を調べるように構成できます。ただし、親クラス ローダーは、ネストされたクラス ローダーからクラスをロードすることはできません。
注: 通常のファイルでも同じことが起こりますlogback.xml
。
lib
そのため、階層内のルート クラス ローダーによって処理されるTomcat のフォルダーにいくつかの休止状態のライブラリがデプロイされています。そのフォルダーにファイルがある場合logback.xml
、実際には Hibernate JAR と同じクラスパス階層レベルにあるため、Hibernate (またはそれによって使用されているログ メカニズム) はファイルをそのスコープ内にあるためロードできます。
一方、アプリケーションで使用されるライブラリ ( WEB-INF/lib
) は、実際には前述のクラス ローダーにネストされている別のクラス ローダーによって処理されます。アプリケーションのライブラリ フォルダに移動logback.xml
すると、実際にはより広いスコープに移動しますが、Hibernate は親クラス ローダーによってロードされているため、そのスコープ内でファイルを見つけることができません(親クラス ローダーは、子からクラスまたはファイルをロードします。子だけが親にそれらを要求できます)。