
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.
(setq lsp-java-vmargs
(list
"-noverify"
"-Xmx1G"
"-XX:+UseG1GC"
"-XX:+UseStringDeduplication"
"-javaagent:/path/to/lombok-1.18.6.jar"))
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
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: 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.
!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.
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.