Building JMeter plug-in with Eclipse
Targetted to Eclipse 3.1 and JMeter 2.1 trunk version.
- Check out JMeter trunk from Subversion
- Get Subclipse plug-in for Eclipse
- Check out http://svn.apache.org/repos/asf/jakarta/jmeter/trunk as jmeter-trunk Java project
2. Set up jmeter-trunk project
- Let Eclipse internal compiler handle the building of JMeter
- Source build paths:
- src/protocol/ftp
- test/src
- src/protocol/http
- src/protocol/java
- src/protocol/jdbc
- src/protocol/tcp
- src/monitor/components
- src/monitor/model
- src/components
- src/core
- src/examples
- src/functions
- src/htmlparser
- src/jorphan
- src/junit
- src/reports
- Exclude following files from building
- They have missing dependencies and are related to HTTP security which you are not probably interested in
- org/apache/jmeter/util/JsseSSLManager.java
- org/apache/jmeter/util/keystore/DefaultKeyStore.java
- org/apache/jmeter/util/keystore/PKCS12KeyStore.java
- Add libraries
- All jar files under lib/ folder
- All jar files under lib/ folder
- To make logging to Eclipse console work, you need to comment out some code. Read more notes about this below. Class is org.apacha.jmeter.jorphan.logging.LoggingManager
- Exclude following files from building
public static void initializeLogging(Properties properties) { if (logManager == null) { logManager = new LoggingManager(); } /* This following code caused me to lost 3 hours of working time * and now I am extra frustrated setFormat(properties); // Set the top-level defaults setTarget(makeWriter(properties.getProperty(LOG_FILE, "jmeter.log"), LOG_FILE)); setPriority(properties.getProperty(LOG_PRIORITY, "INFO")); setLoggingLevels(properties); // now set the individual categories (if any) * */ setConfig(properties);// Further configuration }
- Now Eclipse should build JMeter without errors (stop icons in source tree)
3. Set up your custom plug-in project
- Create a new Java project
- Add jmeter-trunk to project dependencies
- Create bin/ and src/ folders
- Create jmeter.properties in the bin/
- This defines where JMeter internal class loader looks for classes
- It should look like this
search_paths=../../jmeter-trunk/bin/protocol/ftp; \ ../../jmeter-trunk/bin/protocol/http; \ ../../jmeter-trunk/bin/protocol/java; \ ../../jmeter-trunk/bin/protocol/jdbc; \ ../../jmeter-trunk/bin/protocol/ldap; \ ../../jmeter-trunk/bin/protocol/tcp; \ ../../jmeter-trunk/bin/components; \ ../../jmeter-trunk/bin/core; \ ../../jmeter-trunk/bin/default; \ ../../jmeter-trunk/bin/functions; \ ../../jmeter-trunk/bin/htmlparser; \ ../../jmeter-trunk/bin/jorphan \ .
- Create log4j.conf
4. Setting up a JMeter launcher
- Set working directory to bin/ in your project
- Copy lib/ from jmeter-trunk to your plug-in project root
5. Also, you might want to modify class
Notes
I wasted 4 hours trying to get Jorphan logging to work. Jorphan overrides log4j normal configuration mechanism, but does it badly, making log activation impossible.
- There is one missing dependency which causes start-up failure with message Caused by: java.lang.NoClassDefFoundError: org/apache/avalon/excalibur/i18n/ResourceManager if you try to configure logger. Get the jar file from http://mirrors.bevc.net/apache/excalibur/excalibur-i18n/binaries/ and place it to lib/
2. Even after placing a correct logging file through jmeter.properties settings you get this
org.apache.avalon.framework.configuration.ConfigurationException: No log targets configured for the root logger. at org.apache.avalon.excalibur.logger.LogKitLoggerManager.setupLoggers(LogKitLoggerManager.java:531) at org.apache.avalon.excalibur.logger.LogKitLoggerManager.configure(LogKitLoggerManager.java:407) at org.apache.jorphan.logging.LoggingManager.setConfig(LoggingManager.java:148) at org.apache.jorphan.logging.LoggingManager.initializeLogging(LoggingManager.java:114) at org.apache.jmeter.util.JMeterUtils.getProperties(JMeterUtils.java:133) at org.apache.jmeter.JMeter.initializeProperties(JMeter.java:327) at org.apache.jmeter.JMeter.start(JMeter.java:242) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.jmeter.NewDriver.main(NewDriver.java:161)
My head was already hurting so badly that I didn't want to debug the problem further. The JMeter logging code had several deprecated non-func histroric layers confusing poor debuggers.
---- End of edit conflict ----