#+TITLE: Java layer

#+TAGS: general|layer|multi-paradigm|programming

[[file:img/java.png]]

* Table of Contents                     :TOC_5_gh:noexport:
- [[#description][Description]]
  - [[#features][Features:]]
- [[#layer-installation][Layer Installation]]
  - [[#layer][Layer]]
  - [[#choosing-a-backend][Choosing a backend]]
- [[#backends][Backends]]
  - [[#lsp-java][LSP Java]]
    - [[#installation][Installation]]
  - [[#meghanada][Meghanada]]
    - [[#installation-1][Installation]]
    - [[#about-maven][About Maven]]
- [[#key-bindings][Key bindings]]
  - [[#lsp-java-1][LSP Java]]
    - [[#code-completion][Code completion]]
    - [[#debugger][Debugger]]
  - [[#meghanada-1][Meghanada]]
    - [[#server][Server]]
    - [[#navigation][Navigation]]
    - [[#compilation][Compilation]]
    - [[#tests-junit][Tests (junit)]]
    - [[#refactoring][Refactoring]]
    - [[#tasks][Tasks]]
  - [[#maven][Maven]]

* Description
This layer adds support for the Java language.

** Features:
- Support for the following backends:
  - [[https://github.com/emacs-lsp/lsp-java][LSP Java]] client/server (default)
  - [[https://github.com/mopemope/meghanada-emacs][Meghanada]] client/server
- Auto-completion using company
- Linting using flycheck integration
- Maven integration
- Interactive debugger using [[https://github.com/emacs-lsp/dap-mode][dap-mode]]

* Layer Installation
** Layer
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
add =java= to the existing =dotspacemacs-configuration-layers= list in this
file.

** Choosing a backend
To choose a default backend set the layer variable =java-backend=:

#+BEGIN_SRC elisp
  (java :variables java-backend 'meghanada)
#+END_SRC

Alternatively the =lsp= backend will be automatically chosen if the layer =lsp=
is used and you did not specify any value for =java-backend=.

Backend can be chosen on a per project basis using directory local variables
(files named =.dir-locals.el= at the root of a project), an example to use the
=lsp= backend:

#+BEGIN_SRC elisp
  ;;; Directory Local Variables
  ;;; For more information see (info "(emacs) Directory Variables")

  ((java-mode (java-backend . lsp)))
#+END_SRC

*Note:* you can easily add a directory local variable with ~SPC f v d~.

* Backends
** LSP Java
LSP Java is the Java adapter for [[https://github.com/emacs-lsp/lsp-mode][LSP Mode]] which is the Emacs client for [[https://github.com/Microsoft/language-server-protocol][Language Server Protocol]].

It integrates with =company= and =flycheck=. In addition it also provides
full graphical debugging support via =DAP mode=.

LSP is the default backend used by this layer, see [[#choosing-a-backend][Choosing a backend]] in
order to learn how to select a different backend.

*** Installation
The lsp server will be installed automatically whenever a Java file
is opened.

** Meghanada
Meghanada is composed of a lightweight server and an Emacs minor mode. It
is unintrusive and integrates with =company= and =flycheck=.

Both =Gradle= and =Maven= projects are compatible with Meghanada.

*** Installation
The Meghanada server will be installed automatically whenever a Java file
is opened.

If you get issues with the auto-installation you can either download the last
version of the server manually or build from source hosted on [[https://github.com/mopemope/meghanada-server][the GitHub
repository]] and copy the =jar= file to =.emacs.d/.cache/meghanada= folder.

No additional configuration is necessary!

*** About Maven
Maven is not fully supported by Meghanada (but should still work fine for most
projects). If you encounter disconnection from the server then run =mvn install=
at the root of your project first.

* Key bindings
** LSP Java
*** Code completion

| Key binding   | Description                              |
|---------------+------------------------------------------|
| ~SPC m =~     | Format code                              |
| ~SPC m c c~   | Build project                            |
| ~SPC m c p~   | Create spring boot project               |
| ~SPC m e a~   | Execute code action                      |
| ~SPC m e l~   | List project errors/warnings             |
| ~SPC m g A~   | Search type in project using ~lsp-ui~    |
| ~SPC m g R~   | Peek references using ~lsp-ui~           |
| ~SPC m g a~   | Search type in project                   |
| ~SPC m g d~   | Goto type definition                     |
| ~SPC m g g~   | Go to definition                         |
| ~SPC m g k k~ | Show type hierarchy                      |
| ~SPC m g k s~ | Show sub type hierarchy                  |
| ~SPC m g k u~ | Show super type hierarchy                |
| ~SPC m g r~   | Find references                          |
| ~SPC m h h~   | Describe thing at point                  |
| ~SPC m q r~   | Restart workspace                        |
| ~SPC m r a F~ | Assign statement to field                |
| ~SPC m r a a~ | Assign all parameters to fields          |
| ~SPC m r a f~ | Assign parameter to field                |
| ~SPC m r a i~ | Add import                               |
| ~SPC m r a l~ | Assign statement to local                |
| ~SPC m r a m~ | Add unimplemented methods                |
| ~SPC m r a t~ | Add throws exception                     |
| ~SPC m r c f~ | Create field                             |
| ~SPC m r c i~ | Convert to static import                 |
| ~SPC m r c p~ | Create parameter                         |
| ~SPC m r e c~ | Extract constant                         |
| ~SPC m r e l~ | Extract local                            |
| ~SPC m r e m~ | Extract method                           |
| ~SPC m r g e~ | Generate =equals= and =hashCode= methods |
| ~SPC m r g g~ | Generate getters/setters                 |
| ~SPC m r g o~ | Generate method overrides                |
| ~SPC m r g t~ | Generate =toString= method               |
| ~SPC m r o i~ | Organize imports                         |
| ~SPC m r r~   | Rename symbol                            |
| ~SPC m t b~   | test browser                             |
| ~SPC m w u~   | Refresh user settings                    |

*** Debugger
Using the =dap= layer you'll get access to all the DAP key bindings, see the
complete list of key bindings on the [[https://github.com/syl20bnr/spacemacs/tree/develop/layers/%2Btools/dap#key-bindings][dap layer description]].

** Meghanada
*** Server

| Key binding | Description                                  |
|-------------+----------------------------------------------|
| ~SPC m D c~ | Connect to server                            |
| ~SPC m D d~ | Disconnect from server                       |
| ~SPC m D i~ | Install server (should be done automatically |
| ~SPC m D k~ | Kill server                                  |
| ~SPC m D l~ | Clear server cache                           |
| ~SPC m D p~ | Ping server                                  |
| ~SPC m D r~ | Restart server                               |
| ~SPC m D s~ | Start server                                 |
| ~SPC m D u~ | Update server                                |
| ~SPC m D v~ | Print version of the server                  |

*** Navigation

| Key binding | Description                    |
|-------------+--------------------------------|
| ~SPC m g b~ | Jump back to previous location |
| ~SPC m g g~ | Jump to declaration            |

*** Compilation

| Key binding | Description           |
|-------------+-----------------------|
| ~SPC m c b~ | Compile file (buffer) |
| ~SPC m c c~ | Compile project       |

*** Tests (junit)

| Key binding | Description                 |
|-------------+-----------------------------|
| ~SPC m t a~ | Run all tests               |
| ~SPC m t c~ | Run test class around point |
| ~SPC m t l~ | Run last tests              |
| ~SPC m t t~ | Run test cause around point |

*** Refactoring

| Key binding | Description                            |
|-------------+----------------------------------------|
| ~SPC m =~   | Beautify code                          |
| ~SPC m r i~ | Optimize imports                       |
| ~SPC m r I~ | Import all                             |
| ~SPC m r n~ | Create a new class, interface, or enum |

*** Tasks

| Key binding | Description |
|-------------+-------------|
| ~SPC m x :~ | Run task    |

** Maven

| Key binding     | Description                                          |
|-----------------+------------------------------------------------------|
| ~SPC m m c c~   | Compile                                              |
| ~SPC m m c C~   | Clean                                                |
| ~SPC m m c r~   | Clean and compile                                    |
| ~SPC m m g a~   | Switch between class and test file                   |
| ~SPC m m g A~   | Switch between class and test file in another window |
| ~SPC m m t a~   | Run all tests                                        |
| ~SPC m m t C-a~ | Clean and run all tests                              |
| ~SPC m m t b~   | Run current buffer tests                             |
| ~SPC m m t i~   | Test and install                                     |
| ~SPC m m t t~   | Run a specific test                                  |
