Spring MVC と Hibernate を使用して、シンプルなトレーニング アプリケーションを開発しています。ビルドツールとして Maven を使用しています。すべての依存関係 (spring、hibernate、aopalliance、junit など) は、Maven の pom.xml ファイルを使用して解決されます。
$ mvn war:war glassfish:deploy
プロジェクトはGlassFishサーバーにデプロイされています-すべての*.jar
ファイルがコピーされます( を含むcom.springsource.org.aopalliance-1.0.0.jar
)。
クラスパス内に不透明度が存在するかどうかをテストするための簡単なサーブレットを作成しました。
protected void doGet(...) throws ... {
response.getWriter().println(org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName());
}
そしてそれは存在します。上記のコードはorg.aopalliance.intercept.MethodInterceptor
期待どおりに表示されます。
ただし、サーブレットをそのようなものに変更すると:
protected void doGet(...) throws ... {
response.getWriter().println(org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName());
}
例外がスローされます。
java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
TransactionInterceptor
は aopalliance インターフェイスを使用していますが、サーブレットでは検出できるのに、なぜ検出できないのかわかりません。クラスローダーに何らかの関係があると思いますが、修正方法がわかりません。
編集:
いくつかの詳細:
- 完全な
pom.xml
ファイル: http://pastebin.com/430iPgRs - 完全な
HelloServlet
クラス: http://pastebin.com/YVfzz4i8 - 例外の完全なスタック トレース: http://pastebin.com/UZ5nAJdZ
編集:
spring.osgi.core/io
@Ravi の提案に従って、依存関係も追加しました。
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.io</artifactId>
<version>1.2.1</version>
</dependency>
しかし、それは問題を解決しませんでした。
ただし、SpringSource Tool Suite で提供される VMware vFabric tc Server でまったく同じアプリケーションを実行しようとしましたが、すべて問題なく動作しました。これは GlassFish 固有の問題のようです。
GlassFish Server Open Source Edition 3.1.1 を使用しています。
もう1つの奇妙なこと:アプリケーションを再デプロイすると(Eclipseで「発行」を使用)、サーブレットがスローします:
java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
しかし、リフレッシュした後(ブラウザを白くする)、次のようになります:
java.lang.NoClassDefFoundError: org/springframework/transaction/interceptor/TransactionInterceptor
さらに更新しても何も変わりません。