Just install and start writing public static void main(String[] args).
Tip
You can find cool tips & tricks here https://github.com/nvim-java/nvim-java/wiki/Tips-&-Tricks
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
-
JavaBuildBuildWorkspace- Runs a full workspace build -
JavaBuildCleanWorkspace- Clear the workspace cache (for now you have to close and reopen to restart the language server after the deletion)
JavaRunnerRunMain- Runs the application or selected main class (if there are multiple main classes)
:JavaRunnerRunMain :JavaRunnerRunMain <arguments> <to> <pass>
JavaRunnerStopMain- Stops the running applicationJavaRunnerToggleLogs- 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 bufferJavaTestDebugCurrentClass- Debug the test class in the active bufferJavaTestRunCurrentMethod- Run the test method on the cursorJavaTestDebugCurrentMethod- Debug the test method on the cursorJavaTestRunAllTests- Run all tests in the workspaceJavaTestDebugAllTests- Debug all tests in the workspaceJavaTestViewLastReport- Open the last test report in a popup window
JavaProfile- Opens the profiles UI
JavaRefactorExtractVariable- Create a variable from value at cursor/selectionJavaRefactorExtractVariableAllOccurrence- Create a variable for all occurrences from value at cursor/selectionJavaRefactorExtractConstant- Create a constant from the value at cursor/selectionJavaRefactorExtractMethod- Create a method from the value at cursor/selectionJavaRefactorExtractField- 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()
πΈ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', }, -- Extensions lombok = { enable = true, version = '1.18.40', }, java_test = { enable = true, version = '0.40.1', }, java_debug_adapter = { enable = true, version = '0.58.2', }, spring_boot_tools = { enable = true, version = '1.55.1', }, -- JDK installation jdk = { auto_install = true, version = '17', }, -- 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, }, })
πΈ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 β
β β β β
βββββββββββββββββ ββββββββββββββββββββββββββ
-
spring-boot.nvim is the one that starts sts4 & do other necessary
jdtlssts4sync command registration innvim-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.