繁体   English   中英

java.lang.UnsatisfiedLinkError

[英]java.lang.UnsatisfiedLinkError

我正在尝试使用 JMS 访问 MQ 队列。 我得到以下

java.lang.UnsatisfiedLinkError: no mqjbnd05 in java.library.path

我路过

-Djava.library.path="C:\Program Files\IBM\WebSphere MQ\java\lib"

在 eclipse 中运行程序时作为 VM 参数。 这个问题在网上讨论了很多,但没有任何结论。 有没有人解决这个问题? TIA。

因为我必须自己处理这个错误; 我花了很多时间才找到正确的答案,我想与下一个分享这个话题的人......

实际上,问题的解决方案非常简单(至少在我的情况下)。 它与任何CLASSPATHjava.library.path或安装问题无关。

我只是忘了将MQConnectionFactory切换到客户端模式。

这必须完成,只需调用

cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);

或者

cf.setTransportType(WMQConstants.WMQ_CM_BINDINGS_THEN_CLIENT);

或任何其他符合您需求的连接类型。
默认情况下,ConnectionFactory 处于“绑定”模式( WMQ_CM_BINDINGS ),用于本地服务器安装,如 IBM 文档中所述:

要以绑定方式连接到队列管理器,JMS 应用程序的 WebSphere MQ 类必须在运行队列管理器的同一系统上运行。

使用 JNDI 或JmsFactoryFactory时,此传输类型与XMSC_WMQ_CONNECTION_MODE ( WMQConstants.WMQ_CONNECTION_MODE ) 属性JmsFactoryFactory

这同样适用于其他类型的ConnectionFactory: MQQueueConnectionFactoryMQTopicConnectionFactoryMQXAConnectionFactoryMQXAQueueConnectionFactoryMQXATopicConnectionFactory

查看 IMB 知识中心,了解有关不同连接/绑定选项的更多信息:

https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q031720_.htm https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com .ibm.mq.dev.doc/q030560_.htm

您可能在 CLASSPATH、lib 或 EAR 中有一些较旧的 MQ jar 文件。
删除它们,你应该没事。
您不应将 MQ 文件放在 EAR 或 WEB-INF/lib 文件夹中。 它们应该在您的应用程序服务器的类路径中。

我在使用 IBM MQ api 连接时遇到了这个问题。 我也没有发现这个问题与类路径有关。

当我在设置MQEnvironmenthostnamechannel之前实例化MQQueueManager时,这发生在我身上。 只需确保您的代码不这样做,并在设置环境后实例化管理器。 就像是..

MQEnvironment.hostname = "mq hostname";
MQEnvironment.channel = "mq channel";
..more code..
this._queueManager = new MQQueueManager(qManager);

(观察到在MQQueueManager初始化之后设置MQEnvironment.port是可以的,但是可能会把所有与MQEnvironment相关的东西都一起初始化)

如果您实际安装的是 MQ Client而不是 MQ Server,就会发生这种情况。

IBM 甚至为此编写了一个完整的帮助页面

WebSphere MQ 客户端安装缺少 mqjb*.dll 文件

问题(摘要)

您安装了 WebSphere MQ 客户端并注意到\\Program Files\\IBM\\WebSphere MQ\\Java\\lib\\目录中缺少三个 dll。

症状

以下 dll 出现在服务器安装的目录中,但不是 Java™ 客户端的一部分:

  • 03/17/2003 10:59a 19,456 mqjbdf02.dll
  • 03/17/2003 10:59a 57,856 mqjbnd05.dll
  • 03/17/2003 10:59a 36,​​864 MQXAi02.dll

子目录\\jdbc\\ 出现在服务器上,但不在客户端计算机上。

  • 03/17/2003 10:59a 61,440 jdbcdb2.dll
  • 03/17/2003 10:59a 61,440 jdbcora.dll

原因

这些文件丢失是因为在客户端安装中没有提供也不需要它们。

解决问题

这些文件仅包含在 WebSphere MQ Server 产品中。

这是一个简单的方法:告诉 Java VM 加载 DLL 您的代码是否相似,例如您是否使用System.loadLibrary加载mqjbnd05.dll

如果是 - 它是否在 eclipse 之外工作,比如从命令行启动应用程序? 如果是这种情况,您可以尝试使用该库路径启动整个 Eclipse IDE。

有时我们会遇到包含空格的路径名的问题。 将 dll 复制到C:\\ ,将其放在 lib 路径上,然后重试。


啊,就是这个问题,指定的dll丢失了。 这个博客有一个解决方案 祝你好运!

在我的情况下,当我设置传输类型时,错误消失了。 我正在使用 MQConnectionFactory

mQQueueConnectionFactory.setTransportType( JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM