java.lang.NoSuchMethod 分析

经常遇到恼人的java.lang.NoSuchMethod,分析分析都是在什么情况下发生的。



a)用JAVA 命令运行某个Class的时候,由于Class没有提供 JAVA命令期待的main方法,这个错误经常发生在java初学者身上,呵呵。

* 必须提供一个像下面的main函数,(除了args那个参数名称可以变之外)

public static void main(String[] args)

是不是碰到了下面的错误,看看你的main写对了没有。

Exception in thread "main" java.lang.NoSuchMethodError: main



b)在写代码的IDE中写的ClassA引用了其他Jar中的ClassB,调用了ClassB的methodB,运行环境里的那个Jar里面的ClassB没有methodB。



Exception in thread "main" java.lang.NoSuchMethodError: com.bt.temp.XClass.main1
([Ljava/lang/String;)V
at com.bt.temp.Temp.main(Temp.java:14)



c)多个jar之间版本冲突,尤其是容易发生在用了一大堆opensource的jar包,然后发布在在一个APP container里面。

产生冲突的原因有可能是

1)开源JarA里有一个XXClass,开源JarB里也有一个XXClass,这两个XXClass的版本不一致,jarA先被classloader 加载,然后jarB里用到XXClass的地方就有可能抛java.lang.NoSuchMethodError。

2)App Container里的jar包有一个XXClass,而项目用的jar包里也有一个XXClass,两个版本不一致。比如把CXF 实现的web service发布到weblogic 9.2的时候,就会有java.lang.NoSuchMethodError: javax.jws.WebService.portNam,

原因是weblogic.jar里也有一个javax.jws.WebService这个类,它比cxf里的geronimo-ws-metadata_2.0_spec-1.1.1.jar先加载。

解决方法:

1,在weblogic的启动脚本里加上:

set CLASSPATH_CXF=X:/xyz/geronimo-ws-metadata_2.0_spec-1.1.1.jar

set CLASSPATH=%CLASSPATH_CXF%;%CLASSPATH%;%MEDREC_WebLogic _CLASSPATH%

2,将程序打成EAR包而不是WAR包,weblogic9.2后提供classloader filter可以优先加载指定的Class。

在EAR的META-INF里加上weblogic-application.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
<prefer-application-packages>
<package-name>javax.jws.*</package-name>
</prefer-application-packages>
</weblogic-application>
参考:http://docs.codehaus.org/display/XFIRE/XFire+on+WebLogic+9.2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值