From 627f99b3dc21b3c0b672cc2d76fdf919a074c941 Mon Sep 17 00:00:00 2001 From: s1n7ax Date: Wed, 3 Dec 2025 18:21:58 +0530 Subject: [PATCH 1/7] fix: use absolute java path as rpc.start PATH workaround --- lua/java-core/ls/servers/jdtls/cmd.lua | 28 ++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/lua/java-core/ls/servers/jdtls/cmd.lua b/lua/java-core/ls/servers/jdtls/cmd.lua index 39d1e6b..8ac1691 100644 --- a/lua/java-core/ls/servers/jdtls/cmd.lua +++ b/lua/java-core/ls/servers/jdtls/cmd.lua @@ -20,7 +20,14 @@ function M.get_cmd(opts) return function(dispatchers, config) local cmd = M.get_jvm_args(opts):concat(M.get_jar_args()) - M.validate_java_version(config.cmd_env) + -- NOTE: eventhough we are setting the PATH env var, due to a bug, it's not + -- working on Windows. So just lanching 'java' will result in executing the + -- system java. So as a workaround, we use the absolute path to java instead + -- So following check is not needed when we have auto_install set to true + -- @see https://github.com/neovim/neovim/issues/36818 + if not conf.jdk.auto_install then + M.validate_java_version(config.cmd_env) + end log.debug('Starting jdtls with cmd', cmd) @@ -40,8 +47,25 @@ end function M.get_jvm_args(opts) local jdtls_config = path.join(jdtls_root, system.get_config_suffix()) + local java_exe = 'java' + + -- NOTE: eventhough we are setting the PATH env var, due to a bug, it's not + -- working on Windows. So we are using the absolute path to java instead + -- @see https://github.com/neovim/neovim/issues/36818 + if conf.jdk.auto_install then + local jdk_root = Manager:get_install_dir('openjdk', conf.jdk.version) + local java_home + if system.get_os() == 'mac' then + java_home = vim.fn.glob(path.join(jdk_root, 'jdk-*', 'Contents', 'Home')) + else + java_home = vim.fn.glob(path.join(jdk_root, 'jdk-*')) + end + + java_exe = path.join(java_home, 'bin', 'java') + end + local jvm_args = List:new({ - 'java', + java_exe, '-Declipse.application=org.eclipse.jdt.ls.core.id1', '-Dosgi.bundles.defaultStartLevel=4', '-Declipse.product=org.eclipse.jdt.ls.core.product', From ed2b3ba9a4437b6deb9958ee53bf06df9fcca14f Mon Sep 17 00:00:00 2001 From: s1n7ax Date: Wed, 3 Dec 2025 18:22:39 +0530 Subject: [PATCH 2/7] chore(devcontainer): update nvim-dap dependency --- .devcontainer/config/nvim/lazy-lock.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.devcontainer/config/nvim/lazy-lock.json b/.devcontainer/config/nvim/lazy-lock.json index 73cbd4c..3737ab9 100644 --- a/.devcontainer/config/nvim/lazy-lock.json +++ b/.devcontainer/config/nvim/lazy-lock.json @@ -1,7 +1,6 @@ { "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, - "nvim-dap": { "branch": "master", "commit": "b38f7d30366d9169d0a623c4c85fbcf99d8d58bb" }, - "nvim-jdtls": { "branch": "master", "commit": "943e2398aba6b7e976603708450c6c93c600e830" }, + "nvim-dap": { "branch": "master", "commit": "5860c7c501eb428d3137ee22c522828d20cca0b3" }, "spring-boot.nvim": { "branch": "main", "commit": "218c0c26c14d99feca778e4d13f5ec3e8b1b60f0" } } From 7a7ba515ee0414c2c8c198fd4fc7ff63230f7e3e Mon Sep 17 00:00:00 2001 From: s1n7ax Date: Wed, 3 Dec 2025 21:04:09 +0530 Subject: [PATCH 3/7] fix: windows compatibility fixes --- lua/pkgm/downloaders/powershell.lua | 5 ++++- lua/pkgm/extractors/tar.lua | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lua/pkgm/downloaders/powershell.lua b/lua/pkgm/downloaders/powershell.lua index e2236d7..f0a5434 100644 --- a/lua/pkgm/downloaders/powershell.lua +++ b/lua/pkgm/downloaders/powershell.lua @@ -1,6 +1,7 @@ local class = require('java-core.utils.class') local log = require('java-core.utils.log2') local err_util = require('java-core.utils.errors') +local path = require('java-core.utils.path') ---@class java-core.PowerShell ---@field url string @@ -21,7 +22,9 @@ function PowerShell:_init(opts) if not opts.dest then local filename = vim.fs.basename(opts.url) - self.dest = vim.fn.tempname() .. '-' .. filename + local tmp_dir = vim.fn.tempname() + vim.fn.mkdir(tmp_dir, 'p') + self.dest = path.join(tmp_dir, filename) log.debug('Using temp destination:', self.dest) else self.dest = opts.dest diff --git a/lua/pkgm/extractors/tar.lua b/lua/pkgm/extractors/tar.lua index 58c873b..69a5808 100644 --- a/lua/pkgm/extractors/tar.lua +++ b/lua/pkgm/extractors/tar.lua @@ -30,7 +30,7 @@ function Tar:extract() -- Windows: convert backslashes to forward slashes (tar accepts them) local source = self.source:gsub('\\', '/') local dest = self.dest:gsub('\\', '/') - cmd = string.format('%s --no-same-owner --force-local -xf "%s" -C "%s"', tar_cmd, source, dest) + cmd = string.format('%s --no-same-owner -xf "%s" -C "%s"', tar_cmd, source, dest) else -- Unix: use shellescape cmd = string.format( From 53e0c10c25cf51d55412e34ed7a4d2cac6fd9533 Mon Sep 17 00:00:00 2001 From: s1n7ax Date: Wed, 3 Dec 2025 21:41:23 +0530 Subject: [PATCH 4/7] chore(test): add debug log read on windows --- tests/specs/lsp_spec.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/specs/lsp_spec.lua b/tests/specs/lsp_spec.lua index 8ef81b7..459de77 100644 --- a/tests/specs/lsp_spec.lua +++ b/tests/specs/lsp_spec.lua @@ -1,5 +1,6 @@ local lsp_utils = dofile('tests/utils/lsp-utils.lua') local assert = require('luassert') +local system = require('java-core.utils.system') describe('LSP Attach', function() it('should attach when opening a Java buffer', function() @@ -8,6 +9,9 @@ describe('LSP Attach', function() local jdtls = lsp_utils.wait_for_lsp_attach('jdtls', 30000) local spring = lsp_utils.wait_for_lsp_attach('spring-boot', 30000) + if system.get_os() == 'win' then + vim.fn.readfile('C:/Users/runneradmin/AppData/Local/nvim-data/lsp.log') + end assert.is_not_nil(jdtls, 'JDTLS should attach to Java buffer') assert.is_not_nil(spring, 'Spring Boot should attach to Java buffer') end) From 46aba771d5c456865eacbea11d8182511f0a8861 Mon Sep 17 00:00:00 2001 From: s1n7ax Date: Wed, 3 Dec 2025 21:59:15 +0530 Subject: [PATCH 5/7] fix: add --force-local flag for windows tar extraction --- lua/pkgm/extractors/tar.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/pkgm/extractors/tar.lua b/lua/pkgm/extractors/tar.lua index 69a5808..58c873b 100644 --- a/lua/pkgm/extractors/tar.lua +++ b/lua/pkgm/extractors/tar.lua @@ -30,7 +30,7 @@ function Tar:extract() -- Windows: convert backslashes to forward slashes (tar accepts them) local source = self.source:gsub('\\', '/') local dest = self.dest:gsub('\\', '/') - cmd = string.format('%s --no-same-owner -xf "%s" -C "%s"', tar_cmd, source, dest) + cmd = string.format('%s --no-same-owner --force-local -xf "%s" -C "%s"', tar_cmd, source, dest) else -- Unix: use shellescape cmd = string.format( From 4c23644a6e4b01bbde5e3d30cbbb8a5a630a7fb3 Mon Sep 17 00:00:00 2001 From: s1n7ax Date: Wed, 3 Dec 2025 22:15:09 +0530 Subject: [PATCH 6/7] fix: check tar --force-local support before using --- lua/pkgm/extractors/tar.lua | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lua/pkgm/extractors/tar.lua b/lua/pkgm/extractors/tar.lua index 58c873b..2bcb415 100644 --- a/lua/pkgm/extractors/tar.lua +++ b/lua/pkgm/extractors/tar.lua @@ -17,6 +17,18 @@ function Tar:_init(opts) self.dest = opts.dest end +---@private +---Check if tar supports --force-local +---@param tar_cmd string +---@return boolean +function Tar:tar_supports_force_local(tar_cmd) + local ok, out = pcall(vim.fn.system, { tar_cmd, '--help' }) + if not ok then + return false + end + return out:match('%-%-force%-local') ~= nil +end + ---Extract tar file using tar ---@return boolean|nil # true on success, nil on failure ---@return string|nil # Error message if failed @@ -30,7 +42,13 @@ function Tar:extract() -- Windows: convert backslashes to forward slashes (tar accepts them) local source = self.source:gsub('\\', '/') local dest = self.dest:gsub('\\', '/') - cmd = string.format('%s --no-same-owner --force-local -xf "%s" -C "%s"', tar_cmd, source, dest) + cmd = string.format( + '%s --no-same-owner %s -xf "%s" -C "%s"', + self:tar_supports_force_local(tar_cmd) and '--force-local' or '', + tar_cmd, + source, + dest + ) else -- Unix: use shellescape cmd = string.format( From 493d2b6f35789150da9d00e6cbd4cfc066ead865 Mon Sep 17 00:00:00 2001 From: s1n7ax Date: Wed, 3 Dec 2025 22:19:49 +0530 Subject: [PATCH 7/7] fix: correct tar command argument order --- lua/pkgm/extractors/tar.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/pkgm/extractors/tar.lua b/lua/pkgm/extractors/tar.lua index 2bcb415..3d88036 100644 --- a/lua/pkgm/extractors/tar.lua +++ b/lua/pkgm/extractors/tar.lua @@ -44,8 +44,8 @@ function Tar:extract() local dest = self.dest:gsub('\\', '/') cmd = string.format( '%s --no-same-owner %s -xf "%s" -C "%s"', - self:tar_supports_force_local(tar_cmd) and '--force-local' or '', tar_cmd, + self:tar_supports_force_local(tar_cmd) and '--force-local' or '', source, dest )