blob: dcd060e4cf368e95ea33b786480529daf4ad1146 [file] [view]
---
layout: default
title: Errorprone for Java
grand_parent: Setup for Contributors
parent: Java Setup
---
<!--
© 2026 and later: Unicode, Inc. and others.
License & terms of use: http://www.unicode.org/copyright.html
-->
# Errorprone for Java
{: .no_toc }
## Contents
{: .no_toc .text-delta }
1. TOC
{:toc}
---
Error Prone is a static analysis tool for Java that catches common programming mistakes at compile-time. See https://errorprone.info/
ICU4J runs it in CI for each pull request to prevent problems from being
introduced, and to periodically generate a report, posted at
https://github.com/unicode-org/icu, under the “Quality Reports (main branch)”
Java static analysis section).
## Integration with IDEs
See https://errorprone.info/docs/installation
## Running the checks
There are currently two CI checks for errorprone.
One is executed for each PR, and fails if a problem is detected.
The other one generates a full report, and does not fail.
The result is posted on the project GitHub page, under Quality Reports.”
Here is how you run the test that runs in CI:
```sh
mvn clean test -DskipTests -DskipITs -P errorprone
```
And here is how to run the full test that produces reports in `html`, `tsv`,
and `md` formats.
```sh
# Run the checks
mvn clean test -DskipTests -DskipITs \
-l /tmp/errorprone_all.log -P errorprone-all
# Generate reports in html, tsv, and md formats
mvn exec:java -f icu4j/tools/errorprone_report/ \
-DlogFile=/tmp/errorprone_all.log -P errorprone_report
# Make sure it says "BUILD SUCCESS"
tail /tmp/errorprone_all.log
```
## Patching
See https://errorprone.info/docs/patching. \
But we will summarize here how to use it from Maven, for ICU4J.
> :point_right: **Note**: This is the patching mechanism provided by errorprone itself.
But there are (of course) other ways, for example an IDE. \
For example I had good results with Eclipse, enabling a certain check,
then asking Eclipse to fix all instances.
> :point_right: **Note**: this patching is not necessarily perfect.
Always check, visually and by running all tests.
### Preparation
1. Edit the `pom.xml` in the root of the ICU repo.
1. Search for the `errorprone-all` profile, and in the `compilerArgs` section of
that profile find the `<arg>` element that contains `-Xplugin:ErrorProne`.
1. After `-Xplugin:ErrorProne` add `-XepPatchChecks:<listOfIssueTypes> -XepPatchLocation:IN_PLACE`.
For example `-XepPatchChecks:UnusedMethod`. \
You can also specify more than one kind of issues to fix, using comma as a separator,
for example `-XepPatchChecks:UnusedMethod,UnusedVariable`.
### Apply the fixes
Run the errorprone report generation step:
```sh
mvn clean test -DskipTests -DskipITs -l /tmp/errorprone_all.log -P errorprone-all
```
If errorprone knows how to patch the kind of issue you specified, it will update the files.
> :point_right: **Note**: the patches will not always apply cleanly.
>
> Keep an eye on warnings or errors, you might have to fix some problems "by hand."
### Test, cleanup
**Re-format:**
```sh
mvn spotless:apply
```
**Test:**
```sh
mvn package
```
**Visually inspect the changed files** (`git diff` or a GUI git client are handy here). Compare with the initial errorprone report.
### Prepare to submit
Update `errorprone.cfg` to declare the issue you just fix as an error. \
That way it will prevent it from coming back in the future.
In our example add `-Xep:UnusedMethod:ERROR`.
Revert the `pom.xml` changes (`git checkout -- pom.xml`).
Run all the errorprone checks (see [“Running the checks”](#running-the-checks))
to see that the all issues of that type are fixed.
Run a regular build with testing:
```sh
mvn clean package
```
You might have to go back to [“Test, cleanup”](#test-cleanup) if something fails.
Finally, create a PR, commit, push, send for review.