Skip to content

Commit 7b7403e

Browse files
authored
Merge pull request #50527 from jerboaa/graalvm_ce_25.1_dev_version
Fix native-image version parsing for GraalVM 25.1-dev
2 parents c5e6643 + 4d080fe commit 7b7403e

File tree

3 files changed

+73
-3
lines changed

3 files changed

+73
-3
lines changed

core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/GraalVM.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ static final class VersionParseHelper {
1818
private static final String EA_BUILD_PREFIX = "-ea";
1919
private static final String JVMCI_BUILD_PREFIX = "jvmci-";
2020
private static final String MANDREL_VERS_PREFIX = "Mandrel-";
21+
private static final String GRAALVM_VERS_PREFIX = "GraalVM CE ";
2122

2223
private static final String LIBERICA_NIK_VERS_PREFIX = "Liberica-NIK-";
2324

@@ -66,7 +67,7 @@ static Version parse(List<String> lines) {
6667

6768
String vendorVersion = secondMatcher.group(VENDOR_VERSION_GROUP);
6869

69-
String graalVersion = graalVersion(javaVersion, v);
70+
String graalVersion = graalVersion(javaVersion, v, vendorVersion);
7071
if (vendorVersion.contains("-dev")) {
7172
graalVersion = graalVersion + "-dev";
7273
}
@@ -136,7 +137,26 @@ private static String matchVersion(String version) {
136137
return null;
137138
}
138139

139-
private static String graalVersion(String buildInfo, Runtime.Version v) {
140+
private static String graalVersion(String buildInfo, Runtime.Version v, String vendorVersion) {
141+
if (v.feature() >= 25 && vendorVersion != null && !vendorVersion.isBlank()) {
142+
if (vendorVersion.startsWith(GRAALVM_VERS_PREFIX)) {
143+
String versFromVendor = vendorVersion.substring(GRAALVM_VERS_PREFIX.length());
144+
versFromVendor = versFromVendor.substring(0, versFromVendor.indexOf("+")); // strip build number
145+
if (String.valueOf(v.feature()).equals(versFromVendor)) {
146+
// GA version
147+
versFromVendor = String.format("%d.0.0", v.feature());
148+
}
149+
// Strip potential -dev suffix
150+
if (versFromVendor.endsWith("-dev")) {
151+
versFromVendor = versFromVendor.substring(0, versFromVendor.length() - 4);
152+
}
153+
Matcher versMatcher = VERSION_PATTERN.matcher(versFromVendor);
154+
if (versMatcher.find()) {
155+
return matchVersion(versFromVendor);
156+
}
157+
// fall through to other logic
158+
}
159+
}
140160
if (buildInfo == null) {
141161
return null;
142162
}

core/deployment/src/test/java/io/quarkus/deployment/pkg/steps/GraalVMTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,45 @@ public void testGraalVM26CommunityVersionParser() {
200200
assertThat(version.javaVersion.update()).isEqualTo(0);
201201
}
202202

203+
@Test
204+
public void testGraalVM25_0CommunityVersion() {
205+
final Version version = Version.of(Stream.of(("native-image 25 2025-09-16\n"
206+
+ "GraalVM Runtime Environment GraalVM CE 25+37.1 (build 25+37-jvmci-b01)\n"
207+
+ "Substrate VM GraalVM CE 25+37.1 (build 25+37, serial gc)").split("\\n")));
208+
assertThat(version.toString().contains(GRAALVM.name()));
209+
assertThat(version.getVersionAsString()).isEqualTo("25.0.0");
210+
assertThat(version.javaVersion.toString()).isEqualTo("25+37-jvmci-b01");
211+
assertThat(version.javaVersion.feature()).isEqualTo(25);
212+
assertThat(version.javaVersion.interim()).isEqualTo(0);
213+
assertThat(version.javaVersion.update()).isEqualTo(0);
214+
}
215+
216+
@Test
217+
public void testGraalVM25_0_1CommunityVersion() {
218+
final Version version = Version.of(Stream.of(("native-image 25.0.1 2025-10-21\n"
219+
+ "GraalVM Runtime Environment GraalVM CE 25.0.1+99.1 (build 25.0.1+99-jvmci-b01)\n"
220+
+ "Substrate VM GraalVM CE 25.0.1+99.1 (build 25.0.1+99, serial gc)").split("\\n")));
221+
assertThat(version.toString().contains(GRAALVM.name()));
222+
assertThat(version.getVersionAsString()).isEqualTo("25.0.1");
223+
assertThat(version.javaVersion.toString()).isEqualTo("25.0.1+99-jvmci-b01");
224+
assertThat(version.javaVersion.feature()).isEqualTo(25);
225+
assertThat(version.javaVersion.interim()).isEqualTo(0);
226+
assertThat(version.javaVersion.update()).isEqualTo(1);
227+
}
228+
229+
@Test
230+
public void testGraalVM25_1CommunityVersionParser() {
231+
final Version version = Version.of(Stream.of(("native-image 25 2025-09-16\n"
232+
+ "GraalVM Runtime Environment GraalVM CE 25.1.0-dev+37.1 (build 25+37-jvmci-b06)\n"
233+
+ "Substrate VM GraalVM CE 25.1.0-dev+37.1 (build 25+37, serial gc)").split("\\n")));
234+
assertThat(version.toString().contains(GRAALVM.name()));
235+
assertThat(version.getVersionAsString()).isEqualTo("25.1.0-dev");
236+
assertThat(version.javaVersion.toString()).isEqualTo("25+37-jvmci-b06");
237+
assertThat(version.javaVersion.feature()).isEqualTo(25);
238+
assertThat(version.javaVersion.interim()).isEqualTo(0);
239+
assertThat(version.javaVersion.update()).isEqualTo(0);
240+
}
241+
203242
@Test
204243
public void testGraalVMVersionsOlderThan() {
205244
assertOlderThan("native-image 21 2023-09-19\n" +

core/runtime/src/main/java/io/quarkus/runtime/graal/GraalVM.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ static Version parse(String value) {
5353
String tokens[] = version.split("\\.", 3);
5454
String jdkFeature = tokens[0];
5555
String jdkVers = jdkFeature;
56-
if (tokens.length == 3) {
56+
if (tokens.length == 3 && !graalVMFutureVers(tokens)) {
5757
String interim = tokens[1];
5858
String update = tokens[2].split("\\+")[0];
5959
jdkVers = String.format("%s.%s.%s", jdkFeature, interim, update);
@@ -73,6 +73,17 @@ static Version parse(String value) {
7373
return Version.CURRENT;
7474
}
7575

76+
// Anything beyond 25.0 is a future GraalVM version not suitable for Runtime.Version.parse()
77+
private static boolean graalVMFutureVers(String[] tokens) {
78+
try {
79+
int feature = Integer.valueOf(tokens[0]);
80+
int interim = Integer.valueOf(tokens[1]);
81+
return feature > 25 || (feature == 25 && interim > 0);
82+
} catch (NumberFormatException e) {
83+
return false;
84+
}
85+
}
86+
7687
}
7788

7889
public static class Version implements Comparable<Version> {

0 commit comments

Comments
 (0)