Just install and start writing public static void main(String[] args).
Demo.mp4
- ✅ Diagnostics & Auto Completion
- ✅ Automatic DAP debug configuration
- ✅ Running tests
- Everything necessary will be installed automatically
- Uses nvim-lspconfig to setup
jdtls - Realtime server settings updates is possible using neoconf
- Auto loads necessary
jdtlsplugins- Supported plugins are,
lombokjava-testjava-debug-adapter
- Supported plugins are,
🔸details
- Install the plugin
Using lazy.nvim
return {
'nvim-java/nvim-java',
dependencies = {
'nvim-java/lua-async-await',
'nvim-java/nvim-java-core',
'nvim-java/nvim-java-test',
'nvim-java/nvim-java-dap',
'MunifTanjim/nui.nvim',
'neovim/nvim-lspconfig',
'mfussenegger/nvim-dap',
{
'williamboman/mason.nvim',
opts = {
registries = {
'github:nvim-java/mason-registry',
'github:mason-org/mason-registry',
},
},
}
},
}- Setup nvim-java before
lspconfig
require('java').setup()- Setup jdtls like you would usually do
require('lspconfig').jdtls.setup({})Yep! That's all :)
🔸details
JavaDapConfig- DAP is autoconfigured on start up, but in case you want to force configure it again, you can use this APIJavaTestRunCurrentClass- Run the test class in the active bufferJavaTestDebugCurrentClass- Debug the test class in the active bufferJavaTestRunCurrentMethod- Run the test method on the cursorJavaTestDebugCurrentMethod- Debug the test method on the cursorJavaTestViewLastReport- Open the last test report in a popup window
🔸details
DAP
config_dap- DAP is autoconfigured on start up, but in case you want to force configure it again, you can use this API
require('java').dap.config_dap()Test
run_current_class- Run the test class in the active buffer
require('java').test.run_current_class()debug_current_class- Debug the test class in the active buffer
require('java').test.debug_current_class()run_current_method- Run the test method on the cursor
require('java').test.run_current_method()debug_current_method- Debug the test method on the cursor
require('java').test.debug_current_method()view_report- Open the last test report in a popup window
require('java').test.view_last_report()🔸details
Method 1:
Neoconf can be used to manage LSP setting including jdtls. Neoconf allows
global configuration as well as project vice configurations. Here is how you can set Jdtls setting on neoconf.json
{
"lspconfig": {
"jdtls": {
"java.configuration.runtimes": [
{
"name": "JavaSE-21",
"path": "/opt/jdk-21",
"default": true
}
]
},
}
}Method 2:
Pass the settings to Jdtls setup.
require('lspconfig').jdtls.setup({
settings = {
java = {
configuration = {
runtimes = {
{
name = "JavaSE-21",
path = "/opt/jdk-21",
default = true,
}
}
}
}
}
})🔸details
Following is the high level idea. Jdtls is the language server nvim-java communicates with. However, we don't have all the features we need just in Jdtls. So, we are loading java-test & java-debug-adapter extensions when we launch Jdtls. Once the language server is started, we communicate with the language server to do stuff.
For instance, to run the current test,
- Request Jdtls for test classes
- Request Jdtls for class paths, module paths, java executable
- Request Jdtls to start a debug session and send the port of the session back
- Prepare TCP connections to listen to the test results
- Start nvim-dap and let user interactions to be handled by nvim-dap
- Parse the test results as they come in
- Once the execution is done, open a window show the test results
┌────────────┐ ┌────────────┐
│ │ │ │
│ Neovim │ │ VSCode │
│ │ │ │
└─────▲──────┘ └──────▲─────┘
│ │
│ │
│ │
│ │
┌───────▼───────┐ ┌──────────────▼──────────────┐
│ │ │ │
│ nvim-java │ │ Extension Pack for Java │
│ │ │ │
└───────▲───────┘ └──────────────▲──────────────┘
│ │
│ │
│ │
│ │
│ │
│ ┌───────────┐ │
│ │ │ │
└──────────────► JDTLS ◄────────────┘
│ │
└───▲───▲───┘
│ │
│ │
│ │
│ │
│ │
┌───────────────┐ │ │ ┌────────────────────────┐
│ │ │ │ │ │
│ java-test ◄────────┘ └─────────► java-debug-adapter │
│ │ │ │
└───────────────┘ └────────────────────────┘
nvim-jdtls is a plugin that follows "Keep it simple, stupid!" approach. If you love customizing things by yourself, then give nvim-jdtls a try. I may or may not have copied some code 😉 Beauty of Open source!