*nvim-java.txt* For Neovim >= 0.11.5 Last change: 2026 February 05 ============================================================================== Table of Contents *nvim-java-table-of-contents* 1. nvim-java |nvim-java-nvim-java| - Demo |nvim-java-demo| - Features |nvim-java-features| - How to Install |nvim-java-how-to-install| - Commands |nvim-java-commands| - APIs |nvim-java-apis| - How to Use JDK X.X Version? |nvim-java-how-to-use-jdk-x.x-version?| - Configuration |nvim-java-configuration| - Architecture |nvim-java-architecture| - Projects Acknowledgement |nvim-java-projects-acknowledgement| 2. Links |nvim-java-links| ============================================================================== 1. nvim-java *nvim-java-nvim-java* ------------------------------------------------------------------------------ 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 *nvim-java-demo* FEATURES *nvim-java-features* - 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 HOW TO INSTALL *nvim-java-how-to-install* :small_orange_diamond:details ~ **Requirements:** Neovim 0.11.5+ USING VIM.PACK ~ >lua 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') < USING LAZY.NVIM ~ Install using lazy.nvim : >lua { 'nvim-java/nvim-java', config = function() require('java').setup() vim.lsp.enable('jdtls') end, } < Yep! That’s all :) COMMANDS *nvim-java-commands* :small_orange_diamond:details ~ BUILD ~ - `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) RUNNER ~ - `JavaRunnerRunMain` - Runs the application or selected main class (if there are multiple main classes) >vim :JavaRunnerRunMain :JavaRunnerRunMain < - `JavaRunnerStopMain` - Stops the running application - `JavaRunnerToggleLogs` - Toggle between show & hide runner log window DAP ~ - `JavaDapConfig` - DAP is autoconfigured on start up, but in case you want to force configure it again, you can use this API TEST ~ - `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 PROFILES ~ - `JavaProfile` - Opens the profiles UI REFACTOR ~ - `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 SETTINGS ~ - `JavaSettingsChangeRuntime` - Change the JDK version to another APIS *nvim-java-apis* :small_orange_diamond:details ~ BUILD ~ - `build.build_workspace` - Runs a full workspace build >lua 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) >lua require('java').build.clean_workspace() < RUNNER ~ - `built_in.run_app` - Runs the application or selected main class (if there are multiple main classes) >lua 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 >lua require('java').runner.built_in.stop_app() < - `built_in.toggle_logs` - Toggle between show & hide runner log window >lua require('java').runner.built_in.toggle_logs() < DAP ~ - `config_dap` - DAP is autoconfigured on start up, but in case you want to force configure it again, you can use this API >lua require('java').dap.config_dap() < TEST ~ - `run_current_class` - Run the test class in the active buffer >lua require('java').test.run_current_class() < - `debug_current_class` - Debug the test class in the active buffer >lua require('java').test.debug_current_class() < - `run_current_method` - Run the test method on the cursor >lua require('java').test.run_current_method() < - `debug_current_method` - Debug the test method on the cursor >lua require('java').test.debug_current_method() < - `run_all_tests` - Run all tests in the workspace >lua require('java').test.run_all_tests() < - `debug_all_tests` - Debug all tests in the workspace >lua require('java').test.debug_all_tests() < - `view_report` - Open the last test report in a popup window >lua require('java').test.view_last_report() < PROFILES ~ >lua require('java').profile.ui() < REFACTOR ~ - `extract_variable` - Create a variable from value at cursor/selection >lua require('java').refactor.extract_variable() < - `extract_variable_all_occurrence` - Create a variable for all occurrences from value at cursor/selection >lua require('java').refactor.extract_variable_all_occurrence() < - `extract_constant` - Create a constant from the value at cursor/selection >lua require('java').refactor.extract_constant() < - `extract_method` - Create method from the value at cursor/selection >lua require('java').refactor.extract_method() < - `extract_field` - Create a field from the value at cursor/selection >lua require('java').refactor.extract_field() < SETTINGS ~ - `change_runtime` - Change the JDK version to another >lua require('java').settings.change_runtime() < HOW TO USE JDK X.X VERSION? *nvim-java-how-to-use-jdk-x.x-version?* :small_orange_diamond:details ~ Use `vim.lsp.config()` to override the default JDTLS settings: >lua vim.lsp.config('jdtls', { settings = { java = { configuration = { runtimes = { { name = "JavaSE-21", path = "/opt/jdk-21", default = true, } } } } } }) < CONFIGURATION *nvim-java-configuration* :small_orange_diamond:details ~ For most users changing the default configuration is not necessary. But if you want, following options are available: >lua 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, }, }) < ARCHITECTURE *nvim-java-architecture* :small_orange_diamond: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 >text ┌────────────┐ ┌────────────┐ │ │ │ │ │ Neovim │ │ VSCode │ │ │ │ │ └─────▲──────┘ └──────▲─────┘ │ │ │ │ │ │ │ │ ┌───────▼───────┐ ┌──────────────▼──────────────┐ │ │ │ │ │ nvim-java │ │ Extension Pack for Java │ │ │ │ │ └───────▲───────┘ └──────────────▲──────────────┘ │ │ │ │ │ │ │ │ │ │ │ ┌───────────┐ │ │ │ │ │ └──────────────► JDTLS ◄────────────┘ │ │ └───▲───▲───┘ │ │ │ │ │ │ │ │ │ │ ┌───────────────┐ │ │ ┌────────────────────────┐ │ │ │ │ │ │ │ java-test ◄────────┘ └─────────► java-debug-adapter │ │ │ │ │ └───────────────┘ └────────────────────────┘ < PROJECTS ACKNOWLEDGEMENT *nvim-java-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. ============================================================================== 2. Links *nvim-java-links* 1. *Spring*: https://img.shields.io/badge/Spring-6DB33F?style=for-the-badge&logo=spring&logoColor=white 2. *Java*: https://img.shields.io/badge/java-%23ED8B00.svg?style=for-the-badge&logo=openjdk&logoColor=white 3. *Gradle*: https://img.shields.io/badge/Gradle-02303A.svg?style=for-the-badge&logo=Gradle&logoColor=white 4. *Apache Maven*: https://img.shields.io/badge/Apache%20Maven-C71A36?style=for-the-badge&logo=Apache%20Maven&logoColor=white 5. *Neovim*: https://img.shields.io/badge/NeoVim-%2357A143.svg?&style=for-the-badge&logo=neovim&logoColor=white 6. *Lua*: https://img.shields.io/badge/lua-%232C2D72.svg?style=for-the-badge&logo=lua&logoColor=white 7. *Linux*: https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black 8. *Windows*: https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows11&logoColor=white 9. *macOS*: https://img.shields.io/badge/macOS-000000?style=for-the-badge&logo=apple&logoColor=white Generated by panvimdoc vim:tw=78:ts=8:noet:ft=help:norl: