Java 使用jar时出错,但不在库本身中

Java 使用jar时出错,但不在库本身中,java,ibm-mq,Java,Ibm Mq,我构建了一个Java库来在IBMMQ中发送消息 当我在库项目上执行代码时,它工作得很好 但是,当我在另一个工具(JMeter)中使用.jar时,会发生错误 java.lang.NoSuchMethodError: com.ibm.mq.jmqi.JmqiFactory.getInstance(Lcom/ibm/mq/jmqi/JmqiThreadPoolFactory;Lcom/ibm/mq/jmqi/JmqiPropertyHandler;)Lcom/ibm/mq/jmqi/JmqiEnvir

我构建了一个Java库来在IBMMQ中发送消息

当我在库项目上执行代码时,它工作得很好

但是,当我在另一个工具(JMeter)中使用
.jar
时,会发生错误

java.lang.NoSuchMethodError: com.ibm.mq.jmqi.JmqiFactory.getInstance(Lcom/ibm/mq/jmqi/JmqiThreadPoolFactory;Lcom/ibm/mq/jmqi/JmqiPropertyHandler;)Lcom/ibm/mq/jmqi/JmqiEnvironment;
    at com.ibm.msg.client.mqlight.MQLightComponent.getImplementationInfo(MQLightComponent.java:220) ~[mq-jms-8.0.0.3.jar:8.0.0.3 - p800-003-150615.2]
    at com.ibm.msg.client.commonservices.trace.Trace.getVersion(Trace.java:1692) ~[mq-jms-7.0.1.3.jar:?]
    at com.ibm.msg.client.commonservices.trace.Trace.createFFSTString(Trace.java:1650) ~[mq-jms-7.0.1.3.jar:?]
    at com.ibm.msg.client.commonservices.trace.Trace.ffstInternal(Trace.java:1536) ~[mq-jms-7.0.1.3.jar:?]
    at com.ibm.msg.client.commonservices.trace.Trace.ffst(Trace.java:1444) ~[mq-jms-7.0.1.3.jar:?]
    at com.ibm.msg.client.jms.JmsFactoryFactory.getInstance(JmsFactoryFactory.java:209) ~[mq-jms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
    at com.ibm.mq.jms.MQConnectionFactory.initialiseMQConnectionFactory(MQConnectionFactory.java:3325) ~[mq-jms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
    at com.ibm.mq.jms.MQConnectionFactory.<init>(MQConnectionFactory.java:274) ~[mq-jms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
    at my.package.MQ_Manager.createConnection(MQ_Manager.java:36) ~[my-jar.jar:?]
    at my.package.MQ_Manager.<init>(MQ_Manager.java:27) ~[my-jar.jar:?]
    at my.package.Producer.<init>(Producer.java:18) ~[my-jar.jar:?]
    at my.package.Request.sendRequest(Request.java:116) ~[my-jar.jar:?]
    at my.package.Request$sendRequest$2.call(Unknown Source) ~[?:?]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120) ~[groovy-all-2.4.16.jar:2.4.16]
    at Script1.run(Script1.groovy:14) ~[?:?]
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:321) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.16.jar:2.4.16]
    at javax.script.CompiledScript.eval(Unknown Source) ~[?:1.8.0_31]
    at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:223) ~[ApacheJMeter_core.jar:5.1 r1853635]
    at org.apache.jmeter.protocol.java.sampler.JSR223Sampler.sample(JSR223Sampler.java:71) ~[ApacheJMeter_java.jar:5.1 r1853635]
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:622) ~[ApacheJMeter_core.jar:5.1 r1853635]
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:546) ~[ApacheJMeter_core.jar:5.1 r1853635]
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:486) ~[ApacheJMeter_core.jar:5.1 r1853635]
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:253) ~[ApacheJMeter_core.jar:5.1 r1853635]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_31]
此行出现错误
MQConnectionFactory=new MQConnectionFactory()

有什么想法吗?多谢各位

更新1

要创建
.jar
I:

  • 单击导出
  • 已选择
    可运行JAR文件
  • 选中的
    将所需库提取到生成的JAR中
  • 更新2

    此外,当我建造这个罐子时,我得到了这个警告。你认为这重要吗

    此操作重新打包引用库。请查看与您希望ti参考的库相关的许可证,以确保您能够使用此应用程序重新打包它们。还要注意,此操作不会将原始库中的签名文件复制到生成的JAR文件中


    在用
    OP
    讨论了这个问题之后,我自己验证了这个问题。 结果是它对我有用

    第1步: 创建了一个包含以下代码的maven项目

    package test;
    
    import javax.jms.JMSException;
    import com.ibm.mq.jms.MQConnectionFactory;
    
    public class JmeterTest {
    
        public JmeterTest() {
        }
    
        public void test() throws JMSException {
            MQConnectionFactory factory = new MQConnectionFactory();
            factory.setAppName("myApp");
        }
    
        public static void main(String[] args) {
            System.out.println("test");
        }
    }
    
    第二步: 将其作为可运行jar从eclipse导出并复制到JMeter(
    \lib\ext\

    请注意,使用库处理
    将所需jar打包到生成的jar
    中的导出不起作用。使用
    提取到生成的jar中
    复制到子文件夹中
    (然后也将jar从子文件夹复制到
    \lib\ext

    相关依赖项包括:

    com.ibm.mq.allclient-9.0.4.0.jar
    bcokix-jdk15on-1.57.jar
    bcprov-jdk15on-1.57.jar
    javax.jms-api-2.0.1.jar
    
    第三步: 启动JMeter并使用
    JSR223采样器创建线程组

    import test.JmeterTest;
    new JmeterTest().test();
    
    然后开始测试。没有发生错误

    第4步:

    您可以直接(在添加依赖项后)将所需代码添加到脚本面板中,而不是导出库:

    import javax.jms.JMSException;
    import com.ibm.mq.jms.MQConnectionFactory;
    
    MQConnectionFactory factory = new MQConnectionFactory();
    factory.setAppName("myApp");
    
    同样有效



    结论:来自jmeter类路径的其他依赖项的干扰是问题的最可能原因。

    在使用
    OP
    讨论问题后,我自己进行了验证。 结果是它对我有用

    第1步: 创建了一个包含以下代码的maven项目

    package test;
    
    import javax.jms.JMSException;
    import com.ibm.mq.jms.MQConnectionFactory;
    
    public class JmeterTest {
    
        public JmeterTest() {
        }
    
        public void test() throws JMSException {
            MQConnectionFactory factory = new MQConnectionFactory();
            factory.setAppName("myApp");
        }
    
        public static void main(String[] args) {
            System.out.println("test");
        }
    }
    
    第二步: 将其作为可运行jar从eclipse导出并复制到JMeter(
    \lib\ext\

    请注意,使用库处理
    将所需jar打包到生成的jar
    中的导出不起作用。使用
    提取到生成的jar中
    复制到子文件夹中
    (然后也将jar从子文件夹复制到
    \lib\ext

    相关依赖项包括:

    com.ibm.mq.allclient-9.0.4.0.jar
    bcokix-jdk15on-1.57.jar
    bcprov-jdk15on-1.57.jar
    javax.jms-api-2.0.1.jar
    
    第三步: 启动JMeter并使用
    JSR223采样器创建线程组

    import test.JmeterTest;
    new JmeterTest().test();
    
    然后开始测试。没有发生错误

    第4步:

    您可以直接(在添加依赖项后)将所需代码添加到脚本面板中,而不是导出库:

    import javax.jms.JMSException;
    import com.ibm.mq.jms.MQConnectionFactory;
    
    MQConnectionFactory factory = new MQConnectionFactory();
    factory.setAppName("myApp");
    
    同样有效



    结论:其他依赖项对jmeter类路径的干扰是问题的最可能原因。

    您的
    jar
    是否包含它所依赖的适当库(或者您是否手动将这些库添加到
    jmeter
    的类路径)?@再次感谢您的回答。是的,我认为错误应该发生在第一行而不是方法的末尾。你能添加完整的stacktrace吗?@第二,我把stacktrace放在问题中。你能提供类路径中所有依赖项的列表(从你的jar和jmeter本身)吗?可能这个类在不同的jar中有多个版本?您的
    jar
    是否包含它所依赖的正确库(或者您是否手动将这些库添加到
    jmeter
    的类路径中)?@再次感谢您的回答。是的,我认为错误应该发生在第一行而不是方法的末尾。你能添加完整的stacktrace吗?@第二,我把stacktrace放在问题中。你能提供类路径中所有依赖项的列表(从你的jar和jmeter本身)吗?也许这个类在不同的jar中有多个版本?谢谢!实际上,这个问题是由其他包(
    jmqi
    mqjms
    )引起的。所以JMeter从这些包而不是我的包中执行代码。解决方案是删除这些包。谢谢!实际上,这个问题是由其他包(
    jmqi
    mqjms
    )引起的。所以JMeter从这些包而不是我的包中执行代码。解决方案是删除这些包。