0

Tomcat 6 のlib( ${catalina.home}/lib/) フォルダー内に、Hibernate などの共有 JAR ファイルがいくつかあります。

Web アプリをデバッグすると、コンソールは Hibernate によって多くの出力を取得logback.xml${catalina.home}/lib/ます。

質問のハイライトは次のとおりです。
同じlogback.xmlものをWebアプリの/WEB-INF/lib/フォルダーに移動すると、ファイルがないかのように無視されます-すべての出力が取得されます。

それは明らかにコンテキストに関連しています(Javaレベルであると思います)が、それに関する情報は見つかりません。
基本的なことをよりよく理解するのを手伝ってください。

ありがとうございました!

4

1 に答える 1

3

コンテキストではなく、クラスパス階層に関連していると思います。Java インフラストラクチャはクラスパス階層を構築するメカニズム ( ClassLoader) を提供し、Tomcat (他の多くのサーブレット コンテナー/アプリケーション サーバーと同様) はそれを使用して、特定のアプリケーションで使用されているさまざまな JAR/クラス フォルダーを分離します。

ルート クラス ローダーは、階層内の可視性が低いクラス ローダーです。ネストされたクラス ローダーは、スコープ内のクラスを探すか、見つからない場合は親クラス ローダーに問い合わせることができます。一部のアプリケーション サーバーでは、クラス ローダーが最初に親に問い合わせ、親が見つからない場合は独自のスコープ内を調べるように構成できます。ただし、親クラス ローダーは、ネストされたクラス ローダーからクラスをロードすることはできません。

: 通常のファイルでも同じことが起こりますlogback.xml

libそのため、階層内のルート クラス ローダーによって処理されるTomcat のフォルダーにいくつかの休止状態のライブラリがデプロイされています。そのフォルダーにファイルがある場合logback.xml、実際には Hibernate JAR と同じクラスパス階層レベルにあるため、Hibernate (またはそれによって使用されているログ メカニズム) はファイルをそのスコープ内にあるためロードできます。

一方、アプリケーションで使用されるライブラリ ( WEB-INF/lib) は、実際には前述のクラス ローダーにネストされている別のクラス ローダーによって処理されます。アプリケーションのライブラリ フォルダに移動logback.xmlすると、実際にはより広いスコープに移動しますが、Hibernate は親クラス ローダーによってロードされているため、そのスコープ内でファイルを見つけることができません(親クラス ローダーは、子からクラスまたはファイルをロードします。子だけが親にそれらを要求できます)。

于 2012-08-15T14:57:08.513 に答える