-- JDTLS (Java LSP) configuration local home = vim.env.HOME -- Get the home directory local jdtls = require 'jdtls' local project_name = vim.fn.fnamemodify(vim.fn.getcwd(), ':p:h:t') local workspace_dir = home .. '/jdtls-workspace/' .. project_name local system_os = '' -- Determine OS if vim.fn.has 'mac' == 1 then system_os = 'mac' elseif vim.fn.has 'unix' == 1 then system_os = 'linux' elseif vim.fn.has 'win32' == 1 or vim.fn.has 'win64' == 1 then system_os = 'win' else print "OS not found, defaulting to 'linux'" system_os = 'linux' end -- Needed for debugging local bundles = { vim.fn.glob(home .. '/.local/share/nvim/mason/share/java-debug-adapter/com.microsoft.java.debug.plugin.jar'), } -- Needed for running/debugging unit tests vim.list_extend(bundles, vim.split(vim.fn.glob(home .. '/.local/share/nvim/mason/share/java-test/*.jar', 1), '\n')) -- See `:help vim.lsp.start_client` for an overview of the supported `config` options. local config = { -- The command that starts the language server -- See: https://github.com/eclipse/eclipse.jdt.ls#running-from-the-command-line cmd = { '/home/lucas/.sdkman/candidates/java/21.0.2-open/bin/java', '-Declipse.application=org.eclipse.jdt.ls.core.id1', '-Dosgi.bundles.defaultStartLevel=4', '-Declipse.product=org.eclipse.jdt.ls.core.product', '-Dlog.protocol=true', '-Dlog.level=ALL', '-javaagent:' .. home .. '/.local/share/nvim/mason/share/jdtls/lombok.jar', '-Xms4g', '-Xmx8g', '--add-modules=ALL-SYSTEM', '--add-opens', 'java.base/java.util=ALL-UNNAMED', '--add-opens', 'java.base/java.lang=ALL-UNNAMED', -- Eclipse jdtls location '-jar', home .. '/.local/share/nvim/mason/share/jdtls/plugins/org.eclipse.equinox.launcher.jar', '-configuration', home .. '/.local/share/nvim/mason/packages/jdtls/config_' .. system_os, '-data', workspace_dir, }, -- This is the default if not provided, you can remove it. Or adjust as needed. -- One dedicated LSP server & client will be started per unique root_dir root_dir = vim.fs.root(0, { '.git', 'mvnw', 'gradlew' }), -- Here you can configure eclipse.jdt.ls specific settings -- See https://github.com/eclipse/eclipse.jdt.ls/wiki/Running-the-JAVA-LS-server-from-the-command-line#initialize-request settings = { java = { home = '/home/lucas/.sdkman/candidates/java/21.0.2-open', eclipse = { downloadSources = true, }, configuration = { updateBuildConfiguration = 'interactive', -- TODO Update this by adding any runtimes that you need to support your Java projects and removing any that you don't have installed -- The runtime name parameters need to match specific Java execution environments. See https://github.com/tamago324/nlsp-settings.nvim/blob/2a52e793d4f293c0e1d61ee5794e3ff62bfbbb5d/schemas/_generated/jdtls.json#L317-L334 runtimes = { { name = 'JavaSE-11', path = '/home/lucas/.sdkman/candidates/java/11.0.22-ms', }, { name = 'JavaSE-21', path = '/home/lucas/.sdkman/candidates/java/21.0.2-open', }, }, }, maven = { downloadSources = true, }, implementationsCodeLens = { enabled = true, }, referencesCodeLens = { enabled = true, }, references = { includeDecompiledSources = true, }, signatureHelp = { enabled = true }, format = { enabled = true, -- Formatting works by default, but you can refer to a specific file/URL if you choose settings = { url = '/home/lucas/magna-sistemas-java-code-formatter.xml', }, }, completion = { favoriteStaticMembers = { 'org.hamcrest.MatcherAssert.assertThat', 'org.hamcrest.Matchers.*', 'org.hamcrest.CoreMatchers.*', 'org.junit.jupiter.api.Assertions.*', 'java.util.Objects.requireNonNull', 'java.util.Objects.requireNonNullElse', 'org.mockito.Mockito.*', }, importOrder = { 'java', 'javax', 'jakarta', 'lombok', 'springfox', 'org', 'com', 'io', 'br', }, }, sources = { organizeImports = { starThreshold = 9999, staticStarThreshold = 9999, }, }, codeGeneration = { toString = { template = '${object.className}{${member.name()}=${member.value}, ${otherMembers}}', }, useBlocks = true, }, }, }, -- Needed for auto-completion with method signatures and placeholders capabilities = require('blink.cmp').get_lsp_capabilities(), flags = { allow_incremental_sync = true, }, init_options = { -- References the bundles defined above to support Debugging and Unit Testing bundles = bundles, extendedClientCapabilities = jdtls.extendedClientCapabilities, }, } -- Needed for debugging config['on_attach'] = function(client, bufnr) jdtls.setup_dap { hotcodereplace = 'auto' } require('jdtls.dap').setup_dap_main_class_configs() end -- This starts a new client & server, or attaches to an existing client & server based on the `root_dir`. jdtls.start_or_attach(config)