java.lang.NoSuchMethod 分析

晨曦之光 发布于 2012/04/25 16:18
阅读 1K+
收藏 0

经常遇到恼人的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

 


原文链接:http://blog.csdn.net/kkdelta/article/details/3960831
加载中
返回顶部
顶部