Debugging 如何调试Openfire插件类路径问题

Debugging 如何调试Openfire插件类路径问题,debugging,classpath,server,Debugging,Classpath,Server,我已经编写了一个Openfire(3.8.2)插件,它使用Avaya DMCC API(5.2.3)。当我作为插件(在Openfire server中)运行代码时,Avaya DMCC API方法调用返回空值(确保我为方法调用提供了有效的参数): ServiceProvider=ServiceProvider.getServiceProvider(spProp) 当我将代码作为独立的java应用程序运行时,调用工作正常 我认为问题与类路径有关(即Openfire服务器加载的某个类的不同版本,这会

我已经编写了一个Openfire(3.8.2)插件,它使用Avaya DMCC API(5.2.3)。当我作为插件(在Openfire server中)运行代码时,Avaya DMCC API方法调用返回空值(确保我为方法调用提供了有效的参数):

ServiceProvider=ServiceProvider.getServiceProvider(spProp)

当我将代码作为独立的java应用程序运行时,调用工作正常


我认为问题与类路径有关(即Openfire服务器加载的某个类的不同版本,这会导致方法调用返回null)。如果您能就此类问题的一般调试提供任何建议,我将不胜感激。

我在Eclipse中使用Jad和JadClipse远程单步调试运行在CentOS机器上的代码(在启动Openfire服务器的java命令行中添加了-Xdebug-Xrunjdwp:transport=dt_socket,server=y,address=8002)。一步一步地浏览代码就发现了以下问题:我已经跟踪到了Avaya DMCC API,找到了一段将对象封送到xml的代码。Avaya代码包括以下2个JAR:

MD5/cmapijava sdk/lib/avaya castor override.jar)=2855ac187cb077607b11564adddb24db MD5/cmapijava sdk/lib/castor-1.0-xml.jar)=58982f4f140ab7c873e629c63e11282d MD5/cmapijava sdk/lib/xerces-J_2.9.1.jar)=63af2ba098d68df388197f887d548734

castor-1.0-xml.jar中有一个名为org.exolab.castor.xm.Marshaller的类,它是使用xerces-J_2.9.1.jar()的标准castor Marshaller。Avaya实际上在Avaya-castor-override.jar中有自己的org.exolab.castor.xm.Marshaller(以及他们正在重写的其他11个类)。他们添加了一个额外的方法(setCstaXSDEdition(…),该方法作为代码执行的一部分被调用。这是在执行代码的远程单步执行时导致错误的语句

我的结论是,当代码作为openfire插件而不是独立java应用程序运行时,使用了错误版本的org.exolab.castor.xm.Marshaller(例如,castor-1.0-xml.jar中的版本,甚至是openfire jar中的其他jar)

我曾尝试将avaya-castor-override.jar添加到java openfire启动命令的-classpath(在最开始的时候)中,但没有任何区别。 我曾尝试将avaya-castor-override.jar添加到JRE认可的目录(/usr/java/jre1.7.0_67/lib/annowed/)中,但代码在执行过程中很早就失效了(它显然在错误的位置使用了avaya-castor-override.jar Marshaller,应该使用在castor-1.0-xml.jar中找到的正常版本)

解决方案: 强制openfire从正确的jar文件中获取正确的org.exolab.castor.xm.Marshaller。 结果是Openfire插件按字母顺序加载类。
在我的IDE(Eclipse)或centos上运行时,构建中JAR的顺序没有任何区别。当我将castor-1.0-xml.jar重命名为avaya-acastor-1.0-xml.jar(按字母顺序排在avaya-castor-override.jar之前)时,导致在我的IDE上运行时发生相同的错误。对centOS版本jar执行相同的操作使其在centOS上工作

我在Eclipse中使用Jad和JadClipse远程单步遍历在centOS机箱上运行的代码(在启动Openfire服务器的java命令行中添加了-Xdebug-Xrunjdwp:transport=dt_socket,server=y,address=8002)。单步通过代码显示以下内容: