:linkattrs:
= Gerrit Code Review - Eclipse Setup

This document is about configuring Gerrit Code Review into an
Eclipse workspace for development.

Java 11 or later SDK is required.
Otherwise, java 8 can still be used for now as described below.

[[setup]]
== Project Setup

In your Eclipse installation's link:https://wiki.eclipse.org/Eclipse.ini[`eclipse.ini`,role=external,window=_blank] file,
add the following line in the `vmargs` section:

----
  -DmaxCompiledUnitsAtOnce=10000
----

Without this setting, annotation processing does not work reliably and the
build is likely to fail with errors like:

----
  Could not write generated class ... javax.annotation.processing.FilerException: Source file already created
----

and

----
  AutoAnnotation_Commands_named cannot be resolved to a type
----

First, generate the Eclipse project by running the `tools/eclipse/project.py` script.
If running Eclipse on Java 8, add the extra parameter
`-e='--java_toolchain=//tools:error_prone_warnings_toolchain'`
for generating a compatible project.

Then, in Eclipse, choose 'Import existing project' and select the `gerrit` project
from the current working directory.

Expand the `gerrit` project, right-click on the `eclipse-out` folder, select
'Properties', and then under 'Attributes' check 'Derived'.

Note that if you make any changes in the project configuration
that get saved to the `.project` file, for example adding Resource
Filters on a folder, they will be overwritten the next time you run
`tools/eclipse/project.py`.

=== Eclipse project on MacOS

By default, bazel uses `/private/var/tmp` as the
link:https://docs.bazel.build/versions/master/output_directories.html[outputRoot on MacOS].
This means that the eclipse project will reference libraries stored under that directory.
However, MacOS runs periodic cleanup task which deletes the content under `/private/var/tmp`
which wasn't accessed or modified for some days, by default 3 days. This can lead to a broken
Eclipse project as referenced libraries get deleted.

There are two possibilities to mitigate this issue.

==== Change the location of the bazel output directory
On Linux, the output directory defaults to `$HOME/.cache/bazel` and the same can be configured
on Mac too. Edit, or create, the `$HOME/.bazelrc` file and add the following line:
----
startup --output_user_root=/Users/johndoe/.cache/bazel
----

==== Increase the treshold for the cleanup of temporary files
The default treshold for the cleanup can be overriden by creating a configuration file under
`/etc/periodic.conf` and setting a larger value for the `daily_clean_tmps_days`.

An example `/etc/periodic.conf` file:

----
# This file overrides the settings from /etc/defaults/periodic.conf
daily_clean_tmps_days="45"                              # If not accessed for
----

For more details about the proposed workaround see link:https://superuser.com/a/187105[this post]

=== Eclipse project with custom plugins ===

To add custom plugins to the eclipse project add them to `tools/bzl/plugins.bzl`
the same way you would when
link:dev-build-plugins.html#_bundle_custom_plugin_in_release_war[bundling in release.war]
and run `tools/eclipse/project.py`.

== Java Versions

Java 11 is supported as a default, but some adjustments must be done for other JDKs:

* Add JRE, e.g.: directory: /usr/lib64/jvm/java-9-openjdk, name: java-9-openjdk-9
* Change execution environment for gerrit project to: JavaSE-9 (java-9-openjdk-9)
* Check that compiler compliance level in gerrit project is set to: 9

Moreover, the actual java 11 language features are not supported yet.

[[Formatting]]
== Code Formatter Settings

To format source code, Gerrit uses the
link:https://github.com/google/google-java-format[`google-java-format`,role=external,window=_blank]
tool (version 1.7), which automatically formats code to follow the
style guide. See link:dev-crafting-changes.html#style[Code Style] for the
instruction how to set up command line tool that uses this formatter.
The Eclipse plugin is provided that allows to format with the same
formatter from within the Eclipse IDE. See
link:https://github.com/google/google-java-format#eclipse[Eclipse plugin,role=external,window=_blank]
for details how to install it. It's important to use the same plugin version
as the `google-java-format` script.

== Site Initialization

Build once on the command line with
link:dev-bazel.html#build[Bazel] and then follow
link:dev-readme.html#init[Site Initialization] in the
Developer Setup guide to configure a local site for testing.


== Testing

=== The Gerrit web app UI is served by `server.go` process. To launch it,
run this command:

----
  $ bazel run polygerrit-ui:devserver
----

=== Running the Daemon

Duplicate the existing launch configuration:

* In Eclipse select Run -> Debug Configurations ...
* Java Application -> `gerrit_daemon`
* Right click, Duplicate
* Modify the name to be unique.
* Switch to Arguments tab.
* Edit the `-d` program argument flag to match the path used during
  'init'.  The template launch configuration resolves to `../gerrit_testsite`
  since that is what the documentation recommends.

* Switch to Common tab.
* Change Save as to be Local file.
* Close the Debug Configurations dialog and save the changes when prompted.

GERRIT
------
Part of link:index.html[Gerrit Code Review]

SEARCHBOX
---------
