代码之家  ›  专栏  ›  技术社区  ›  Royce

使用jar但不在库中时出错

  •  0
  • Royce  · 技术社区  · 5 年前

    我构建了一个Java库来在IBM MQ中发送消息。

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

    .jar 在另一个工具(JMeter)中,会发生错误。

    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 factory = new MQConnectionFactory();
    factory.setHostName(properties.getProperty("HOST"));
    factory.setPort(Integer.parseInt(properties.getProperty("PORT")));
    factory.setChannel(properties.getProperty("CHANNEL"));
    factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
    factory.setQueueManager(properties.getProperty("QUEUE_MANAGER"));
    factory.setAppName(properties.getProperty("APP_NAME"));
    Connection connection = factory.createConnection(properties.getProperty("APP_USER"), properties.getProperty("APP_PASSWORD"));
    connection.start();
    return connection;
    

    MQConnectionFactory factory = new MQConnectionFactory();

    知道吗?谢谢您。

    更新1

    .jar文件 一:

    1. 点击 Export
    2. 挑选出来的 Runnable JAR file
    3. Extract required libraries into generated JAR

    更新2

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

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

    0 回复  |  直到 5 年前
        1
  •  2
  •   second    5 年前

    在与 OP 我亲自去核实了这个问题。 结果是它对我有用。。。

    创建了一个包含以下代码的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");
        }
    }
    

    步骤2: 从eclipse将其导出为runnable jar并复制到JMeter中( \lib\ext\

    注意,带有库处理的导出 package required jars into generated jar 不起作用。使用 Extract into generated jar Copy into subfolder (然后将jars从子文件夹复制到 \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
    

    步骤3: JSR223 Sampler .

    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类路径的其他依赖项的干扰可能是问题的最可能原因。