2011-12-03 15 views
7

tomcat Webアプリケーションのパッケージには、WEB-INF/classesとWEB-INF/lib/*が含まれています。WEB-INF/classes/vs WEB-INF/lib/*クラスパス優先順位のjar?

これらのうちどれがCLASSPATHで優先されていますか?

私の質問によると、私のアプリケーションは、aspectjプロジェクトから生成されたアスペクトを含むA.jarを使用しています。 A.jarからの側面と織り合わされるB.jar。 プロジェクトmyappをコンパイルすると、B.jarから同じクラスをオーバーライドする多くのクラスが生成され、これらはWEB-INF/classesディレクトリにパッケージ化されます。したがって、WEB-INF/lib/*。jarを最初にロードすると、織り込まれたアスペクトは有効になりません。

+1

同様http://stackoverflow.com/q/5474765/435605へ –

答えて

11

WebアプリケーションのWebappXクラスローダーからクラスをロードする要求が処理されると、このクラスローダーは、探し出す前に委譲する代わりに、ローカルリポジトリを最初に探します。例外があります。 JRE基本クラスの一部であるクラスは、上書きすることはできません。いくつかのクラス(J2SE 1.4+のXMLパーサーコンポーネントなど)では、J2SE 1.4で承認された機能を使用できます(上記の共通クラスローダーの定義を参照)。最後に、サーブレットAPIクラスを含むJARは、クラスローダーによって無視されます。 Tomcat 5の他のすべてのクラスローダーは、通常の委任パターンに従います。

そのため、Webアプリケーションの観点から、クラスまたはリソースのロードは、この順序で、次のリポジトリになります。

Bootstrap classes of your JVM 
System class loader classes (described above) 
/WEB-INF/classes of your web application 
/WEB-INF/lib/*.jar of your web application 
$CATALINA_HOME/common/classes 
$CATALINA_HOME/common/endorsed/*.jar 
$CATALINA_HOME/common/i18n/*.jar 
$CATALINA_HOME/common/lib/*.jar 
$CATALINA_BASE/shared/classes 
$CATALINA_BASE/shared/lib/*.jar 

ので、WEB-INF /クラスはWEB-INF/libの前に最初に検索され

参考:http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html

2

クラスをWEB-INF/classesに入れると、WEB-INF/lib。私は時にはデバッグの目的でこれを使用しています。 hereも参照してください。