java.lang.UnsatisfiedLinkError
Posted
技术标签:
【中文标题】java.lang.UnsatisfiedLinkError【英文标题】: 【发布时间】:2011-03-18 09:18:55 【问题描述】:我正在尝试使用 JMS 访问 MQ 队列。我得到以下内容
: no mqjbnd05 in java.library.path
我路过
-Djava.library.path="C:\Program Files\IBM\WebSphere MQ\java\lib"
在eclipse中运行程序时作为VM参数。这个问题在网上讨论了很多,但没有任何结论。有没有人解决这个问题? TIA。
【问题讨论】:
你检查目录C:\Program Files\IBM\WebSphere MQ\java\lib
是否真的包含原生库mqjbnd05.dll
?
问题是我没有找到这个 mqjbn05.dll,我只有 mqjbnd.dll 我在 VM arg 部分指定的路径
【参考方案1】:
因为我必须自己处理这个错误;我花了很多时间才找到正确的答案,我想和下一位一起分享这个帖子......
实际上问题的解决方案非常简单(至少在我的情况下)。它与任何CLASSPATH
、java.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 类必须在运行队列管理器的同一系统上运行。 p>
当使用 JNDI 或 JmsFactoryFactory
时,此传输类型与 XMSC_WMQ_CONNECTION_MODE
(WMQConstants.WMQ_CONNECTION_MODE
) 属性相同。
同样适用于其他 ConnectionFactory 类型:MQQueueConnectionFactory
、MQTopicConnectionFactory
、MQXAConnectionFactory
、MQXAQueueConnectionFactory
和 MQXATopicConnectionFactory
查看 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
【讨论】:
该错误具有误导性。这是答案暗示了应该发生的事情。您应该转到 MQ Explorer 并将传输类型更改为“客户端”而不是“绑定”。 您的解决方案实际上并不是解决方案。您只是在使用 CLIENT 模式而不是 BINIDING 模式,因此通过更改程序运行的模式。但是,如果你仍然需要使用 BINDING 模式,你会怎么做? @Som 正如我在回答中所写的那样,绑定模式旨在连接到本地服务器(在同一台机器上)。因此,如果您确实想绑定到本地 MQ 服务器实例并且仍然遇到此问题,那么您可能应该按照错误消息的建议执行操作(将您的mqjbnd05
所在的目录添加到您的 java.library.path
)。如果您没有 dll,则可能存在版本冲突。但是我自己从来没有使用过Binding Mode;所以我对此无能为力。
多么荒谬的默认设置。感谢 IBM :-(【参考方案2】:
您的 CLASSPATH、lib 或 EAR 中可能有一些较旧的 MQ jar 文件。 删除它们,您应该会没事的。 不应将 MQ 文件放在 EAR 或 WEB-INF/lib 文件夹中。它们应该在您的应用服务器的类路径中。
【讨论】:
@hakish - 实际上是这样,您可以使用 MQ6 访问 MQ7,反之亦然,您只是不能将版本 7 .dll 文件与 v6 jar 一起使用。【参考方案3】:我在使用 IBM MQ api 连接时遇到了这个问题。 我也没有发现这个问题与类路径有关。
这发生在我在设置MQEnvironment
的hostname
和channel
之前实例化MQQueueManager
时。
只需确保您的代码不这样做,并在设置环境后实例化管理器。有点像..
MQEnvironment.hostname = "mq hostname";
MQEnvironment.channel = "mq channel";
..more code..
this._queueManager = new MQQueueManager(qManager);
(观察到在MQQueueManager
初始化后设置MQEnvironment.port
是可以的,但可能会一起初始化所有与MQEnvironment
相关的东西)
【讨论】:
【参考方案4】:如果您实际上安装了 MQ Client 而不是 MQ Server,则会发生这种情况。
IBM 甚至为此写了一封whole help page:
WebSphere MQ Client installation missing mqjb*.dll files
问题(摘要)
您安装了 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 产品中。
【讨论】:
【参考方案5】:这是一个简单的食谱:Tell the Java VM to Load the DLL。您的代码是否相似,例如你是用System.loadLibrary
来加载mqjbnd05.dll
吗?
如果是 - 它是否在 Eclipse 之外工作,例如从命令行启动应用程序?如果是这种情况,您可以尝试使用该库路径启动整个 Eclipse IDE。
有时我们会遇到包含空格的路径名问题。将dll复制到C:\
,放到lib路径上再试一次。
啊,就是问题所在,缺少指定的dll。 This blog has a solution。祝你好运!
【讨论】:
问题是我没有找到这个 mqjbn05.dll,我只有 mqjbnd.dll 我在 VM arg 部分指定的路径【参考方案6】:在我设置传输类型时,错误消失了。我正在使用 MQConnectionFactory
mQQueueConnectionFactory.setTransportType( JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
【讨论】:
以上是关于java.lang.UnsatisfiedLinkError的主要内容,如果未能解决你的问题,请参考以下文章