--- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java Fri Oct 04 15:51:17 2019 -0400
+++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java Sun Oct 06 13:08:58 2019 -0400
@@ -60,18 +60,20 @@
JarFileSystem(ZipFileSystemProvider provider, Path zfpath, Map<String,?> env) throws IOException {
super(provider, zfpath, env);
- if (isMultiReleaseJar()) {
+ Object o = getRuntimeVersion(env);
+ if (isMultiReleaseJar() && (o != null)) {
int version;
- Object o = env.get("multi-release");
if (o instanceof String) {
String s = (String)o;
if (s.equals("runtime")) {
version = Runtime.version().feature();
+ } else if (s.matches("^[1-9][0-9]*$")) {
+ version = Version.parse(s).feature();
} else {
- version = Integer.parseInt(s);
+ throw new IllegalArgumentException("Invalid runtime version");
}
} else if (o instanceof Integer) {
- version = (Integer)o;
+ version = Version.parse(((Integer)o).toString()).feature();
} else if (o instanceof Version) {
version = ((Version)o).feature();
} else {
@@ -83,6 +85,23 @@
}
}
+ /**
+ * Utility method to get the release version for a multi-release JAR. It
+ * first checks the documented property {@code releaseVersion} and if not
+ * found checks the original property {@code multi-release}
+ * @param env ZIP FS map
+ * @return release version or null if it is not specified
+ */
+ private Object getRuntimeVersion(Map<String, ?> env) {
+ Object o = null;
+ if (env.containsKey(ZipFileSystemProvider.PROPERTY_RELEASE_VERSION)) {
+ o = env.get(ZipFileSystemProvider.PROPERTY_RELEASE_VERSION);
+ } else {
+ o = env.get(ZipFileSystemProvider.PROPERTY_MULTI_RELEASE);
+ }
+ return o;
+ }
+
private boolean isMultiReleaseJar() throws IOException {
try (InputStream is = newInputStream(getBytes("/META-INF/MANIFEST.MF"))) {
String multiRelease = new Manifest(is).getMainAttributes()