SpringSource Tool Suite (「STS」) で構築された Spring フレームワーク ベースの Java Web アプリケーションと、Apache Tomcat のローカル コピーがあります。また、Tomcat を実行する内部運用サーバーもあります。
開発マシンでアプリケーションを実行し、Web アプリケーションで特定のアクションを実行すると、すべてが正しく機能します。ただし、(maven によって生成された war ファイルを介して) サーバー上の Tomcat に Web アプリケーションをデプロイし、前述の特定のアクションを繰り返すと、予期しない動作が発生します。サーバーのTomcatログファイルを確認したところ、これが見つかりました...
2011-11-16 19:36:45,090 [http-8280-Processor1] ERROR [attachments] invoke - Servlet.service() for servlet attachments threw exception java.lang.NoSuchMethodError: net.wmfs.coalesce.aa.dao.MediaDao.updateAlfrescoNodeRef(Ljava/lang/Long;Ljava/lang/String;)V
at net.wmfs.coalesce.aa.service.impl.MediaServiceImpl.doFileUpload(MediaServiceImpl.java:102)
at net.wmfs.coalesce.aa.servlet.MediaServlet.doFileUpload(MediaServlet.java:83)
at net.wmfs.coalesce.aa.servlet.MediaServlet.doPost(MediaServlet.java:55)
現在、updateAlfrescoNodeRef メソッドは MediaDao クラスに確実に存在します。そうしないと、私のコードは STS でコンパイルされません...
package net.wmfs.coalesce.aa.dao;
public class MediaDao extends JdbcDaoSupport {
public void updateAlfrescoNodeRef(final Long recordId, final String nodeRef) {
// java code
}
}
ご覧のとおり、メソッド シグネチャは正しいです。
maven が war ファイルを作成したときに問題があったのではないかと疑ったので、war ファイルの内容を抽出しました。WEB-INF/lib フォルダーで、MediaDao クラスを保持する jar ファイルを見つけ、その内容を抽出しました。それから私は...
cat ./MediaDao.class
さて、クラスファイルはバイナリファイルなので、ほとんどgobledegookを見ました。ただし、updateAlfrescoNodeRef メソッドへの参照と、そのメソッド内の String の内容を明確に確認できました。したがって、これはメソッドが確実に存在することを意味します。
Spring フレームワーク XML ファイルの Bean 構成は間違いなく正しいです。そうしないと、開発マシンで実行したときにコードが実行されません。
グーグルはサーバー上のライブラリの競合を示唆しましたが、参照されているすべてのクラス (MediaServlet、MediaServiceImpl、MediaDao) はメイン プロジェクト (WEB-INF フォルダーがあるプロジェクト) にあります。サーバー上に依存関係の複数のコピーがあると考えられますが、メイン プロジェクト jar のコピーは 1 つだけです。
なぜこれが起こっているのか、誰にもアイデアがありますか?