Java 使用jar时出错,但不在库本身中
我构建了一个Java库来在IBMMQ中发送消息 当我在库项目上执行代码时,它工作得很好 但是,当我在另一个工具(JMeter)中使用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
.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中
在用
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从这些包而不是我的包中执行代码。解决方案是删除这些包。