【问题标题】:Error running simple jar with MQ classes for Java使用 Java 的 MQ 类运行简单 jar 时出错
【发布时间】:2017-01-29 17:36:27
【问题描述】:

我是Websphere MQ classes for Java 编程的初学者。
我决定按照这种方式编写一个小型应用程序,该应用程序能够通过 TCP/IP 连接和读取队列中的消息。

按照本指南:http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=%2Fcom.ibm.mq.csqzaw.doc%2Fja10410_.htm

在第 4 点建议在 windows 命令提示符下测试Websphere Client 安装(版本:7.0.1.8),使用:
java -Djava.library.path=library_path MQIVP
其中 'library_path' 对我来说是“C:\Program Files\IBM\WebSphere MQ\java\lib”

应用程序运行,我开始编写一个简单的程序,代码如下:Eclipse IDE

import com.ibm.mq.MQEnvironment;

public class MQtestMain {

    public static void main(String[] args) {

        System.out.println("main");

        new MQtestMain();
    }

    public MQtestMain(){

        System.out.println("MQtestMain");

        MQEnvironment.hostname = "my.host.name";
        MQEnvironment.channel = "my.channel";
        MQEnvironment.port = 1414;

    }

}

这无关紧要,只是一个测试,以确保一切都正确设置。

我已经设置了一个自定义库,其中包含来自“C:\Program Files\IBM\WebSphere MQ\java\lib”的 'com.ibm.mq.jar' 和 'com.ibm.mq.jmqi.jar' 和编译时不报错。

Eclipse 运行应用程序,它会在控制台上正确打印出“main”和“MQtestMain”。

因此我开始导出它:文件 > 导出 > 可运行的 Jar
将“库处理”设置为“将所需库打包到生成的 JAR”中

不幸的是,如果我从 Windows 命令提示符运行程序:java -jar MQtest.jar 结果如下:

main
MQtestMain
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
Caused by: java.lang.NoClassDefFoundError: javax/resource/ResourceException
        at com.ibm.mq.MQEnvironment.<clinit>(MQEnvironment.java:576)
        at MQtestMain.<init>(MQtestMain.java:21)
        at MQtestMain.main(MQtestMain.java:14)
        ... 5 more
Caused by: java.lang.ClassNotFoundException: javax.resource.ResourceException
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 8 more

第一行和第二行是对的,但是下面的错误我实在看不懂


更新:

我试着给你更多的信息:
正如我所说,从其主 class 文件运行应用程序没有问题,而从 jar 文件执行它似乎无法找到 IBM 库。
我在eclipse 中创建了一个名为“MQ classes for Java”的个人库,其中包含此应用程序使用的两个 jar 包。
这里是项目.classpath文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
    <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/MQ classes for Java"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

有没有办法将正确的库链接到可运行的 jar,以便从每台安装了 WMQ 客户端的机器上启动它?


解决方案:

由于未找到某些依赖项而导致的错误已得到解决,包括 所有IBM classes for Java jar 文件放入 WMQ Client 文件夹安装(“C:\Program Files\IBM\ WebSphere MQ\java\lib")

【问题讨论】:

  • 安装了哪个版本的WMQ客户端? (输入dspmqver"C:\Program Files\IBM\WebSphere MQ\bin\dspmqver"时会显示什么?)
  • 这里是结果:Name: WebSphere MQVersion: 7.0.1.8CMVC level: p701-108-120224BuildType: IKAP - (Production)
  • 我认为用eclipse 标签替换command-prompt 标签可能会更好。尽管您已将此表述为 MQ 问题,但在我看来,您真正想说的是“我有一个可以在 Eclipse 中运行的程序,但是当我尝试创建一个包含依赖库的可运行 jar 时,我得到 ClassNotFoundException运行。”这听起来更像是 Eclipse 问题而不是 MQ 问题。当然,如果您愿意,我们可以将其作为 MQ 问题来解决,并且您绝对可以通过摆弄 CLASSPATH-Djava.library.path 来让它工作。

标签: java windows eclipse jar ibm-mq


【解决方案1】:

我只是通过添加 javax 依赖解决了这个问题:

<dependency>
    <groupId>javax.resource</groupId>
    <artifactId>connector-api</artifactId>
    <version>1.5</version>
</dependency>

【讨论】:

    【解决方案2】:

    您需要像 MQIVP 测试一样使用 java.library.path 或设置 CLASSPATH 以包含 MQ JAR 文件。

    【讨论】:

    • 我尝试按照您的建议使用以下命令:java -Djava.library.path="C:\Program Files\IBM\WebSphere MQ\java\lib" -jar MQtest.jar 获得相同的错误。因此,我想我写错了路径。无论如何,我认为 JAR 文件是一个“完整包”,其中包含运行所需的所有文件,这是错误的吗?如果我从我的 Eclipse 项目的 bin 文件夹中执行:java MQtestMain 它运行正确,但我需要从另一台机器上运行它。
    • 另一台机器需要安装IBM的WMQ客户端代码。 IBM 的 WMQ 代码没有可再分发的许可或软件包,如果您只是抓取或打包 jar 文件,则不支持。
    • 好的,在我要运行应用程序的所有机器上安装WMQ Client 对我来说没有问题,但我更喜欢使用“单文件”程序(如 JAR ) 而不是一系列类(考虑我将在单独的.class 文件上有一个图形界面的情况)。哪个应该是运行可执行 JAR 的正确方法?
    【解决方案3】:

    解决方案:

    这些错误是由于未找到某些依赖项造成的;
    它们可以解决,包括所有IBM classes for Javajar文件放入WMQ Client文件夹安装(“C:\Program Files\IBM\WebSphere MQ\java\lib”)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多