Setting java.jdt.ls.javac.enabled=true has no effect when running the standalone language server (used by nvim-jdtls, mason, Helix, eglot, …). The server silently keeps using ECJ — no error is logged.
Root cause
AbstractImageBuilder picks the compiler via System.getProperty("AbstractImageBuilder.compilerFactory"), else falls back to DefaultCompilerFactory (ECJ). The setting only sets a boolean in Preferences. Nothing in the standalone launch path turns it into that system property. In a p2 product install, the org.eclipse.jdt.core.javac fragment's META-INF/p2.inf injects the needed JVM args
(-DAbstractImageBuilder.compilerFactory=…JavacCompilerFactory + 19× --add-opens) via addJvmArg touchpoints. But those never run for the standalone server jar.
Reproduction
Standalone server, Java 25, java.jdt.ls.javac.enabled=true → ECJ is still used. Manually adding the p2.inf JVM args activates javac.
Request
The jdtls launcher should inject the same JVM args the p2 touchpoint does when javac is requested, giving standalone consumers parity with vscode-java, or at least document the required args.
Environment
- eclipse.jdt.ls 1.58.0
- jdt.core.javac 1.0.0.z20260414
- JDK 25.0.2
Setting
java.jdt.ls.javac.enabled=truehas no effect when running the standalone language server (used by nvim-jdtls, mason, Helix, eglot, …). The server silently keeps using ECJ — no error is logged.Root cause
AbstractImageBuilderpicks the compiler viaSystem.getProperty("AbstractImageBuilder.compilerFactory"), else falls back toDefaultCompilerFactory(ECJ). The setting only sets a boolean inPreferences. Nothing in the standalone launch path turns it into that system property. In a p2 product install, theorg.eclipse.jdt.core.javacfragment'sMETA-INF/p2.infinjects the needed JVM args(
-DAbstractImageBuilder.compilerFactory=…JavacCompilerFactory+ 19×--add-opens) viaaddJvmArgtouchpoints. But those never run for the standalone server jar.Reproduction
Standalone server, Java 25,
java.jdt.ls.javac.enabled=true→ ECJ is still used. Manually adding thep2.infJVM args activates javac.Request
The
jdtlslauncher should inject the same JVM args the p2 touchpoint does when javac is requested, giving standalone consumers parity with vscode-java, or at least document the required args.Environment