和jeresy island冲突的jar有哪些

4546人阅读
技术文档(24)
JAVA(15)
最近弄webservice,我使用的jdk自带的wsimport工具来生成客户端代码,发现生成的代码具有编译错误,错误描述如下:
The method getPort(QName, Class&T&) in the type Service is not applicable for the arguments (QName, Class&SCServicePortType&, WebServiceFeature[]).
而我单独创建新的项目来测试生成的客户端代码却没有这样的错误,所以错误原因在于jar包冲突.....
几近周折,终于让我发现,原来javax.xml.ws.Service这个类,即存在于jdk自带的rt.jar中,也存在于我项目引用包jaxws-api.jar,这种情况就是两个jar包中存在包名和类名都完全相同的问题。我需要的是rt.jar中的javax.xml.ws.Service类,但它却自动引入了jaxws-api.jar的javax.xml.ws.Service类,但是这两个jar包都不能去掉。
所以,只有改变编译器优先选择的jar顺序(这个顺序是可以改变的):在Eclipse中是在Java Build Path-》Order and Export里面,通过&up&/&down&按钮改变顺序,把jaxws-api.jar放在jdk的下面就可以了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:73030次
排名:千里之外
原创:21篇
转载:11篇
评论:20条
(1)(1)(1)(1)(4)(1)(1)(1)(7)(6)(8)8902人阅读
java(22)
& & 在测试脚本编写和应用部署时,经常遇到的一个问题是:java.lang.NoSuchMethodError。这个问题产生的根本原因是运行时应用加载的jar包版本不是应用代码真正需要的版本。要解决这个问题,就要让应用加载真正“HasSuchMethod&的类所在的jar包。解决这个问题,我把它归纳为以下几步:验证加载内容、查找包含该类的jar包、查找应用适用的jar版本、查看出错应用加载的jar包位置、替换错误jar包版本到需要的版本。
& &&验证加载内容
& & 通常,发生了NoSuchMethodError,在报错中我们可以查看到应用真实需要的方法和方法签名,例如如下的报错:
java.lang.NoSuchMethodError: com.taobao.eagleeye.EagleEye.rpcClientRecv(Ljava/lang/SI)V
& & 表明应用需要的是EagleEye类中的包含方法签名如:void&rpcClientRecv(String str,int i)的方法。知道了这一点,我就自然需要去看一下应用中实际加载的EagleEye是什么样的情况,rpcClientRecv方法的签名是什么样子的。
& & 要得到这些内容,可以用两个工具来获取,1是classdump工具,它通过Serviceability Agent技术在运行时dump指定的类的字节码文件。2是jdgui,这是使用得最多的反编译工具,它可以把classdump工具dump出来的字节码文件反编译成java代码,可以更直观得查看应用中加载的类是什么样子。
& &&classdump工具的使用:
& & 命令:java&-classpath&&.:/opt/taobao/java/lib/sa-jdi.jar&&sun.jvm.hotspot.tools.jcore.ClassDump&16528
& & 其中-classpath把sa-jdi的jar包加入到classpath中,ClassDump 是执行字节码文件dump的main方法入口类,16528是目标进程的pid,可以用jps命令得到。
& & 这样,ClassDump会把当前加载的所有Java类都dump到当前目录下,如果有全限定名相同但内容不同的类同时存在于一个Java进程中,那么dump的时候会有覆盖现象,实际dump出来的是同名的类的最后一个。
&&&&如果需要指定被dump的类的范围,可以自己写一个过滤器,在启动ClassDump工具时指定-Dsun.jvm.hotspot.tools.jcore.filter=filterClassName,如果需要指定dump出来的Class文件的存放路径,可以用-Dsun.jvm.hotspot.tools.jcore.outputDir=path来指定,path替换为实际路径。
& & 对于上面讲的例子,我们只需要EagleEye类的内容,那么,就可以写一个FilterClass类来进行dump的过滤,写这个过滤类,需要实现sun.jvm.hotspot.tools.jcore.ClassFilter,具体实现如下图所示,InstanceKlass对应于HotSpot中表示Java类的内部对象,我们只要过滤类名以com/taobao/eagleeye的类就好。
写好了这个类之后,编译,把这个类的class文件放到要执行ClassDump命令的目录下,执行时增加如下参数:-Dsun.jvm.hotspot.tools.jcore.filter=MyFilter,ClassDump就会在当前目录dump出com.taobao.eagleeye.EagleEye类的字节码。
& & 然后使用jd-gui,jd-gui是一个绿色工具,直接打开字节码文件,可以看到rpcClientRecv方法,这里就可以看到,实际上当前jvm加载的是一个没有参数的rpcClientRecv方法。
& &&查找包含该类的jar包、查找应用适用的jar版本
& & 确认了当前出现错误的应用中确实加载了不符合要求的类之后,就需要去看一下,这个类是从哪里来的,在哪个jar包中。做这件事情比较简单,只需要去eclipse中执行ctrl+shift+t,输入类名,就可以看到当前eclipse的工程中依赖的各个版本的包含这个类的jar包。接下来你可以把各个版本的类都打开,检查这些版本的jar包中是否有符合要求的方法,即方法签名符合rpcClientRecv(Ljava/lang/SI)V的方法。方法签名识别:其中L开头,;结尾的字符串标识了一个对象类型,这里的第一个参数是java.lang.String类型,第二个参数是int类型,V表示void类型返回。详细的jvm中字段类型和方法签名表示见下图:
& & 通过这个步骤,我们知道了实际上我们的应用需要什么版本的jar包,那么,接下来自然就会想要知道应用当前加载的是什么版本的jar包,又是在哪里加载进来的。
& &&查看出错应用加载的jar包和jar包位置
& &&在这个步骤,要想知道应用加载的是jar包的什么版本,需要使用jvm类加载跟踪器这个工具,这是一个基于java agent、instrument的,用于排查jar包冲突、类冲突、类版本冲突、NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError&等类加载相关问题的辅助工具。这个工具的能够定时得把新加载入虚拟机类个jar包等数据输出到指定的html文件中。
& & 工具的使用方式是:首先,下载得到jvminspect.jar;其次,修改目标应用的jvm配置,在jvm参数上增加如下的配置:JAVA_OPTIONS=$JAVA_OPTIONS
-javaagent:jvminspect.jar=outputfile=jvm.inspect.output,flushIntervalSecond=300 -DHtmlFlusher.enableHyperlink=false;其中jvminspect.jar是下载得到的工具jar包,jvm.inspect.output是输出的文件地址,flushIntervalSecond参数指定的是定时刷新的时间间隔。增加了这个参数之后重启,就可以在jvm.inspect.output文件中查看这个jvm进程加载类的情况了。
& & 我们关心的是出现NoSuchMethodError&所在的类,在这个例子中,这是com.taobao.eagleeye.EagleEye类,在输出的文件中我们可以看到这个类被jvm从jar包的哪个版本中加载,jar包的物理位置等信息。
& & 知道了这些信息,我们就很清楚得能够确定问题的原因。
& &&替换错误jar包版本到需要的版本
& &&知道应用在那里加载了不期望被加载的jar包,我们就可以着手让应用把需要加载的正确版本包加载进来。不同的场景可以做不一样的操作,比如应用的war包中本身加载了错误版本的jar包,那你需要做的是修改应用的pom文件进行重新打包,把正确的jar包依赖到war包中;如果是由于某些环境的原因,classpath中存在了两个不同版本的jar包,那你就可以根据前面几步得到的信息,把错误版本(导致应用报NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError等错)的版本删除,留下应用代码实际上依赖的jar包。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:141964次
积分:2157
积分:2157
排名:第11775名
原创:65篇
转载:23篇
评论:24条
(1)(1)(2)(3)(1)(1)(1)(1)(1)(6)(7)(1)(6)(5)(2)(4)(1)(1)(1)(1)(1)(3)(3)(4)(2)(2)(3)(2)(2)(4)(3)(1)(1)(2)(2)(1)(2)(1)(2)后使用快捷导航没有帐号?
暂时没有人问过相似的问题,你可以做第一个提问题的人
查看: 6877|回复: 6
急求,百度地图api包、定位包和导航包冲突
本帖最后由 52... 于
19:26 编辑
做一个骑行的软件,需要引用地图、定位、语音导航的功能,工程只引用百度地图/RiderGo/libs/baidumapapi_v3_0_0.jar和定位包/RiderGo/libs/locSDK_4.1.jar没问题,功能都可实现,再引用导航包后,IDE报错
[ 16:32:43 - Dex Loader] Unable to execute dex: Multiple dex files define Lcom/baidu/lbsapi/auth/ErrorM
[ 16:32:43 - RiderGo] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/baidu/lbsapi/auth/ErrorM
求大神说下解决方案啊。很急的,要参加服务外包。。。
老版本的地图定位功能 和&&BaiduLBS_Android&&jar冲突了,删掉后这个jar后暂时还没什么问题。正常运行。
你好,同时使用了多个服务包的话,我们建议您去统一资源下载平台来获取开发包,否则可能存在一定的冲突问题。地址为:
我是当时只用到定位,所以导入的BaiduLBS_Android.jar,但是后面需要用到逆地理,然后又导入了baidumapapi_v3_5_0.jar,最后报了Unable to execute dex: Multiple dex files define Lcom/baidu/lbsapi/auth/ErrorM
[ 10:08:18 - Fresh] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/baidu/lbsapi/auth/ErrorM这个错误,后面我删除BaiduLBS_Android.jar这个jar包后就可以了
:handshake&&也遇到这个问题了& &确实是要统一下载 。否则有冲突
senny_hi 太谢谢你了,帮大忙了,我太无知了。。。
& &我用的是以前版本的基本地图api,但导航用的是最新版的api。两个有冲突,里面有个channel文件夹引起的& & 你们知道怎么解决吗
Powered bypublic&Class&findClass(String&name)&throws&ClassNotFoundException&{&&&&&&&&//&先自己加载类,找不到则请求parent来加载,注意这点和java默认的委托模式不同&&&&&&&&Class&clazz&=&null;&&&&&&&&try&{&&&&&&&&&&&&if&((clazz&==&null))&{&&&&&&&&&&&&&&&&&&&&clazz&=&findClassInternal(name);&&&&&&&&&&&&}&&&&&&&&&&&&if&((clazz&==&null)&&&&hasExternalRepositories&&&&!searchExternalFirst)&{&&&&&&&&&&&&&&&&&&&&clazz&=&super.findClass(name);&&&&&&&&&&&&}&&&&&&&&&&&&if&(clazz&==&null)&{&&&&&&&&&&&&&&&&throw&new&ClassNotFoundException(name);&&&&&&&&&&&&}&&&&&&&&}&catch&(ClassNotFoundException&e)&{&&&&&&&&&&&&if&(log.isTraceEnabled())&&&&&&&&&&&&&&&&log.trace("&&&&--&&Passing&on&ClassNotFoundException");&&&&&&&&&&&&throw&e;&&&&&&&&}&&&&&&&&return&(clazz);}
据此可以认为,在web项目WEB-INF\lib下的jar包优先级高于jboss,tomcat 下的lib.两处版本不一致的话会导致程序异常。比较省事的办法是WEB-INF\lib下不再保留重复的jar包,实在闲着没事的话可以自己写个类加载器替换tomcat下WebappClassLoader改变加载顺序。但是还可能有隐患,WebappClassLoader权限较低,它加载的类只能访问web应用下的资源,如果servlet-api.jar等包用到其他资源时可能出现异常。这个没实际测过,只是推测。但是catalina要提供对整个容器的支持,servlet-api实现对http协议的封装转换用到外部资源的可能性很大。图三 类加载器结构图总结:sevlet-api.jar,jsp-api.jar,el-api.jar这类容器提供的jar包web项目下没必要再保留一份了,容易出现版本不一致。附录:查看tomcat源码的时候可以看看how tomcat works这本书,很不错,虽然老了点。作者:zyskm}

我要回帖

更多关于 weblogic jar包冲突 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信