【问题标题】:java.lang.UnsatisfiedLinkError: mqjbnd05 (Not found in java.library.path) error in Java program for IBM MQ Binding Connectionjava.lang.UnsatisfiedLinkError: IBM MQ Binding Connection 的 Java 程序中的 mqjbnd05 (Not found in java.library.path) 错误
【发布时间】:2018-05-05 06:55:17
【问题描述】:

问题描述:

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

但是,当我尝试运行我的应用程序时,我遇到了一个错误:

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:\Program Files\IBM\MQ\java\lib64

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

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

使用注释掉部分的同一段代码在CLIENT 模式 下运行良好。请告诉我在BINDING 模式 中连接时我还遗漏了什么。

我正在使用以下 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

【问题讨论】:

    标签: java jms ibm-mq


    【解决方案1】:

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

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

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

    【讨论】:

    • @Som 添加到 JasonE 所说的内容中,您的 CLASSPATH 并不表示您有任何目录,除了将与 MQ v9 一起安装的目录。检查应用程序 jar 文件或项目中包含的任何 com.ibm.*.jar 文件。如果您找到任何检查META-INF/MANIFEST.MF 文件并查找Implementation-Version,这将告诉您想要jar 文件来自的MQ 版本。您应该从您的应用程序中删除对这个旧 MQ jar 文件的引用,并让它选择您在CLASSPATH 中列出的当前 jar 文件。
    • @JasonE:你好杰森,是的,你是对的。我使用的是旧版本的 com.ibm.mq.jar 和 com.ibm.mqjms.jar。我已将它们替换为来自 MQ v9.0 产品的那些。我的代码现在运行成功。非常感谢您的建议。 JoshMc:是的,你是对的。谢谢。
    • @Som 我建议只从指向 MQ 安装位置的 CLASSPATH 中提取 jar 文件,这样您将始终选择与服务器上安装的版本匹配的版本。
    猜你喜欢
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多