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
# JMeter uses case sensitive string matching to test these paths against class path. # This is very bad since paths must be *exactly* here as they appear in Java classpath. # Hopefully this will be fixed in the future versions. Note Windows needs to escape \ character. # Add JMeter output folder and our plug-in output folder to paths from which # plug-ins are searched search_paths=C:\\xxx\\jmeter-trunk\\bin;. .
- Create _log4j.conf_in src/
log4j.rootLogger=debug, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
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
Faulty jorphan logging launcher
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.