1

にデプロイされているJavaWebアプリケーションを開発していtomcat 7ます。私はMaven, Spring, spring security 3.0.5.RELEASE and JSFこのアプリケーションで使用しています。

CATALINA_HOME/lib他のアプリケーションでも使用しているので、springファイルとjsfjarファイルをに配置したいと思います。これで、これらのjarファイルのほとんどがwarファイルに含まれています。

jarファイルをwarファイルから分離するために私が行っている手順は次のとおりです。

  1. <scope>provided</scope> tag依存関係を追加するpom.xml
  2. jarファイルをCATALINA_HOME/lib

JSF jarに対してこれらの手順を実行したとき、すべてが正しく機能しました。
しかし、春と春のセキュリティjarアプリで同じことを行っても、アプリが起動せず、エラーが発生しました。

例:次の依存関係にタグを追加すると、アプリが機能しなくなり、例外<scope>provided</scope>がスローされます。Caused by: java.lang.ClassNotFoundException: org.springframework.core.io.Resource

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>

ここで完全なスタックトレースを、ここpom.xmlを参照してください。

CATALINA_HOME / libのスプリングjarの場所でWebアプリを機能させるにはどうすればよいですか?

4

2 に答える 2

1

クラスローダーの問題が発生しました。

一部のクラスには、別のクラスローダーでロードされる他のクラスが必要です。

詳細については、 http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.htmlを参照してください。

Springを戦争から除外する(共有する、または戦争の規模を最小限に抑える)ことを試みるのは良い考えのように思われるかもしれませんが、それは問題につながります。

あなたがそれをうまく機能させることができたとしても、あなたはロギングAPIを混乱させることになります...

于 2013-02-28T13:20:59.563 に答える
1

アプリケーションjarをtomcatlibディレクトリに配置することは一般的に悪い考えです。それらがそのアプリケーションに制限されるように、それらすべてを戦争に留めておいてください。検索すると、この例外が何度も繰り返されることがわかります。

人々が犯すもう1つのよくある間違い(そしてそれは明らかではありません)は、JVMの観点から見たクラスのIDが、クラス名とそれをロードしたクラスローダーのIDの両方であるということです。したがって、2つのクラスローダーが同じクラスをロードする場合、一方のインスタンスをもう一方にキャストすることはできません。

クラスローダーは混乱を招くことが多く、人々が使用する標準的なアプローチに固執するのが最善です。すべてのアプリケーションjarをに入れてWEB-INF/lib、他のアプリケーションから分離し、共通のlibディレクトリに重複するjarがないことを確認します。また、アプリケーションをチェックして、各jarのバージョンが1つしかないことを確認してください。

providedWebアプリケーションで通常マークする必要があるのは、 servlet-apijarファイルだけです。

于 2013-02-28T13:29:09.397 に答える