4

アプリケーションをJBoss7に移行します。ここでは、すべての依存関係がありました"JBOSS_HOME/server/default/lib"(JBoss4)。lib "servlet.jar"(javax.servlet。*)を含めましたが、JBoss 7のグローバルモジュール(modules.xml、standalone.xml、warファイルのjboss-deployment-structure.xml)を設定した後、ライブラリは通常、JBossによってロードされます。

JBoss 7がフィルターを開始しようとすると、次の例外が発生します。

15:09:15,222 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/RegistrarValorDolar]] (MSC service thread 1-2) Exception starting filter cripto: java.lang.ClassCastException: cenpra.com.sigtec.business.utilities.SessionFilter cannot be cast to javax.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:441) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3269) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContext.start(StandardContext.java:3865) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [rt.jar:1.7.0_15]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.7.0_15]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_15]

ライブラリ「servlet.jar」をグローバルモジュールから削除しようとすると、サーバーが内部jarを使用して独自のクラスをロードしようとして、クラスのを取得しましClassNotFoundExceptionjavax.servlet.Filter

  • 多くのライブラリを再利用する必要があるため、グローバルモジュールを使用したいと思います。
4

1 に答える 1

8

クラスパスが複数の異なるバージョン管理されたクラスで汚染されていjavax.servlet.Filterます。クラスローダ X によってロードされるクラス (コンテナの内部クラスを担当するクラスなど) は、クラスローダ Y によってロードされるときと同じクラスではありません (Web アプリケーションのクラスを担当するクラスなど)。

lib「servlet.jar」(javax.servlet。)を含めました。

これは少なくとも正しく聞こえません。これは、ターゲット servletcontainer (この場合は JBoss) によって既に提供されているはずです。フォルダー内の webapp と共に、サーブレットコンテナー固有のライブラリーを絶対に提供しないで/WEB-INF/libください。これは、サーブレットコンテナ自体によって提供されるものよりもクラスローディングが優先され、サーブレットコンテナ自身のクラスを使用しているサーブレットコンテナの内部クラスと競合するため、実行時クラスパスの惨事に終わるだけです。

フォルダー内のサーブレットコンテナー固有のライブラリーを取り除き/WEB-INF/libます。

javax.servletこれは、 IDE で直面している APIのコンパイル エラーを修正/回避しようとする不注意な試みにおける一般的な初心者の間違いです。別の方法で解決する必要がありました。要するに、Web プロジェクトを特定のターゲット コンテナに関連付けるように IDE に指示する必要があります。その後、IDE は必要なビルド パス マジックを自動的に実行します。

以下も参照してください。

于 2013-02-27T18:55:06.213 に答える