java.lang.UnsatisfiedLinkError: mqjbnd05 (Not found in java.library.path) error in Java program for IBM MQ Binding Connection

java.lang.UnsatisfiedLinkError: mqjbnd05 (Not found in java.library.path) error in Java program for IBM MQ Binding Connection

问题描述:

我已经安装了 9.0 版本的 MQ 服务器和 MQ 客户端。我已经定义了一个队列管理器以及队列和主题。我正在使用 Java 7. 我开发了一个独立的 java 客户端以 BINDING 模式 连接到队列管理器。 java 应用程序和 MQ 托管在同一台服务器上,因此绑定连接有其必要的先决条件。

但是,当我尝试 运行 我的应用程序时,出现错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: mqjbnd05 (Not found in java.library.path)
at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:1279)
at java.lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:1245)
at java.lang.System.loadLibrary(System.java:540)
at com.ibm.mq.MQSESSION.loadLib(MQSESSION.java:872).....

搜索了几个与此相关的主题,但没有找到任何确定的解决方案。我在下面粘贴我的 java 代码:

/**
* 
*/
package com.binding;

import javax.jms.JMSException;
import javax.jms.Session;    
import com.ibm.jms.JMSMessage;
import com.ibm.jms.JMSTextMessage;
import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueue;
import com.ibm.mq.jms.MQQueueConnection;
import com.ibm.mq.jms.MQQueueConnectionFactory;
import com.ibm.mq.jms.MQQueueReceiver;
import com.ibm.mq.jms.MQQueueSender;
import com.ibm.mq.jms.MQQueueSession;

/**
* @author Som
*
*/
public class MQBindingConnection {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

try {
      MQQueueConnectionFactory cf = new MQQueueConnectionFactory();

      // Config
      //cf.setHostName("localhost");
      //cf.setPort(1414);
      cf.setTransportType(JMSC.MQJMS_TP_BINDINGS_MQ);
      cf.setQueueManager("QM.E001");
      //cf.setChannel("SYSTEM.DEF.SVRCONN");

      MQQueueConnection connection = (MQQueueConnection) cf.createQueueConnection("user","pass");
      MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
      MQQueue queue = (MQQueue) session.createQueue("BINDING.CONN");
      MQQueueSender sender =  (MQQueueSender) session.createSender(queue);
      MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue);      

      long uniqueNumber = System.currentTimeMillis() % 1000;
      JMSTextMessage message = (JMSTextMessage) session.createTextMessage("SimplePTP "+ uniqueNumber);     

      // Start the connection
      connection.start();

      sender.send(message);
      System.out.println("Sent message:\n" + message);

      JMSMessage receivedMessage = (JMSMessage) receiver.receive(10000);
      System.out.println("\nReceived message:\n" + receivedMessage);

      sender.close();
      receiver.close();
      session.close();
      connection.close();

      System.out.println("\nSUCCESS\n");
    }
    catch (JMSException jmsex) {
      System.out.println(jmsex);
      System.out.println("\nFAILURE\n");
    }
    catch (Exception ex) {
      System.out.println(ex);
      System.out.println("\nFAILURE\n");
    }

    }

}

我在目录位置找不到文件 "mqjbnd05":C:\Program Files\IBM\MQ\java\lib 同样在我检查过的 lib64 路径中,但文件丢失了。 C:\程序Files\IBM\MQ\java\lib64

我已将我的 CLASSPATH 变量设置为指向正确的 MQ 库目录。

我已经尝试将 lib 目录位置更改为服务器和客户端,但是,文件 "mqjbnd05" 到处都不见了,因此遇到了同样的错误。

使用注释掉的部分的同一段代码 运行 适合 CLIENT 模式 。请告诉我连接时还遗漏了什么绑定模式.

我正在使用以下 ENV 变量:

MQ_JAVA_LIB_PATH = C:\Program Files\IBM\MQ\java\lib64;C:\Program Files\IBM\MQ\java\lib    
MQ_FILE_PATH = C:\Program Files\IBM\MQ    
MQ_JAVA_DATA_PATH = C:\ProgramData\IBM\MQ   
MQ_JAVA_INSTALL_PATH = C:\Program Files\IBM\MQ\java    
MQ_JRE_PATH = C:\Program Files\IBM\MQ\java\jre    
LIB = C:\Program Files\IBM\MQ\tools\lib64;C:\IBM\SQLLIB\LIB;C:\Program Files\IBM\MQ\tools\lib    
CLASSPATH = C:\Program Files\IBM\MQ\java\lib\com.ibm.mqjms.jar;C:\Program Files\IBM\MQ\java\lib\com.ibm.mq.jar;C:\Program Files\IBM\MQ\java\lib;C:\Program Files\IBM\MQ\java\lib64;

要补充的一件事是:我有文件 mqjbnd.dll 但没有 mqjbnd05

mqjbnd05 已从 MQ v7 中的 MQ 产品中删除,而是更喜欢使用具有跨后续版本工作的接口的通用 mqjbnd。但是,这意味着如果您正在 运行 宁 Java 应用程序并获取 MQ v6 或更早的 jar 文件,但是安装了 post-MQv6 的 MQ 产品,那么您将收到错误你报告。我在 MQv9 代码库中找不到对 mqjbnd05 的引用。

鉴于您在评论中说您有 mqjbnd.dll 和 MQServer+MQClient v9,那么我能想到的实现此目的的唯一方法是您从类路径中从 MQv7 之前的版本中获取 jar,或者您已经构建了您的应用程序并在您的应用程序中包含了 MQ jar themsevles。

根据您 运行 您的应用程序的方式,您可以尝试将 -verbose 选项添加到 java 启动以查看 MQ jar 的来源。