Cannot instantiate class: org.apache.activemq.jndi.ActiveMQInitialContextFactory, using jmeter-maven-plugin
I think you need to add activemq-all.jar
dependency to /lib/ext
folder of the JMeter, as described here, which is slightly different syntax than <dependency>
you used:
<plugin>
<groupId>com.lazerycode.jmeter</groupId>
<artifactId>jmeter-maven-plugin</artifactId>
<version>2.0.3</version>
<executions>
<execution>
<id>jmeter-test</id>
<phase>verify</phase>
<goals>
<goal>jmeter</goal>
</goals>
</execution>
</executions>
<configuration>
<jmeterExtensions>
<artifact>org.apache.activemq:activemq-all:jar:${activemq.version}</artifact>
</jmeterExtensions>
</configuration>
</plugin>
DemeCarvO
Updated on June 04, 2022Comments
-
DemeCarvO almost 2 years
In few words, if I run the JMeter plan test below from Maven it gives the outcome:
javax.naming.NamingException: javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.activemq.jndi.ActiveMQInitialContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.activemq.jndi.ActiveMQInitialContextFactory]
Nevertheless, if I run the same JMeter plan test without maven plugin, it runs correctly.
Providing more details:
If I start the ActiveMQ that way (Windows command prompty):
cd C:\_d\server\ActiveMQ\apache-activemq-5.9.0\bin activemq.bat
then, I run the the exact same jmx script that way:
jmeter.bat -n -t C:\_d\scripts\JMeter\JMS_SQS_MVN\SQS.jmx -l C:\temp\activemq.jtl -j C:\temp\activemq.jmx.log
I can go to ActiveMq console and see the queue created labeled sqs_dummy_mvn6 as it appears in such jmx script.
Now, tring the same script but via maven plugin, it simply shows "Cannot instantiate class: org.apache.activemq.jndi.ActiveMQInitialContextFactory". Well, I understand that, whenever I use jmeter-maven-plugin, an embedded jmeter and an embedded activemq are started and stopped during the verify phase.
I am calling the same script via maven that way:
mvn clean verify
...\artproducer\src\test\jmeter\SQS.jmx (below just the publisher is enabled; the subscribe is disabled to make the test a bit simpler)
<?xml version="1.0" encoding="UTF-8"?> <jmeterTestPlan version="1.2" properties="2.9" jmeter="3.0 r1743807"> <hashTree> <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Plano de Teste SQS" enabled="true"> <stringProp name="TestPlan.comments"></stringProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="Variáveis Definidas Pelo Usuário" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Grupo de Usuários - Consumers" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Controlador de Iteração" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">1</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <longProp name="ThreadGroup.start_time">1484067293000</longProp> <longProp name="ThreadGroup.end_time">1484067293000</longProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <SubscriberSampler guiclass="JMSSubscriberGui" testclass="SubscriberSampler" testname="JMS Subscriber" enabled="false"> <stringProp name="jms.jndi_properties">false</stringProp> <stringProp name="jms.initial_context_factory">org.apache.activemq.jndi.ActiveMQInitialContextFactory</stringProp> <stringProp name="jms.provider_url">tcp://localhost:61616</stringProp> <stringProp name="jms.connection_factory">ConnectionFactory</stringProp> <stringProp name="jms.topic">dynamicQueues/sqs_dummy_mvn6</stringProp> <stringProp name="jms.security_principle"></stringProp> <stringProp name="jms.security_credentials"></stringProp> <boolProp name="jms.authenticate">false</boolProp> <stringProp name="jms.iterations">1</stringProp> <stringProp name="jms.read_response">true</stringProp> <stringProp name="jms.client_choice">jms_subscriber_on_message</stringProp> <boolProp name="jms.stop_between_samples">true</boolProp> <stringProp name="jms.timeout">60000</stringProp> <boolProp name="jms.destination_static">false</boolProp> </SubscriberSampler> <hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="false"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> <idleTime>true</idleTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> </hashTree> <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="false"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> <idleTime>true</idleTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="false"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> <idleTime>true</idleTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <PublisherSampler guiclass="JMSPublisherGui" testclass="PublisherSampler" testname="JMS Publisher" enabled="true"> <stringProp name="jms.jndi_properties">false</stringProp> <stringProp name="jms.initial_context_factory">org.apache.activemq.jndi.ActiveMQInitialContextFactory</stringProp> <stringProp name="jms.provider_url">tcp://localhost:61616</stringProp> <stringProp name="jms.connection_factory">ConnectionFactory</stringProp> <stringProp name="jms.topic">dynamicQueues/sqs_dummy_mvn6</stringProp> <stringProp name="jms.expiration"></stringProp> <stringProp name="jms.priority"></stringProp> <stringProp name="jms.security_principle"></stringProp> <stringProp name="jms.security_credentials"></stringProp> <stringProp name="jms.text_message">testando a partir do JMeter4444</stringProp> <stringProp name="jms.input_file"></stringProp> <stringProp name="jms.random_path"></stringProp> <stringProp name="jms.config_choice">jms_use_text</stringProp> <stringProp name="jms.config_msg_type">jms_text_message</stringProp> <stringProp name="jms.iterations">1</stringProp> <boolProp name="jms.authenticate">false</boolProp> <elementProp name="jms.jmsProperties" elementType="JMSProperties"> <collectionProp name="JMSProperties.properties"/> </elementProp> <boolProp name="jms.destination_static">false</boolProp> </PublisherSampler> <hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="false"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> <idleTime>true</idleTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> </hashTree> </hashTree> </hashTree> </hashTree> </jmeterTestPlan>
...\artproducer\target\jmeter\results\20170111-SQS.jtl
<?xml version="1.0" encoding="UTF-8"?> <testResults version="1.2"> <sample t="0" it="0" lt="0" ts="0" s="false" lb="JMS Publisher" rc="000" rm="javax.naming.NamingException: javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.activemq.jndi.ActiveMQInitialContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.activemq.jndi.ActiveMQInitialContextFactory]" tn="Grupo de Usuários - Consumers 1-1" dt="" by="0" ng="1" na="1"/> </testResults>
pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>grpactivemq</groupId> <artifactId>artproducer</artifactId> <!-- <packaging>pom</packaging> --> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>artproducer Maven Webapp</name> <url>http://maven.apache.org</url> <!-- enviando queue para o broker do ActiveMq iniciado como serviço --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jdk.version>1.8</jdk.version> <junit.version>4.11</junit.version> <activemq.version>5.9.0</activemq.version> <spring.version>4.1.5.RELEASE</spring.version> </properties> <dependencies> <!-- activemq --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>${activemq.version}</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <!-- xbean --> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>3.7</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <!-- <scope>test</scope> --> </dependency> </dependencies> <build> <plugins> <!-- <plugin> <artifactId>exec-maven-plugin</artifactId> <groupId>org.codehaus.mojo</groupId> <executions> <execution> <id>Run load Test</id> <phase>generate-sources</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>${basedir}/scripts/jmeter_exe.sh</executable> </configuration> </execution> </executions> </plugin> --> <plugin> <groupId>com.lazerycode.jmeter</groupId> <artifactId>jmeter-maven-plugin</artifactId> <version>2.0.3</version> <executions> <execution> <id>jmeter-test</id> <phase>verify</phase> <goals> <goal>jmeter</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>${activemq.version}</version> </dependency> </dependencies> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> </configuration> </plugin> </plugins> <finalName>artproducer</finalName> </build> </project>
-
DemeCarvO over 7 yearsKiril, it is done. As an additional comment, what is the difference between <configuration><jmeterExtensions><artifact> and <dependencies><dependency>...<artifactId> under <build><plugin>? In oother words, what is the difference between your approach and mine. PS. Future readers maybe interested to know that it only works after I followed Kiril answer and I started ActiveMQ service as well, so, I am assuming that such maven plugin doesn't start an ActiveMQ embedded, very different from my assumption in my question.
-
Ardesco over 7 yearsIn 1.x versions of the plugin dependencies were pulled in by applying specific dependencies within the plugin configuration in the POM. We changed this for the 2.x versions of the plugin because we change the way we deal with getting and applying different artefacts. The current implementation should be more reliable.
-
UBIK LOAD PACK over 6 yearsAt the downvoter, can you please test the answer ? Member of our team is a core developper of jmeter-maven-plugin, so the answer is valid. Not very nice to downvote !
-
Ardesco over 6 yearsThe answer by Ubik Load Pack talking about the 2.6.0 version of the plugin is also correct and the way to do it moving forward.
-
Marek Bernád about 6 yearsSame, this answer helped me to fix problems... just download and add this: java2s.com/Code/Jar/a/Downloadactivemqalljar.htm file to /lib/ext and do not forget to rerun / restart Jmeter program to load .jar dependencies