java.lang.NoSuchMethodError ? 一个奇怪的问题

daidaoqr 2014-08-08 07:16:47
昨天在做升级的时候遇到一件怪事,主要功能为使用apache的ftp包来实现一个附件上传。
这个包里有两个方法
ftpClient.setControlEncoding("GBK");
ftpClient.setBufferSize(100000);
用于转码和设置缓存大小。
在我的本机和测试环境上都是正确无误的,但奇怪的是当我升级到正式环境的时候会报一个错误,
java.lang.NoSuchMethodError: setControlEncoding
提示为方法setControlEncoding不存在!
具体错误如下:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1914)
at com.zte.zxcc.workflow.filter.ActionServletInterceptor.process(ActionServletInterceptor.java:62)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:463)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:857)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
at com.zte.zxcc.workflow.filter.EfficientEndFilter.doFilter(EfficientEndFilter.java:82)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
at com.zte.zxcc.workflow.tools.LoginCheckFilter.doFilter(LoginCheckFilter.java:77)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
at util.BdhFilter.doFilter(BdhFilter.java:19)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
at com.zte.zxcc.workflow.tools.ChangeCharsetFilter.doFilter(ChangeCharsetFilter.java:37)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3270)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2019)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1925)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1394)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
Caused by: java.lang.NoSuchMethodError: setControlEncoding
at com.zte.zxcc.workflow.tools.ftp.FTPUtil.connectServer(FTPUtil.java:54)
at com.zte.zxcc.workflow.webservice.client.CallBillClientImpl.callWebService(CallBillClientImpl.java:602)
at com.zte.zxcc.workflow.webservice.client.CallBillClientImpl.createWorkbill(CallBillClientImpl.java:61)
at com.zte.zxcc.workflow.WebUtil.sendBill(WebUtil.java:493)
at com.zte.zxcc.workflow.action.WorkbillSendAction.send(WorkbillSendAction.java:97)
... 34 more


提示为setControlEncoding方法不存在,但是事实上这个方法肯定是存在的
该方法来自commons-net-3.3.jar

看到这个错误,我首先想到的是缺jar包,仔细检查了一遍,并不缺jar包,而且我开发从头到尾没加过jar
然后检查了一遍是否有jar包重复或同一个jar包引入了两个不同版本,检查结果是没有发现这样的情况
再然后我怀疑是编译不完全,然后重新编译了一次,发布之后报同样的错
再然后,再然后我就没辙了。。。。
不知道有哪位大神以前遇到过类似的问题,求助!!!
...全文
33006 26 点赞 打赏 收藏 举报
写回复
26 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
段福举 2016-06-12
最直接的就是直接重装下jdk
  • 打赏
  • 举报
回复
l清水 2016-04-21
是tomcat版本或者是jdk版本的问题,也可能是其他的jar包。看看的代码错误出现在哪里。我这出现一个我原来是jdk1.7.现在还是jdk1.7但是compile 中却只让我选择到1.6 不让选择1.7。 在文件上传的时候,会有这样一行代码 request.getServletContext().getRealPath("upload"); 这个代码在1.7中没问题。但是现在是显示是1.7.实际是1.6. 我们就要采用这个 request.getSession().getServletContext().getRealPath("upload");
  • 打赏
  • 举报
回复
sinat_19843759 2016-03-30
楼主是不是用的tomcat啊,可能是 tomcat的问题 ,我也有这个问题 ,我本地用的tomcat8,服务器用的tomcat7,开始时本地一切正常,放到服务器就不行了,搞了好久,我就把服务器的所有东西都搞得和本地的一样, 发现把 Tomcat7改成本地一样的Tomcat8就可以了。。。。
  • 打赏
  • 举报
回复
引用 22 楼 wsdtq123 的回复:
这帖子都挂一年了,先结了吧,反正到最后也没有解决这个问题。
我们学习做web项目,老师写了个图片上传的辅助类,我导入项目就报这个错误了- -
  • 打赏
  • 举报
回复
daidaoqr 2015-08-04
这帖子都挂一年了,先结了吧,反正到最后也没有解决这个问题。
  • 打赏
  • 举报
回复
daidaoqr 2015-08-04
引用 18 楼 c6280104 的回复:
楼主,你这个问题有没有解决了呢
没有,我删掉了这两句代码,部署之后再也没管过了。
  • 打赏
  • 举报
回复
humanity 2014-10-14
通过代码查找这个类在哪儿,比如:

FtpClient.class.getResource('/' + FtpClient.class.getName().replace('.','/').concat(".class"));
得到一个 URL 观察这个 FtpClient.class 在哪个 jar 文件中。
  • 打赏
  • 举报
回复
CalmDown 2014-10-13
可以加QQ 1095074633 讨论一下
  • 打赏
  • 举报
回复
c6280104 2014-10-13
楼主,你这个问题有没有解决了呢
  • 打赏
  • 举报
回复
skgary 2014-08-19
楼主看看你的运行环境里有没有其他版本的common-net 甚至,你得查一下org.apache.commons.net.ftp.FTPClient; 这个源代码的历史,也许之前老版本并不是编在这个文件名里 或者,有没有别人打包的时候,连lib包一起打进去了。。。。。 最后,你如果实在没有时间找,或不愿意找了,把common-net换个包名重编一个ftpclient出来。。。 当然,最后这步实在是太次了,会给项目埋很深的坑的,严重不建议使用。。。。
  • 打赏
  • 举报
回复
daidaoqr 2014-08-18
引用 12 楼 Chen_yanxia 的回复:
很有可能jar包冲突了
遇到这个问题我第一反应也是jar包冲突,但是检查之后发现不是。而且到现在为止也没找出问题的关键所在
  • 打赏
  • 举报
回复
daidaoqr 2014-08-18
引用 9 楼 yyfhz 的回复:
http://kasicass.blog.163.com/blog/static/39561920112289344161/ LZ可以先用这个方法查一下调用的FTPClient到底是从哪一个jar来的,然后再进行检查。
来自common-net-3.3.jar 之后的检查,无论我怎么检查都查不出来问题
  • 打赏
  • 举报
回复
daidaoqr 2014-08-18
引用 8 楼 nai598455803 的回复:
看你服务器上面的用户名,密码有没有乱码 ftp 远程连接断了
没有乱码,也没断
  • 打赏
  • 举报
回复
雨木林风 2014-08-12
引用 6 楼 wsdtq123 的回复:
[quote=引用 4 楼 yzsunlight 的回复:] 看下服务器的jdk的版本 跟你版本的区别
都是1.5[/quote] 有些类有可能和是服务器中一些内置的类 冲突
  • 打赏
  • 举报
回复
kaukiyou 2014-08-08
检查classpath环境变量,很可能调用了旧的jar包。
  • 打赏
  • 举报
回复
qingyuan18 2014-08-08
weblogic下部署你自己的项目,如果你的jar包跟weblogic自带的jar包版本冲突,用以下方式让weblogic有限加载你自己项目的jar包: 在你的应用程序里配置如下内容的weblogic.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE hibernate-configuration (View Source for full doctype...)> - <weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd" xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app"> <context-root>“你自己的应用URL路径”</context-root> - <container-descriptor> <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor> </weblogic-web-app>
  • 打赏
  • 举报
回复
yyfhz 2014-08-08
http://kasicass.blog.163.com/blog/static/39561920112289344161/ LZ可以先用这个方法查一下调用的FTPClient到底是从哪一个jar来的,然后再进行检查。
  • 打赏
  • 举报
回复
nai598455803 2014-08-08
看你服务器上面的用户名,密码有没有乱码 ftp 远程连接断了
  • 打赏
  • 举报
回复
daidaoqr 2014-08-08
引用 5 楼 lihua0810 的回复:
应该是服务器上其他的jar 或许也存在相同类 jar包冲突了
测试环境、正式环境、本机 的jar包都是一样的 而且是一直沿用的,我没有添加什么新的jar 这个问题我也是一开始就想到的是jar的问题 反复检查多遍,确定jar是没有问题的
  • 打赏
  • 举报
回复
daidaoqr 2014-08-08
引用 4 楼 yzsunlight 的回复:
看下服务器的jdk的版本 跟你版本的区别
都是1.5
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2014-08-08 07:16
社区公告
暂无公告