Just install and start writing public static void main(String[] args).
Demo.mp4
- ✅ Spring Boot Tools
- ✅ Diagnostics & Auto Completion
- ✅ Automatic Debug Configuration
- ✅ Organize Imports & Code Formatting
- ✅ Running Tests
- ✅ Run & Debug Profiles
- ✅ Built-in Application Runner with Log Viewer
- ✅ Profile Management UI
- ✅ Decompiler Support
- ✅ Code Actions
🔸details
Requirements: Neovim 0.11.5+
vim.pack.add({
{
src = 'https://github.com/JavaHello/spring-boot.nvim',
version = '218c0c26c14d99feca778e4d13f5ec3e8b1b60f0',
},
'https://github.com/MunifTanjim/nui.nvim',
'https://github.com/mfussenegger/nvim-dap',
'https://github.com/nvim-java/nvim-java',
})
require('java').setup()
vim.lsp.enable('jdtls')
Install using lazy.nvim:
{
'nvim-java/nvim-java',
config = function()
require('java').setup()
vim.lsp.enable('jdtls')
end,
}
Yep! That's all :)
🔸details
- JavaRunnerRunMain - Runs the application or selected main class (if there
are multiple main classes)
:JavaRunnerRunMain
:JavaRunnerRunMain <arguments> <to> <pass>
- JavaRunnerStopMain - Stops the running application
- JavaRunnerToggleLogs - Toggle between show & hide runner log window
- JavaDapConfig - DAP is autoconfigured on start up, but in case you want to
force configure it again, you can use this API
- JavaTestRunCurrentClass - Run the test class in the active buffer
- JavaTestDebugCurrentClass - Debug the test class in the active buffer
- JavaTestRunCurrentMethod - Run the test method on the cursor
- JavaTestDebugCurrentMethod - Debug the test method on the cursor
- JavaTestRunAllTests - Run all tests in the workspace
- JavaTestDebugAllTests - Debug all tests in the workspace
- JavaTestViewLastReport - Open the last test report in a popup window
- JavaProfile - Opens the profiles UI
- JavaRefactorExtractVariable - Create a variable from value at cursor/selection
- JavaRefactorExtractVariableAllOccurrence - Create a variable for all
occurrences from value at cursor/selection
- JavaRefactorExtractConstant - Create a constant from the value at cursor/selection
- JavaRefactorExtractMethod - Create a method from the value at cursor/selection
- JavaRefactorExtractField - Create a field from the value at cursor/selection
- JavaSettingsChangeRuntime - Change the JDK version to another
🔸details
- build.build_workspace - Runs a full workspace build
require('java').build.build_workspace()
- build.clean_workspace - Clear the workspace cache
(for now you have to close and reopen to restart the language server after
the deletion)
require('java').build.clean_workspace()
- built_in.run_app - Runs the application or selected main class (if there
are multiple main classes)
require('java').runner.built_in.run_app({})
require('java').runner.built_in.run_app({'arguments', 'to', 'pass', 'to', 'main'})
- built_in.stop_app - Stops the running application
require('java').runner.built_in.stop_app()
- built_in.toggle_logs - Toggle between show & hide runner log window
require('java').runner.built_in.toggle_logs()
- 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()
- 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()
- run_all_tests - Run all tests in the workspace
require('java').test.run_all_tests()
- debug_all_tests - Debug all tests in the workspace
require('java').test.debug_all_tests()
- view_report - Open the last test report in a popup window
require('java').test.view_last_report()
require('java').profile.ui()
- extract_variable - Create a variable from value at cursor/selection
require('java').refactor.extract_variable()
- extract_variable_all_occurrence - Create a variable for all occurrences from
value at cursor/selection
require('java').refactor.extract_variable_all_occurrence()
- extract_constant - Create a constant from the value at cursor/selection
require('java').refactor.extract_constant()
- extract_method - Create method from the value at cursor/selection
require('java').refactor.extract_method()
- extract_field - Create a field from the value at cursor/selection
require('java').refactor.extract_field()
- change_runtime - Change the JDK version to another
require('java').settings.change_runtime()
🗜️ How to Use JDK X.X Version?
🔸details
Use vim.lsp.config() to override the default JDTLS settings:
vim.lsp.config('jdtls', {
settings = {
java = {
configuration = {
runtimes = {
{
name = "JavaSE-21",
path = "/opt/jdk-21",
default = true,
}
}
}
}
}
})
🔸details
For most users changing the default configuration is not necessary. But if you
want, following options are available:
require('java').setup({
-- Startup checks
checks = {
nvim_version = true, -- Check Neovim version
nvim_jdtls_conflict = true, -- Check for nvim-jdtls conflict
},
-- JDTLS configuration
jdtls = {
version = '1.43.0',
path = nil,
auto_install = true,
},
-- Extensions
lombok = {
enable = true,
version = '1.18.40',
path = nil,
auto_install = true,
},
java_test = {
enable = true,
version = '0.40.1',
path = nil,
auto_install = true,
},
java_debug_adapter = {
enable = true,
version = '0.58.2',
path = nil,
auto_install = true,
},
spring_boot_tools = {
enable = true,
version = '1.55.1',
path = nil,
auto_install = true,
},
-- JDK installation
jdk = {
auto_install = true,
version = '17',
path = nil,
},
-- Logging
log = {
use_console = true,
use_file = true,
level = 'info',
log_file = vim.fn.stdpath('state') .. '/nvim-java.log',
max_lines = 1000,
show_location = false,
},
})
Set path when a tool is managed externally. When path is set, nvim-java
uses that path and does not install the tool. Set
auto_install = false on a tool to fail instead of downloading when no path is
configured. Note: path has no effect when the tool is disabled
(enable = false) — the tool is simply not loaded.
Path meanings:
- jdtls.path: directory containing plugins/ and platform config_*
directories
- lombok.path: path to lombok.jar
- java_test.path, java_debug_adapter.path, spring_boot_tools.path: VS Code
extension root containing package.json
- jdk.path: JDK home containing bin/java
🔸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 │
│ │ │ │
└───────────────┘ └────────────────────────┘
📑 Projects Acknowledgement
-
spring-boot.nvim is the one
that starts sts4 & do other necessary jdtls sts4 sync command registration
in nvim-java.
-
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.