我有一个基于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)
现在,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的副本。
有没有人知道为什么会这样?
答案 0 :(得分:9)
问题现已解决。谢谢大家的帮助。
事实证明,主项目的依赖关系具有另一个MediaDao
类,在完全相同的包路径中。有人基本上将类复制到该依赖项中(作为库资源,以便许多项目可以使用它而不将主项目指定为依赖项)。但是,有人没有删除主项目中的课程。
所以,当我修改主项目中的类(我添加了updateAlfrescoNodeRef
方法),并在我的机器上运行STS中的应用程序时,Tomcat在主项目中使用了该类的版本,而不是在库中,因为库项目已关闭。但是,当应用程序部署到服务器时,看起来使用了库中类的版本(当然,它没有使用updateAlfrescoNodeRef
方法)。
专家提示如果您发现自己处于类似情况:在STS中,按CTRL + SHIFT + T打开"打开类型"对话框,并输入有问题的类的名称,以查看具有该名称的类的项目列表。
答案 1 :(得分:1)
如果在android studio中发生错误,它也可能是Instant Run的错误。在这种情况下:文件 - >使高速缓存/重新启动无效。它解决了我的问题
答案 2 :(得分:0)
如果您使用的是Tomcat 6+,请查看~tomcat / lib以查找冲突的类和jar。 在Tomcat 5中,查看~tomcat / common / classes,~tomcat / common / lib,~tomcat / shared / classes和~tomcat / shared / lib。