Just install and start writing public static void main(String[] args)
.
[!CAUTION] You cannot use
nvim-java
alongsidenvim-jdtls
. So removenvim-jdtls
before installing this
[!TIP] You can find cool tips & tricks here https://github.com/nvim-java/nvim-java/wiki/Tips-&-Tricks
[!NOTE] If you are facing errors while using, please check troubleshoot wiki https://github.com/nvim-java/nvim-java/wiki/Troubleshooting
https://github.com/nvim-java/nvim-java/assets/18459807/047c8c46-9a0a-4869-b342-d5c2e15647bc
jdtls
jdtls
pluginsspring-boot-tools
lombok
java-test
java-debug-adapter
Following are forks of original repositories pre-configured for java. If you don't know how to get started, use one of the following to get started. You can click on n commits ahead of link to see the changes made on top of the original project
Using lazy.nvim
return {'nvim-java/nvim-java'}
lspconfig
require('java').setup()
require('lspconfig').jdtls.setup({})
Yep! That's all :)
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 windowJavaDapConfig
- 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 windowJavaProfile
- Opens the profiles UIJavaRefactorExtractVariable
- 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/selectionJavaSettingsChangeRuntime
- Change the JDK version to anotherbuild.build_workspace
- Runs a full workspace buildrequire('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 applicationrequire('java').runner.built_in.stop_app()
built_in.toggle_logs
- Toggle between show & hide runner log windowrequire('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 APIrequire('java').dap.config_dap()
run_current_class
- Run the test class in the active bufferrequire('java').test.run_current_class()
debug_current_class
- Debug the test class in the active bufferrequire('java').test.debug_current_class()
run_current_method
- Run the test method on the cursorrequire('java').test.run_current_method()
debug_current_method
- Debug the test method on the cursorrequire('java').test.debug_current_method()
view_report
- Open the last test report in a popup windowrequire('java').test.view_last_report()
require('java').profile.ui()
extract_variable
- Create a variable from value at cursor/selectionrequire('java').refactor.extract_variable()
extract_variable_all_occurrence
- Create a variable for all occurrences from
value at cursor/selectionrequire('java').refactor.extract_variable_all_occurrence()
extract_constant
- Create a constant from the value at cursor/selectionrequire('java').refactor.extract_constant()
extract_method
- Create method from the value at cursor/selectionrequire('java').refactor.extract_method()
extract_field
- Create a field from the value at cursor/selectionrequire('java').refactor.extract_field()
change_runtime
- Change the JDK version to anotherrequire('java').settings.change_runtime()
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
}
]
}
}
}
Pass the settings to Jdtls setup.
require('lspconfig').jdtls.setup({
settings = {
java = {
configuration = {
runtimes = {
{
name = "JavaSE-21",
path = "/opt/jdk-21",
default = true,
}
}
}
}
}
})
For most users changing the default configuration is not necessary. But if you want, following options are available
{
-- list of file that exists in root of the project
root_markers = {
'settings.gradle',
'settings.gradle.kts',
'pom.xml',
'build.gradle',
'mvnw',
'gradlew',
'build.gradle',
'build.gradle.kts',
'.git',
},
jdtls = {
version = 'v1.43.0',
},
lombok = {
version = 'nightly',
},
-- load java test plugins
java_test = {
enable = true,
version = '0.40.1',
},
-- load java debugger plugins
java_debug_adapter = {
enable = true,
version = '0.58.1',
},
spring_boot_tools = {
enable = true,
version = '1.55.1',
},
jdk = {
-- install jdk using mason.nvim
auto_install = true,
version = '17.0.2',
},
notifications = {
-- enable 'Configuring DAP' & 'DAP configured' messages on start up
dap = true,
},
-- We do multiple verifications to make sure things are in place to run this
-- plugin
verification = {
-- nvim-java checks for the order of execution of following
-- * require('java').setup()
-- * require('lspconfig').jdtls.setup()
-- IF they are not executed in the correct order, you will see a error
-- notification.
-- Set following to false to disable the notification if you know what you
-- are doing
invalid_order = true,
-- nvim-java checks if the require('java').setup() is called multiple
-- times.
-- IF there are multiple setup calls are executed, an error will be shown
-- Set following property value to false to disable the notification if
-- you know what you are doing
duplicate_setup_calls = true,
-- nvim-java checks if nvim-java/mason-registry is added correctly to
-- mason.nvim plugin.
-- IF it's not registered correctly, an error will be thrown and nvim-java
-- will stop setup
invalid_mason_registry = false,
},
mason = {
-- These mason registries will be prepended to the existing mason
-- configuration
registries = {
'github:nvim-java/mason-registry',
},
},
}
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,
┌────────────┐ ┌────────────┐
│ │ │ │
│ 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 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.
[!WARNING] You cannot use
nvim-java
alongsidenvim-jdtls
. So removenvim-jdtls
before installing this