java.lang.NoSuchMethodError 当方法肯定存在时

标签 java spring tomcat nosuchmethoderror

我有一个基于 Spring 框架的 Java Web 应用程序,它是在 SpringSource 工具套件(“STS”)中构建的,以及 Apache Tomcat 的本地副本。我们还有一个内部生产服务器,再次运行 Tomcat。

当我在我的开发机器上运行应用程序,并在网络应用程序中执行特定操作时,一切正常。但是,当我将 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 肯定只有一个副本。

有人知道为什么会这样吗?

最佳答案

问题现已解决。谢谢大家的帮助。

事实证明,主项目有一个依赖项,它有另一个 MediaDao 类,在完全相同的包路径中。基本上有人将该类复制到该依赖项中(作为库资源,以便许多项目可以在不将主项目指定为依赖项的情况下使用它)。但是,有人没有删除主项目中的类。

因此,当我修改主项目中的类(我添加了 updateAlfrescoNodeRef 方法),并在我的机器上的 STS 中运行应用程序时,Tomcat 使用了主项目中类的版本,而不是在图书馆中,因为图书馆项目已关闭。但是,当应用程序部署到服务器时,看起来像是使用了库中类的版本(当然,其中没有 updateAlfrescoNodeRef 方法)。

专家提示,如果您发现自己处于类似情况:在 STS 中,按 CTRL+SHIFT+T 打开“打开类型”对话框,然后输入有问题的类的名称以查看具有具有该名称的类。

关于java.lang.NoSuchMethodError 当方法肯定存在时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8168052/

相关文章:

java - 通过 MainActivity 全屏显示会使应用程序崩溃

java - 使用JPA执行数据库功能

java在内部函数中调用父级的回调函数

java - Spring JPA - org.hibernate.LazyInitializationException : could not initialize proxy - no Session

java - openshift、Tomcat 7 (JBoss EWS 2.0) 和 neo4j

java - 在解决了最初的越界异常后,如何将 a 与 b 或 c 相乘

java - 在 Spring 中确定不支持的媒体类型最理想的时间/地点?

java - 使用 Intellij IDEA 运行项目时找不到 keystore.jks(用于 SSL),但被 Eclipse 找到

http - Tomcat http 错误状态标签不同

带有嵌入式或独立tomcat的Java docker容器?