From 94079b9c619bf949a5ea03cee7d4dc2ae642d7b5 Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Thu, 9 Nov 2023 13:38:18 -0500 Subject: [PATCH] Improved Java version parsing (#138155) Fixes #135402 Add fallback logic for a different format of java version output and handle no patch versions. Add tests for new logic output to prevent regressions. --- .../flutter_tools/lib/src/android/java.dart | 11 ++++++++++ .../test/general.shard/android/java_test.dart | 20 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/packages/flutter_tools/lib/src/android/java.dart b/packages/flutter_tools/lib/src/android/java.dart index c99c3cf5e79..7a9f3565644 100644 --- a/packages/flutter_tools/lib/src/android/java.dart +++ b/packages/flutter_tools/lib/src/android/java.dart @@ -153,6 +153,17 @@ class Java { final Iterable matches = jdkVersionRegex.allMatches(rawVersionOutput); if (matches.isEmpty) { + // Fallback to second string format like "java 21.0.1 2023-09-19 LTS" + final RegExp secondJdkVersionRegex = + RegExp(r'java\s+(?\d+(\.\d+)?(\.\d+)?)\s+\d\d\d\d-\d\d-\d\d'); + final RegExpMatch? match = secondJdkVersionRegex.firstMatch(versionLines[0]); + if (match != null) { + final Version? parsedVersion = Version.parse(match.namedGroup('version')); + if (parsedVersion == null) { + return null; + } + return parsedVersion; + } _logger.printWarning(_formatJavaVersionWarning(rawVersionOutput)); return null; } diff --git a/packages/flutter_tools/test/general.shard/android/java_test.dart b/packages/flutter_tools/test/general.shard/android/java_test.dart index c7ff6786dae..937f8e05da5 100644 --- a/packages/flutter_tools/test/general.shard/android/java_test.dart +++ b/packages/flutter_tools/test/general.shard/android/java_test.dart @@ -280,6 +280,26 @@ OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode) expect(version.toString(), 'openjdk 19.0 2023-01-17'); expect(version, equals(Version(19, 0, null))); }); + + testWithoutContext('parses jdk 21 with patch numbers', () { + addJavaVersionCommand(''' +java 21.0.1 2023-09-19 LTS +Java(TM) SE Runtime Environment (build 21+35-LTS-2513) +Java HotSpot(TM) 64-Bit Server VM (build 21+35-LTS-2513, mixed mode, sharing) +'''); + final Version? version = java.version; + expect(version, equals(Version(21, 0, 1))); + }); + + testWithoutContext('parses jdk 21 with no patch numbers', () { + addJavaVersionCommand(''' +java 21 2023-09-19 LTS +Java(TM) SE Runtime Environment (build 21+35-LTS-2513) +Java HotSpot(TM) 64-Bit Server VM (build 21+35-LTS-2513, mixed mode, sharing) +'''); + final Version? version = java.version; + expect(version, equals(Version(21, 0, 0))); + }); }); }); }