Skip to content

Commit a9a6b2c

Browse files
author
Benoit Desire
committed
Support JDK10+ version-string format
As in https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Runtime.Version.html Also add fix from puniverse#130 Change-Id: Id166fa885c45248d3baa03c4faec78c1156fbaa9
1 parent 9e2fe6e commit a9a6b2c

File tree

2 files changed

+63
-14
lines changed

2 files changed

+63
-14
lines changed

capsule/src/main/java/Capsule.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4278,7 +4278,7 @@ private static Path getJavaExecutable0(Path javaHome) {
42784278
return javaHome.resolve("bin").resolve(exec + (isWindows() ? ".exe" : ""));
42794279
}
42804280

4281-
private static final Pattern PAT_JAVA_VERSION_LINE = Pattern.compile(".*?\"(.+?)\"");
4281+
private static final Pattern PAT_JAVA_VERSION_LINE = Pattern.compile(".*?\"(.+?)\".*");
42824282

42834283
private static String getActualJavaVersion(Path javaHome) {
42844284
try {
@@ -4349,7 +4349,7 @@ protected static final int compareVersions(String a, String b) {
43494349
}
43504350

43514351
private static int compareVersions(int[] a, int[] b) {
4352-
return compareVersions(a, b, 5);
4352+
return compareVersions(a, b, Math.min(a.length, b.length));
43534353
}
43544354

43554355
private static int compareVersions(int[] a, int[] b, int n) {
@@ -4368,19 +4368,27 @@ private static boolean equals(int[] a, int[] b, int n) {
43684368
return true;
43694369
}
43704370

4371-
private static final Pattern PAT_JAVA_VERSION = Pattern.compile("(?<major>\\d+)(\\.(?<minor>\\d+))?(?:\\.(?<patch>\\d+))?(_(?<update>\\d+))?(-(?<pre>[^-]+))?(-(?<build>.+))?");
4371+
private static final Pattern PAT_JAVA_VERSION = Pattern.compile("(?<major>1)(\\.(?<minor>\\d+))?(?:\\.(?<patch>\\d+))?(_(?<update>\\d+))?(-(?<pre>[^-]+))?(-(?<build>.+))?");
4372+
// from https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Runtime.Version.html
4373+
private static final Pattern PAT_JAVA_VERSION_JDK10 = Pattern.compile("(?<major>\\d+)(\\.(?<minor>\\d+))?(?:\\.(?<patch>\\d+))?(\\.(?<update>\\d+))?(-(?<pre>[^-]+))?.*");
43724374

43734375
// visible for testing
43744376
static int[] parseJavaVersion(String v) {
4375-
final Matcher m = PAT_JAVA_VERSION.matcher(v);
4377+
Matcher m = PAT_JAVA_VERSION.matcher(v);
43764378
if (!m.matches())
4377-
throw new IllegalArgumentException("Could not parse version: " + v);
4379+
{
4380+
m = PAT_JAVA_VERSION_JDK10.matcher(v);
4381+
if (!m.matches())
4382+
{
4383+
throw new IllegalArgumentException("Could not parse version: " + v);
4384+
}
4385+
}
43784386
final int[] ver = new int[5];
43794387
ver[0] = toInt(m.group("major"));
43804388
ver[1] = toInt(m.group("minor"));
43814389
ver[2] = toInt(m.group("patch"));
43824390
ver[3] = toInt(m.group("update"));
4383-
if (ver[0] > 1 && ver[1] == 0) {
4391+
if (ver[0] > 1 && ver[0] < 9 && ver[1] == 0) {
43844392
ver[1] = ver[0];
43854393
ver[0] = 1;
43864394
}
@@ -4403,7 +4411,10 @@ static String toJavaVersionString(int[] version) {
44034411
sb.append(version[1]).append('.');
44044412
sb.append(version[2]);
44054413
if (version.length > 3 && version[3] > 0)
4406-
sb.append('_').append(version[3]);
4414+
{
4415+
char sep = version[0]>9 ? '.':'_';
4416+
sb.append(sep).append(version[3]);
4417+
}
44074418
if (version.length > 4 && version[4] != 0) {
44084419
final String pre;
44094420
switch (version[4]) {
@@ -5593,14 +5604,9 @@ private void overridePlatformMBeanServer() {
55935604

55945605
if (platformMBeanServer instanceof com.sun.jmx.mbeanserver.JmxMBeanServer) {
55955606
final MBeanServer interceptor = (MBeanServer) Proxy.newProxyInstance(MY_CLASSLOADER, new Class<?>[]{MBeanServer.class}, this);
5596-
5597-
Field interceptorField = accessible(com.sun.jmx.mbeanserver.JmxMBeanServer.class.getDeclaredField("mbsInterceptor"));
5598-
// this.origMBeanServer = ((com.sun.jmx.mbeanserver.JmxMBeanServer) platformMBeanServer).getMBeanServerInterceptor();
5599-
this.origMBeanServer = (MBeanServer) interceptorField.get(platformMBeanServer);
5600-
// ((com.sun.jmx.mbeanserver.JmxMBeanServer) platformMBeanServer).setMBeanServerInterceptor(interceptor);
5601-
interceptorField.set(platformMBeanServer, interceptor);
5607+
this.origMBeanServer = ((com.sun.jmx.mbeanserver.JmxMBeanServer) platformMBeanServer).getMBeanServerInterceptor();
5608+
((com.sun.jmx.mbeanserver.JmxMBeanServer) platformMBeanServer).setMBeanServerInterceptor(interceptor);
56025609
}
5603-
// accessible(ManagementFactory.class.getDeclaredField("platformMBeanServer")).set(null, this);
56045610
} catch (Throwable e) { // JDK 9 throws an IllegalAccessError
56055611
log(LOG_VERBOSE, "Overriding platform MBeanServer failed: " + e.getMessage());
56065612
log(LOG_VERBOSE, e);

capsule/src/test/java/CapsuleTest.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,13 +1317,56 @@ public void testParseJavaVersion() {
13171317
assertEquals("1.8.0_30-ea", Capsule.toJavaVersionString(ver));
13181318
}
13191319

1320+
@Test
1321+
public void testParseJavaVersion9plus()
1322+
{
1323+
int[] ver;
1324+
1325+
ver = Capsule.parseJavaVersion("11");
1326+
assertArrayEquals(ver, ints(11, 0, 0, 0, 0));
1327+
assertEquals("11.0.0", Capsule.toJavaVersionString(ver));
1328+
1329+
ver = Capsule.parseJavaVersion("11.0.9");
1330+
assertArrayEquals(ver, ints(11, 0, 9, 0, 0));
1331+
assertEquals("11.0.9", Capsule.toJavaVersionString(ver));
1332+
1333+
ver = Capsule.parseJavaVersion("11.0.9-ea");
1334+
assertArrayEquals(ver, ints(11, 0, 9, 0, -3));
1335+
assertEquals("11.0.9-ea", Capsule.toJavaVersionString(ver));
1336+
1337+
ver = Capsule.parseJavaVersion("11.0.9.1");
1338+
assertArrayEquals(ver, ints(11, 0, 9, 1, 0));
1339+
assertEquals("11.0.9.1", Capsule.toJavaVersionString(ver));
1340+
1341+
ver = Capsule.parseJavaVersion("11.2.9.1");
1342+
assertArrayEquals(ver, ints(11, 2, 9, 1, 0));
1343+
assertEquals("11.2.9.1", Capsule.toJavaVersionString(ver));
1344+
1345+
ver = Capsule.parseJavaVersion("11.0.9.1-ea");
1346+
assertArrayEquals(ver, ints(11, 0, 9, 1, -3));
1347+
assertEquals("11.0.9.1-ea", Capsule.toJavaVersionString(ver));
1348+
1349+
ver = Capsule.parseJavaVersion("11.0.9.1-ea+1-opt");
1350+
assertArrayEquals(ver, ints(11, 0, 9, 1, -3));
1351+
assertEquals("11.0.9.1-ea", Capsule.toJavaVersionString(ver));
1352+
1353+
ver = Capsule.parseJavaVersion("11.0.9.1+-opt");
1354+
assertArrayEquals(ver, ints(11, 0, 9, 1, 0));
1355+
assertEquals("11.0.9.1", Capsule.toJavaVersionString(ver));
1356+
1357+
ver = Capsule.parseJavaVersion("9.0.1+-opt");
1358+
assertArrayEquals(ver, ints(9, 0, 1, 0, 0));
1359+
assertEquals("9.0.1", Capsule.toJavaVersionString(ver));
1360+
}
1361+
13201362
@Test
13211363
public void testCompareVersions() {
13221364
assertTrue(Capsule.compareVersions("1.8.0_30-ea", "1.8.0_30") < 0);
13231365
assertTrue(Capsule.compareVersions("1.8.0_30-ea", "1.8.0_20") > 0);
13241366
assertTrue(Capsule.compareVersions("1.8.0-ea", "1.8.0_20") < 0);
13251367
assertTrue(Capsule.compareVersions("1.8.0-ea", "1.8.0") < 0);
13261368
assertTrue(Capsule.compareVersions("1.8.0-ea", "1.7.0") > 0);
1369+
assertTrue(Capsule.compareVersions("11", "10.0.1.0") > 0);
13271370
}
13281371

13291372
@Test

0 commit comments

Comments
 (0)