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

时间:2015-01-19 10:44:57

标签: debugging classpath server

我编写了一个使用Avaya DMCC API(5.2.3)的Openfire(3.8.2)插件。当我将代码作为插件运行时(在Openfire服务器中),Avaya DMCC API方法调用返回一个空值(确保我为方法调用提供有效的争论):

ServiceProvider provider = ServiceProvider.getServiceProvider(spProp);

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

我认为问题与类路径有关(即Openfire服务器加载某些类的不同版本,导致方法调用返回null)。我对任何有关此类问题的一般调试的建议表示感谢

1 个答案:

答案 0 :(得分:0)

我在Eclipse中使用了Jad和JadClipse来远程单步执行在CentOS盒子上运行的代码(将-Xdebug -Xrunjdwp:transport = dt_socket,server = y,address = 8002添加到启动的java coomand行Openfire服务器)。单步执行代码揭示了以下内容:我已经通过Avaya DMCC API跟踪问题,找到了将对象编组为xml的代码。 Avaya代码包括以下2个罐子:

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

有一个名为org.exolab.castor.xm.Marshaller的类,它位于castor-1.0-xml.jar中。这是使用xerces-J_2.9.1.jar()的标准脚轮Marshaller。然后,Avaya实际上在avaya-castor-override.jar中有自己的org.exolab.castor.xm.Marshaller(以及它们覆盖的大约11个其他类)。他们添加了一个额外的方法(setCstaXSDEdition(...)),它被称为代码执行的一部分。这是在远程单步执行代码时导致错误的语句。

我得出的结论是,正在使用org.exolab.castor.xm.Marshaller的错误版本(例如castor-1.0-xml.jar中的一个或者甚至是openfire jar中的一些jar)当代码作为openfire插件运行时,而不是独立的Java应用程序。

我尝试将avaya-castor-override.jar添加到java openfire启动命令的-classpath(在其开头),但这没有任何区别。 我已经尝试将avaya-castor-override.jar添加到JRE支持的目录(/usr/java/jre1.7.0_67/lib/endorsed/),但代码在执行时更早出现(它显然使用了avaya- castor-override.jar Marshaller在错误的地方并且应该使用正常版本找到incastor-1.0-xml.jar)

解决方案: 强制openfire它从右侧jar文件中选择正确的org.exolab.castor.xm.Marshaller。 事实证明,Openfire插件按字母顺序加载类。 在我的IDE(Eclipse)或centos上运行时,构建中的jar顺序没有任何区别。当我将castor-1.0-xml.jar重命名为avaya- a castor-1.0-xml.jar(在avaya-castor-override.jar之前按字母顺序排列)时,会导致同样的错误发生时在我的IDE上运行。对centOS版本jar做同样的事情使它在centOS上工作