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

How to debug Openfire plugin classpath issue

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

ServiceProvider 提供商 = ServiceProvider.getServiceProvider(spProp);

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

我认为问题与 class 路径相关(即 Openfire 服务器加载某些 class 的不同版本,导致方法调用 return null)。对于此类问题的一般调试的任何建议,我将不胜感激

我在 Eclipse 中使用 Jad 和 JadClipse 通过 运行ning 在 CentOS 机器上的代码远程单步执行(添加 -Xdebug -X运行jdwp:transport=dt_socket,server=y,address=8002 到启动 Openfire 服务器的 java 命令行)。单步执行代码揭示了以下内容:我已经将问题跟踪到 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

在 castor-1.0-xml.jar 中有一个名为 org.exolab.castor.xm.Marshaller 的 class,这是使用 xerces-J_2.9.[ 的标准 castor Marshaller =30=]()。然后,Avaya 实际上在 avaya-castor-override.jar 中拥有自己的 org.exolab.castor.xm.Marshaller(以及它们覆盖的大约 11 个其他 classes)。他们添加了一个额外的方法 ( s​​etCstaXSDEdition(…) ),该方法作为代码执行的一部分被调用。这是通过代码进行远程单步执行时导致错误的语句。

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

我已经尝试将 avaya-castor-override.jar 添加到 java openfire 启动命令的 -class 路径(在它的最开头),但是没有区别。 我尝试将 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 插件按字母顺序加载 classes。 在我的 IDE (Eclipse) 或 centos 上 运行ning 时,构建中 jar 的顺序没有区别。当我将 castor-1.0-xml.jar 重命名为 avaya-acastor-1.0-xml.jar (所以按字母顺序排在 avaya-castor-override.jar 之前) ,这导致在我的 IDE 上 运行ning 时发生相同的错误。对 centOS 版本的 jar 做同样的事情使其在 centOS 上工作