当方法确实存在时,java.lang.NoSuchMethodError

当方法确实存在时,java.lang.NoSuchMethodError,java,spring,tomcat,nosuchmethoderror,Java,Spring,Tomcat,Nosuchmethoderror,我有一个基于Spring框架的Java web应用程序,它是在SpringSource工具套件(“STS”)中构建的,还有一个ApacheTomcat的本地副本。我们还有一个内部生产服务器,同样运行Tomcat 当我在开发机器上运行应用程序,并在web应用程序中执行特定操作时,一切都正常工作。然而,当我将web应用程序部署到服务器上的Tomcat(通过maven生成的war文件)并重复上述特定操作时,我会遇到一些意想不到的行为。当我检查服务器tomcat日志文件时,我发现 2011-11-16

我有一个基于Spring框架的Java web应用程序,它是在SpringSource工具套件(“STS”)中构建的,还有一个ApacheTomcat的本地副本。我们还有一个内部生产服务器,同样运行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方法的引用,以及该方法中字符串的内容。所以,这意味着方法确实存在

springframeworkxml文件中的bean配置绝对正确,否则当我在开发机器上执行它时,代码将无法运行

Google建议服务器上存在库冲突,但所有引用的类——MediaServlet、MediaServiceImpl、MediaDao——都在主项目中(其中包含WEB-INF文件夹)。虽然服务器上可能有多个依赖项副本,但肯定只有一个主项目jar副本


有人知道为什么会发生这种情况吗?

如果您使用的是Tomcat 6+,请在~Tomcat/lib中查找冲突的类和JAR。
在Tomcat 5中,查看~Tomcat/common/classes、~Tomcat/common/lib、~Tomcat/shared/classes和~Tomcat/shared/lib。问题现在已经解决。谢谢大家的帮助

原来主项目有一个依赖项,它有另一个
MediaDao
类,位于完全相同的包路径中。有人基本上是将类复制到该依赖项中(作为库资源,以便许多项目可以使用它,而无需将主项目指定为依赖项)。但是,有人没有删除主项目中的类

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


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

如果错误发生在android studio中,也可能是即时运行的错误。在这种情况下:文件->使缓存无效/重新启动。它解决了我的问题

一旦您提取了jar文件,您就可以执行
javap-classpath net.wmfs.coalesce.aa.dao.MediaDao
,它应该列出方法签名。比较开发人员计算机和上此类(mediabahblah.class)的大小和日期server@MikeSamuel,相关的javap输出如下。。。从“MediaDao.java”公共类net.wmfs.coalesce.aa.dao.MediaDao扩展org.springframework.jdbc.core.support.JdbcDaoSupport{public void updateAlfrescoNodeRef(java.lang.Long,java.lang.String);}编译而成。您能分享参考这一行的代码吗:
MediaServiceImpl.doFileUpload(MediaServiceImpl.java:102)
。还有
MediaDao
的声明,无论它是
MediaDao
还是
JdbcDaoSupport MediaDao
?@Kowser我下载了您提到的工具,并对STS和maven生成的MediaDao.class文件进行了反编译。它们都有
public void updateAlfrescoNodeRef(Long-recordId,String-nodeRef)
方法。感谢您的努力,Kowser。我们正在使用Apache Tomcat 5.5.30版(在服务器上)和5.5.33版(在开发机器上)。我们正在使用Java版本1.6.0_0(在服务器上)和版本1.6.0_26(在开发机器上)。我们使用的是Spring框架版本3.0.2。在~tomcat/common/lib中有各种库。除2个外,其余均为第三方库。这两个不包含有问题的类(我下载了它们,解压缩了它们并检查了它们)。谢谢!为此投入了2小时!一个简单干净的服务器为我创造了奇迹。现在了解原因。谢谢你,你的评论真的帮助了我。在我的项目中,我使用maven插件基于json模式生成JavaPOJO类。错误的是,我在同一个包中创建了相同的java类,其中包含将生成的类。我仍然不明白为什么它只在生产中导致“java.lang.NoSuchMethodError”,即使生产、测试或开发使用相同的docker imageugh。3年的安卓开发经验,我还是忘了尝试这个。