Ошибка при использовании jar, но не в самой библиотеке - PullRequest
0 голосов
/ 31 октября 2019

Я создал библиотеку 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 I:

  1. Кликнул Export
  2. Выбранный Runnable JAR file
  3. Выбранный Extract required libraries into generated JAR

Обновление 2

Более того, когда я собрал Jar, я получаю это предупреждение. Как вы думаете, это важно?

Эта операция перепаковывает библиотеки ссылок. Пожалуйста, просмотрите лицензии, связанные с библиотеками, на которые вы хотите сослаться, чтобы убедиться, что вы можете перепаковать их с помощью этого приложения. Также обратите внимание, что эта операция не копирует файлы сигнатур из оригинальных библиотек в сгенерированный файл JAR.

1 Ответ

2 голосов
/ 31 октября 2019

После обсуждения проблемы с 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");
    }
}

Шаг 2: Экспортировал это из eclipse как исполняемый файл jar и скопировал в JMeter (\lib\ext\).

Обратите внимание, что экспорт с обработкой библиотеки package required jars into generated jar не работает. Используйте Extract into generated jar или Copy into subfolder (а затем скопируйте банки из подпапки также в \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: Запустил JMeter и создал ThreadGroup с 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 являются наиболее вероятной причиной проблемы.

...