From 6c602f06910a2f6e3a7bb869329219b5f9090f6c Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 3 Jul 2026 11:33:13 +0200 Subject: [PATCH 1/4] Strip pre-java-9 version check in `Metrics` as Velocity targets 21+ --- .../com/velocitypowered/proxy/Metrics.java | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java b/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java index 7feeb25fdd..c0ef647025 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java @@ -126,27 +126,16 @@ static void startMetrics(VelocityServer server, VelocityConfiguration.Metrics me entry.put(javaVersion, 1); // http://openjdk.java.net/jeps/223 - // Java decided to change their versioning scheme and in doing so modified the - // java.version system property to return $major[.$minor][.$security][-ea], as opposed to - // 1.$major.0_$identifier we can handle pre-9 by checking if the "major" is equal to "1", - // otherwise, 9+ + // The java.version system property returns $major[.$minor][.$security][-ea]. String majorVersion = javaVersion.split("\\.")[0]; - String release; - - int indexOf = javaVersion.lastIndexOf('.'); - - if (majorVersion.equals("1")) { - release = "Java " + javaVersion.substring(0, indexOf); - } else { - // of course, it really wouldn't be all that simple if they didn't add a quirk, now - // would it valid strings for the major may potentially include values such as -ea to - // denote a pre release - Matcher versionMatcher = Pattern.compile("\\d+").matcher(majorVersion); - if (versionMatcher.find()) { - majorVersion = versionMatcher.group(0); - } - release = "Java " + majorVersion; + + // valid strings for the major may potentially include values such as -ea to denote a + // pre-release + Matcher versionMatcher = Pattern.compile("\\d+").matcher(majorVersion); + if (versionMatcher.find()) { + majorVersion = versionMatcher.group(0); } + String release = "Java " + majorVersion; map.put(release, entry); return map; From e42b860afdc473b72a361660746868eb4ebfd044 Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 3 Jul 2026 11:51:00 +0200 Subject: [PATCH 2/4] Simplify Java version check by using `Runtime.version()` (entry still needs the system property to produce the same bStats metrics) --- .../com/velocitypowered/proxy/Metrics.java | 26 ++++--------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java b/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java index c0ef647025..cdb4f2b720 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java @@ -23,8 +23,6 @@ import java.nio.file.Path; import java.util.HashMap; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.bstats.MetricsBase; @@ -120,25 +118,11 @@ static void startMetrics(VelocityServer server, VelocityConfiguration.Metrics me () -> server.getVersion().getVersion())); metrics.addCustomChart(new DrilldownPie("java_version", () -> { - Map> map = new HashMap<>(); - String javaVersion = System.getProperty("java.version"); - Map entry = new HashMap<>(); - entry.put(javaVersion, 1); - - // http://openjdk.java.net/jeps/223 - // The java.version system property returns $major[.$minor][.$security][-ea]. - String majorVersion = javaVersion.split("\\.")[0]; - - // valid strings for the major may potentially include values such as -ea to denote a - // pre-release - Matcher versionMatcher = Pattern.compile("\\d+").matcher(majorVersion); - if (versionMatcher.find()) { - majorVersion = versionMatcher.group(0); - } - String release = "Java " + majorVersion; - map.put(release, entry); - - return map; + Runtime.Version version = Runtime.version(); + + return Map.of( + "Java " + version.feature(), + Map.of(System.getProperty("java.version"), 1)); })); } } From b14da3f63efd4fe17ddda5720fca0bbe9cb2f741 Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 3 Jul 2026 11:57:11 +0200 Subject: [PATCH 3/4] Reconstruct `java.version` system property through `Runtime.Version` --- .../com/velocitypowered/proxy/Metrics.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java b/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java index cdb4f2b720..89304538db 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java @@ -21,8 +21,8 @@ import java.io.File; import java.io.IOException; import java.nio.file.Path; -import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.bstats.MetricsBase; @@ -122,9 +122,23 @@ static void startMetrics(VelocityServer server, VelocityConfiguration.Metrics me return Map.of( "Java " + version.feature(), - Map.of(System.getProperty("java.version"), 1)); + Map.of(javaVersion(version), 1)); })); } } + /** + * Reconstructs the {@code java.version} system property value from a + * {@link Runtime.Version}, i.e. {@code $VNUM(-$PRE)?} with the build and + * optional segments omitted. + * + * @param v the runtime version + * @return the version and pre-release parts joined as {@code java.version} would render them + */ + private static String javaVersion(Runtime.Version v) { + return v.version().stream() + .map(Object::toString) + .collect(Collectors.joining(".")) + + v.pre().map(p -> "-" + p).orElse(""); + } } \ No newline at end of file From c03f6c33a02846631c5362c5b5b64e6eb3ac240e Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 3 Jul 2026 12:25:08 +0200 Subject: [PATCH 4/4] Update `javaVersion()` javadoc --- .../src/main/java/com/velocitypowered/proxy/Metrics.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java b/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java index 89304538db..fdab3634ec 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/Metrics.java @@ -128,12 +128,13 @@ static void startMetrics(VelocityServer server, VelocityConfiguration.Metrics me } /** - * Reconstructs the {@code java.version} system property value from a - * {@link Runtime.Version}, i.e. {@code $VNUM(-$PRE)?} with the build and - * optional segments omitted. + * Recreates the exact {@code java.version} system property value from a {@link Runtime.Version}. + * + *

Per JEP 223, {@code java.version} is + * {@code $VNUM(-$PRE)?}; the build and optional segments only appear in {@code java.runtime.version}. * * @param v the runtime version - * @return the version and pre-release parts joined as {@code java.version} would render them + * @return the value {@code java.version} would hold on this JVM */ private static String javaVersion(Runtime.Version v) { return v.version().stream()