I'm using lsp-mode and the Eclipse JDT language server. lsp-java is great and the maintainer is very responsive to PRs and feedback.
For Scala I use Ensime at work and have been playing with metals at home. The latter is still very much under active development and you'll likely have to put up with Ensime's quirks for a complicated Scala codebase.