今天在写自己的项目的时候出现了一个Exception in thread "main" java.lang.NoSuchMethodError的异常,但是我的代码在编译过程中是没有任何问题的。
先来讲一下我的项目关键的结构
我的项目引用了两个jar包,暂定为jarA(version:1.0)和jarB(version:2.0),但是jarA中又引用了jarB(version:1.0),这个时候我调用了jarA中的一个方法,假定为invokeMethodA(),该方法会调用jarB中的一个方法,这个方法jarA中的jarB(version:1.0)是这样的格式invokeMethodB(String s,Throwable t);但是这个方法在jarB是这样的invokeMethodB(String s,Object... o);相当于jarB(version:2.0)进行了一个升级。当我调用这个方法的时候jarA的invokeMethodA()方法,则会报出这样的问题Exception in thread "main" java.lang.NoSuchMethodError: com.cn.b.BClass.invokeMethodB(Ljava/lang/String;Ljava/lang/Throwable;)V。这是因为在jarA中的jarB(version:1.0)中,invokeMethodB在jarB(version:1.0)中编译的时候是编译成invokeMethodB(Ljava/lang/String;Ljava/lang/Throwable;)V的形式,只有完全匹配上才能够调得通。但是在这边的项目中有完全同包名同类名同方法但是参数格式不一样的方法,被编译成(Ljava/lang/String;[Ljava/lang/Object;)V的格式,而BClass是优先加载jarB(version:2.0)中的BClass。
这里得出两个
先来讲一下我的项目关键的结构
我的项目引用了两个jar包,暂定为jarA(version:1.0)和jarB(version:2.0),但是jarA中又引用了jarB(version:1.0),这个时候我调用了jarA中的一个方法,假定为invokeMethodA(),该方法会调用jarB中的一个方法,这个方法jarA中的jarB(version:1.0)是这样的格式invokeMethodB(String s,Throwable t);但是这个方法在jarB是这样的invokeMethodB(String s,Object... o);相当于jarB(version:2.0)进行了一个升级。当我调用这个方法的时候jarA的invokeMethodA()方法,则会报出这样的问题Exception in thread "main" java.lang.NoSuchMethodError: com.cn.b.BClass.invokeMethodB(Ljava/lang/String;Ljava/lang/Throwable;)V。这是因为在jarA中的jarB(version:1.0)中,invokeMethodB在jarB(version:1.0)中编译的时候是编译成invokeMethodB(Ljava/lang/String;Ljava/lang/Throwable;)V的形式,只有完全匹配上才能够调得通。但是在这边的项目中有完全同包名同类名同方法但是参数格式不一样的方法,被编译成(Ljava/lang/String;[Ljava/lang/Object;)V的格式,而BClass是优先加载jarB(version:2.0)中的BClass。
这里得出两个