languages/java: add dap support via JLS

This commit is contained in:
Snoweuph 2026-06-05 00:37:08 +02:00
commit 20ff0827d1
No known key found for this signature in database
GPG key ID: BEFC41DA223CEC55
3 changed files with 111 additions and 8 deletions

View file

@ -205,7 +205,7 @@ in {
dap = {
enable =
mkEnableOption "Go Debug Adapter (DAP) via `nvim-dap-go"
mkEnableOption "Go Debug Adapter"
// {
default = config.vim.languages.enableDAP;
defaultText = literalExpression "config.vim.languages.enableDAP";

View file

@ -2,19 +2,47 @@
config,
pkgs,
lib,
inputs,
...
}: let
inherit (lib.options) literalExpression mkEnableOption mkOption;
inherit (lib.modules) mkIf mkMerge;
inherit (lib) genAttrs;
inherit (lib.types) listOf str;
inherit (lib.meta) getExe;
inherit (lib.options) literalExpression mkEnableOption mkOption;
inherit (lib.types) listOf str enum package;
inherit (lib.attrsets) attrNames genAttrs;
inherit (lib.meta) getExe getExe';
inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption enumWithRename;
cfg = config.vim.languages.java;
defaultServers = ["jdt-language-server"];
servers = ["jdt-language-server" "jls"];
defaultDebugger = "jls";
debuggers = {
jls = let
pkg = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}.jls;
in {
package = pkg;
config =
# Lua
''
dap.adapters.jls= {
type = 'executable',
command = '${getExe' pkg "jls-dap"}',
}
dap.configurations.java = {
{
type = "jls",
request = "attach",
name = "Attach",
hostName = "localhost",
port = 5005,
sourceRoots = vim.fn.glob("**/src/main/java", true, true),
},
}
'';
};
};
in {
options.vim.languages.java = {
enable = mkEnableOption "Java language support";
@ -48,6 +76,72 @@ in {
};
};
dap = {
enable =
mkEnableOption "Java Debug Adapter"
// {
default = config.vim.languages.enableDAP;
defaultText = literalExpression "config.vim.languages.enableDAP";
};
debugger = mkOption {
type = enum (attrNames debuggers);
default = defaultDebugger;
description = ''
Java debugger to use.
**JLS**
For `jls` to work, you need to run your application with debug symbols and networking.
The `jls` configuration is hardcoded to listen on port `5005`.
This matches the configuration described [upstream](https://github.com/idelice/jls#usage).
You can change this by modifying `vim.debugger.nvim-dap.sources.java-debugger`.
```nix
vim.debugger.nvim-dap.sources.java-debugger = /* lua */ '''
dap.adapters.jls= {
type = 'executable',
command = ''\'''${getExe' inputs.self.packages.''${pkgs.stdenv.hostPlatform.system}.jls "jls-dap"}',
}
dap.configurations.java = {
{
type = "jls",
request = "attach",
name = "Attach",
hostName = "localhost",
port = 6969, -- your custom port
sourceRoots = vim.fn.glob("**/src/main/java", true, true),
},
}
''';
```
*Examples:*
- Manual:
1. Build with debug symbols.
```sh
javac -g ...
```
1. Run with debug socket.
```sh
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar your.jar
```
- Springboot Maven:
For Springboot you can just pass the JVM args directly into the `spring-boot:run`.
```sh
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
```
'';
};
package = mkOption {
type = package;
default = debuggers.${cfg.dap.debugger}.package;
description = "Java debugger package.";
};
};
extensions = {
maven-nvim = {
enable = mkEnableOption "maven integration";
@ -88,6 +182,11 @@ in {
};
config = mkIf cfg.enable (mkMerge [
(mkIf cfg.treesitter.enable {
vim.treesitter.enable = true;
vim.treesitter.grammars = [cfg.treesitter.package];
})
(mkIf cfg.lsp.enable {
vim.lsp = {
presets = genAttrs cfg.lsp.servers (_: {enable = true;});
@ -97,9 +196,11 @@ in {
};
})
(mkIf cfg.treesitter.enable {
vim.treesitter.enable = true;
vim.treesitter.grammars = [cfg.treesitter.package];
(mkIf cfg.dap.enable {
vim.debugger.nvim-dap = {
enable = true;
sources.java-debugger = debuggers.${cfg.dap.debugger}.config;
};
})
(mkIf cfg.extensions.maven-nvim.enable {