This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
spacemacs/layers/+lang/java/README.org
Keith Pinson 4e57eaceea
Remove gradle-mode to stop it breaking bindings of other major modes
After using Java mode, Gradle keybindings infect or even clobber keybindings of
any subsequently used major-mode. For example, the critical Agda major mode
keybinding of `l` as `agda2-load` gets with a Gradle menu!

The cause, found by @duianto, is that `emacs-gradle-mode` sets itself to a
[global](e4d665d578/gradle-mode.el (L176-L183))
minor mode. The docs for `define-minor-mode` say about `:global:`

> If non-nil specifies that the minor mode is not meant to be
> buffer-local, so don't make the variable MODE buffer-local.
> By default, the mode is buffer-local.

I don't know why `gradle-mode` is doing this; presumably there is some reason or
need for it. But the author of that package hasn't been on GitHub since 2017,
and the last update of the package itself is from early 2015.

To seal the deal, `gradle-mode` hasn't been working anyway (at least, I've never
got it to work). I've been running Gradle by launching a terminal within Emacs.

Fixes #13750.
2020-07-18 09:30:35 +02:00

218 lines
8.8 KiB
Org Mode

#+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 lean 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 [[https://dl.bintray.com/mopemope/meghanada/][there]] 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 g g~ | Go to definition |
| ~SPC m g r~ | Find references |
| ~SPC m g R~ | Peek references using ~lsp-ui~ |
| ~SPC m g d~ | Goto type definition |
| ~SPC m g a~ | Search type in project |
| ~SPC m g A~ | Search type in project using ~lsp-ui~ |
| ~SPC m h h~ | Describe thing at point |
| ~SPC m e l~ | List project errors/warnings |
| ~SPC m p u~ | Refresh user settings |
| ~SPC m e a~ | Execute code action |
| ~SPC m q r~ | Restart workspace |
| ~SPC m r o i~ | Organize imports |
| ~SPC m r r~ | Rename symbol |
| ~SPC m r a i~ | Add import |
| ~SPC m r a m~ | Add unimplemented methods |
| ~SPC m r c p~ | Create parameter |
| ~SPC m r c f~ | Create field |
| ~SPC m r e c~ | Extract constant |
| ~SPC m r e l~ | Extract local |
| ~SPC m r e m~ | Extract method |
| ~SPC m r c i~ | Convert to static import |
| ~SPC m r a t~ | Add throws exception |
| ~SPC m r a a~ | Assign all parameters to fields |
| ~SPC m r a f~ | Assign parameter to field |
| ~SPC m r g g~ | Generate getters/setters |
| ~SPC m r g e~ | Generate =equals= and =hashCode= methods |
| ~SPC m r g t~ | Generate =toString= method |
| ~SPC m r g o~ | Generate method overrides |
| ~SPC m c c~ | Build project |
| ~SPC m c p~ | Create spring boot project |
| ~SPC m a n~ | Actionable notifications |
| ~SPC m =~ | Format code |
*** 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 |