我有一个基于 Spring 框架的 Java Web 应用程序,它是在 SpringSource 工具套件(“STS”)中构建的,以及 Apache Tomcat 的本地副本。我们还有一个内部生产服务器,再次运行 Tomcat。
当我在开发机器上运行应用程序并在 Web 应用程序中执行特定操作时,一切正常。但是,当我将 Web 应用程序部署到服务器上的 Tomcat(通过 maven 生成的 war 文件)并重复上述特定操作时,会出现一些意外行为。当我检查服务器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 方法的引用,以及该方法中字符串的内容。因此,这意味着该方法肯定存在。
Spring 框架 XML 文件中的 bean 配置肯定是正确的,否则在我的开发机器上执行时代码将无法运行。
谷歌搜索建议服务器上存在库冲突,但所有引用的类 - MediaServlet、MediaServiceImpl、MediaDao - 都在主项目中(其中包含 WEB-INF 文件夹)。虽然可以想象服务器上的依赖项可能有多个副本,但主项目 jar 肯定只有一个副本。
有谁知道为什么会这样?