local home = vim.env.HOME 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 config = { cmd = { "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", "-Xmx4g", "--add-modules=ALL-SYSTEM", "--add-opens", "java.base/java.util=ALL-UNNAMED", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "-jar", home .. "/.local/share/nvim/mason/share/jdtls/plugins/org.eclipse.equinox.launcher.jar", "-configuration", home .. "/.local/share/nvim/mason/packages/jdtls/config_linux", "-data", workspace_dir, }, root_dir = require("jdtls.setup").find_root({ ".git", "mvnw", "pom.xml", "build.gradle" }), settings = { java = { home = "/usr/lib/jvm/java-21-openjdk", eclipse = { downloadSources = true, }, configuration = { updateBuildConfiguration = "interactive", runtimes = { { name = "JavaSE-17", path = "/usr/lib/jvm/java-17-openjdk", }, { name = "JavaSE-21", path = "/usr/lib/jvm/java-21-openjdk", }, }, }, maven = { downloadSources = true, }, implementationsCodeLens = { enabled = true, }, referencesCodeLens = { enabled = true, }, references = { includeDecompiledSources = true, }, signatureHelp = { enabled = true }, format = { enabled = true, settings = { url = "https://github.com/google/styleguide/blob/gh-pages/intellij-java-google-style.xml", profile = "GoogleStyle", }, }, 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", "com", "org", }, }, sources = { organizeImports = { starThreshold = 9999, staticStarThreshold = 9999, }, }, codeGeneration = { toString = { template = "${object.className}{${member.name()}=${member.value}, ${otherMembers}}", }, useBlocks = true, }, }, }, capabilities = require("cmp_nvim_lsp").default_capabilities(), flags = { allow_incremental_sync = true, }, init_options = { extendedClientCapabilities = jdtls.extendedClientCapabilities, }, } jdtls.start_or_attach(config)