My current Java setup utilises lsp-java and dap-java which together gives me a good Java coding and debugging experience in Emacs, including code navigation, auto completion, documentation lookup, on the fly de-compiling 3rd party libraries and remote debugging an application servers.
Everything works pretty much out of the box, once you've wired up
lsp-java
and dap-java
, it'll figure out your Maven project by
itself and download whatever it needs in the background. I've used
this setup for a good while now on a code base with around 5000 Java
files and 65 Maven modules and the performance is impeccable.
You can see my setup in action in the screencast below.
Support for Lombok
(setq lsp-java-vmargs
(list
"-noverify"
"-Xmx1G"
"-XX:+UseG1GC"
"-XX:+UseStringDeduplication"
"-javaagent:/path/to/lombok-1.18.6.jar"))
Trouble shooting
If lsp-java
doesn't work, a good place to start is to look in the
Eclipse server log file:
$ tail -f ~/.emacs.d/workspace/.metadata/.log
java.lang.NoSuchMethodError: java.nio.ByteBuffer.limit(I)Ljava/nio/ByteBuffer;
You need to make the language server use Java 9 and it must be OpenJDK:
(setq lsp-java-java-path
"/usr/lib/jvm/java-9-openjdk-amd64/bin/java")
See this ticket over at jira.mongodb.org for a good explanation of why these errors happen
java.security.InvalidAlgorithmParameterException
java.security.InvalidAlgorithmParameterException: the
trustAnchors parameter must be non-empty
The easiest solution is to just use OpenJDK instead of Oracle Java to
run the Eclipse server (I just did apt-get install
openjdk-9-jdk
), you can set this in your .emacs
by setting
lsp-java-java-path
, see above.
NoClassDefFoundError: javax/annotation/processing/AbstractProcessor
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.core.resources".
!STACK 0
java.lang.NoClassDefFoundError: javax/annotation/processing/AbstractProcessor
at java.base/java.lang.ClassLoader.findBootstrapClass(Native Method)
at java.base/java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1248)
at java.base/java.lang.System$2.findBootstrapClassOrNull(System.java:2123)
The problem was that by having Lombok on the boot classpath it would
interfere with the annotation processing mechanism in the Eclipse
server. The
remedy
was to remove -Xbootclasspath/a:/path/to/lombok-1.16.18.jar
and only
specify Lombok in the javaagent
parameter.
Wipe the slate clean
To remove all generated files and caches related to LSP, do:
$ rm -rf ~/.emacs.d/workspace \
~/.emacs.d/.cache/lsp
This can be worth trying before going mad about something not working.
Also, there's a minimal .emacs config on the lsp-java website that you can try without your own configuration to ensure your problems are not due to your own (combination of) configuration.
Other Java extensions for Emacs I've used
- meghanada, 2017
- emacs-eclim, 2012-2016
- JDEE, 1999-2005
- malabar