Skip to content
This repository was archived by the owner on Jul 2, 2026. It is now read-only.

Commit 038ddb4

Browse files
committed
fix(jvm-hooks): suppress sun.misc.Unsafe warnings on JDK 23+
ktfmt, detekt, and ktlint each spew 6-10 lines of "WARNING: A terminally deprecated method in sun.misc.Unsafe has been called" on every invocation when running under JDK 23+, cluttering prek output without being actionable. Add a `jvm_quiet_flags` helper in lib/jvm.sh that detects the JDK major version and emits `--sun-misc-unsafe-memory-access=allow` only on JDK 23+; older JDKs (which would abort with "Unrecognized option") get an empty flag set.
1 parent 797c59a commit 038ddb4

4 files changed

Lines changed: 39 additions & 3 deletions

File tree

hooks/detekt/run.sh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ for arg in "$@"; do
3737
esac
3838
done
3939

40-
cmd=("${java_bin}" -jar "${jar_path}")
40+
# `jvm_quiet_flags` adds `--sun-misc-unsafe-memory-access=allow` on JDK 23+ to
41+
# silence the noisy "terminally deprecated sun.misc.Unsafe" runtime warnings
42+
# emitted by detekt's bundled kotlinc dependencies on every invocation.
43+
declare -a jvm_flags=()
44+
mapfile -t jvm_flags < <(jvm_quiet_flags "${java_bin}")
45+
cmd=("${java_bin}" "${jvm_flags[@]}" -jar "${jar_path}")
4146
if [ "${#flags[@]}" -gt 0 ]; then
4247
cmd+=("${flags[@]}")
4348
fi

hooks/ktfmt/run.sh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ done
3838

3939
# ktfmt edits files in place when given paths. The default args from
4040
# .pre-commit-hooks.yaml are `--kotlinlang-style`. Pre-commit appends file paths.
41-
"${java_bin}" -jar "${jar_path}" "$@"
41+
# `jvm_quiet_flags` adds `--sun-misc-unsafe-memory-access=allow` on JDK 23+ to
42+
# silence the noisy "terminally deprecated sun.misc.Unsafe" runtime warnings
43+
# that ktfmt's bundled kotlinc dependencies trigger.
44+
declare -a jvm_flags=()
45+
mapfile -t jvm_flags < <(jvm_quiet_flags "${java_bin}")
46+
"${java_bin}" "${jvm_flags[@]}" -jar "${jar_path}" "$@"
4247
status=$?
4348

4449
modified=0

hooks/ktlint/run.sh

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,15 @@ done
3939
# ktlint can auto-fix via --format flag. When invoked with filenames,
4040
# it lints them. Combine JAVA_HOME and direct invocation.
4141
# The executable is a shell script wrapper around a jar, so we need java.
42-
JAVA_HOME="${JAVA_HOME:-}" "${exe_path}" "$@"
42+
# `jvm_quiet_flags` adds `--sun-misc-unsafe-memory-access=allow` on JDK 23+ via
43+
# JAVA_OPTS, silencing the noisy "terminally deprecated sun.misc.Unsafe"
44+
# runtime warnings that ktlint's bundled kotlinc dependencies trigger.
45+
declare -a quiet_flags=()
46+
java_for_probe="${JAVA_HOME:+${JAVA_HOME}/bin/java}"
47+
java_for_probe="${java_for_probe:-java}"
48+
mapfile -t quiet_flags < <(jvm_quiet_flags "${java_for_probe}")
49+
extra_java_opts="${quiet_flags[*]}"
50+
JAVA_HOME="${JAVA_HOME:-}" JAVA_OPTS="${JAVA_OPTS:-} ${extra_java_opts}" "${exe_path}" "$@"
4351
status=$?
4452

4553
modified=0

lib/jvm.sh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,21 @@ locate_java() {
7676
printf ' set JAVA_HOME, install JDK 17+ via SDKMAN/Homebrew/apt, or run `sdk install java 17-tem`.\n' >&2
7777
exit 0
7878
}
79+
80+
# jvm_quiet_flags: print extra `java` CLI flags that silence noisy "WARNING: A
81+
# terminally deprecated method in sun.misc.Unsafe has been called" output from
82+
# JDK 23+ runtimes. The flag itself (`--sun-misc-unsafe-memory-access=allow`)
83+
# only exists on JDK 23+; calling older JDKs with it aborts with
84+
# "Unrecognized option". So we gate on the detected major version.
85+
#
86+
# Usage:
87+
# read -ra quiet_flags < <(jvm_quiet_flags "${java_bin}")
88+
# "${java_bin}" "${quiet_flags[@]}" -jar "${jar_path}" "$@"
89+
jvm_quiet_flags() {
90+
local java_bin="${1:-java}"
91+
local major
92+
major="$(_java_major_version "${java_bin}")"
93+
if [[ "${major}" =~ ^[0-9]+$ ]] && ((major >= 23)); then
94+
printf '%s\n' '--sun-misc-unsafe-memory-access=allow'
95+
fi
96+
}

0 commit comments

Comments
 (0)