方法绝对存在时的java.lang.NoSuchMethodError

爵士乐:

我有一个基于Spring框架的Java Web应用程序(已在SpringSource Tool Suite(“ 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)

现在,MediaDao类中肯定存在updateAlfrescoNodeRef方法-否则我的代码将无法在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配置绝对正确,否则当我在开发机器上执行该代码时,该代码将无法运行。

Googling建议服务器上发生库冲突,但是所有引用的类-MediaServlet,MediaServiceImpl,MediaDao-都在主项目中(其中包含WEB-INF文件夹的类)。尽管可以想到服务器上可能有多个依赖关系副本,但绝对只有主项目jar的一个副本。

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

爵士乐:

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章