# How to contribute

Want to show Apache JMeter some love? Help out by contributing!

## :beetle: Found a bug

Log it in our bugzilla:

* *<https://jmeter.apache.org/issues.html>*
* or send a note to the *user mailing list*.
Be sure to include all relevant information, like the versions of JMeter you’re using as long as Java version.
A Test plan  that caused the issue as well as any error messages are also very helpful.

## :question: Need help

Simply contact:

* [Our users mailing list](https://jmeter.apache.org/mail2.html#JMeterUser)
* or ask question on [stackoverflow](https://stackoverflow.com/questions/tagged/jmeter).

## :bar_chart: What needs to be developed

See:

* [Open bug entries for JMeter](https://bz.apache.org/bugzilla/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO&bug_severity=Blocker&bug_severity=Critical&bug_severity=Major&bug_severity=Normal&bug_severity=Regression&bug_severity=Minor&bug_severity=Trivial&product=JMeter&order=Bug%20Number&list_id=164231)
* [Enhancement requests for JMeter](https://bz.apache.org/bugzilla/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO&bug_severity=Enhancement&product=JMeter&order=Bug%20Number&list_id=164232)

## Development setup

### Gradle

You might find useful Gradle commands in [gradle.md](gradle.md)

### <a name="intellij"></a>IntelliJ IDEA

You require IntelliJ 2018.3.1 or newer.

1. Open the build.gradle.kts file with IntelliJ IDEA and choose `Open as Project`
1. Make sure `Create separate module per source set` is selected
1. Make sure `Use default gradle wrapper` is selected
1. In the `File already exists` dialogue, choose `Yes` to overwrite
1. In the `Open Project` dialogue, choose `Delete Existing Project and Import`

### Eclipse

Eclipse can import Gradle projects automatically via `Import...->Gradle project` wizard.

Optionally you can generate Eclipse project by running

    ./gradlew eclipse

The steps to import the sources (based on Eclipse 2019-06) into Eclipse are as follows:

1. Install `Eclipse IDE for Java Developers`
1. Install the Groovy Eclipse plugin and select Groovy Compiler 2.4 (some tests are written in Groovy)
1. Install `Kotlin for Eclipse` plugin (builds scripts are written in Kotlin)
1. Make sure you have a Java 8 compatible JDK configured in your workspace
1. Open `File->Import...`
1. Select `Existing Gradle Project` and click `Next`
1. Read `How to experience the best Gradle integration` and click `Next`
1. Then you might just click `Finish`

## :star2: Have a patch

The best way to make sure your issue or feature is addressed is to submit a patch.
We accept patches through:

* pull requests
* patch attached to bugzilla.

However, before sending a patch, please make sure that the following applies:

* Your commit message is descriptive.
* Your patch doesn't have useless merge commits.
* Your coding style is similar to ours.
* Your patch is 100% tested. JUnit are welcome.
* All tests checks pass (run `./gradlew check`)
* You understand that we're very grateful for your patch!

## :heart: Adding something new

We do love to enhance Apache JMeter with you to become more powerful!
The best way to workout your idea is to discuss it first at our dev mailing list:

* [JMeter developers mailing list](https://jmeter.apache.org/mail2.html#JMeterDev)

Please, if you can, don't just throw us the code of a new feature; lets figure first together
what would be the best approach regarding the current architecture and future plans,
before any development.
This way we all get sure that your idea is aligned with the codebase and you can enjoy
your happy coding even more :)

## :closed_book: Want to write docs

Documentation is very valuable to us.

It is located in **[xdocs](xdocs)** folder in XML format.

You can contribute as you would for code through patch or *PR* (pull request).
