(window.webpackJsonp=window.webpackJsonp||[]).push([[1629],{2037:function(s,a,t){"use strict";t.r(a);var e=t(31),r=Object(e.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"multi-release-jar-files"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#multi-release-jar-files"}},[s._v("#")]),s._v(" Multi-Release JAR Files")]),s._v(" "),t("p",[s._v("One of the features introduced in Java 9 is the multi-release Jar (MRJAR) which allows bundling code targeting multiple Java releases within the same Jar file. The feature is specified in "),t("a",{attrs:{href:"http://openjdk.java.net/jeps/238",target:"_blank",rel:"noopener noreferrer"}},[s._v("JEP 238"),t("OutboundLink")],1),s._v(".")]),s._v(" "),t("h2",{attrs:{id:"example-of-a-multi-release-jar-file-s-contents"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-of-a-multi-release-jar-file-s-contents"}},[s._v("#")]),s._v(" Example of a multi-release Jar file's contents")]),s._v(" "),t("p",[s._v("By setting "),t("a",{attrs:{href:"http://download.java.net/java/jdk9/docs/api/java/util/jar/Attributes.Name.html#MULTI_RELEASE",target:"_blank",rel:"noopener noreferrer"}},[t("code",[s._v("Multi-Release: true")]),t("OutboundLink")],1),s._v(" in the MANIFEST.MF file, the Jar file becomes a multi-release Jar and the Java runtime (as long as it supports the MRJAR format) will pick the appropriate versions of classes depending on the current major version.")]),s._v(" "),t("p",[s._v("The structure of such a Jar is the following:")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v("jar root\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("D")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" META"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("INF\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" versions\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n\n")])])]),t("ul",[t("li",[s._v("On JDKs < 9, only the classes in the root entry are visible to the Java runtime.")]),s._v(" "),t("li",[s._v("On a JDK 9, the classes A and B will be loaded from the directory "),t("code",[s._v("root/META-INF/versions/9")]),s._v(", while C and D will be loaded from the base entry.")]),s._v(" "),t("li",[s._v("On a JDK 10, class A would be loaded from the directory "),t("code",[s._v("root/META-INF/versions/10")]),s._v(".")])]),s._v(" "),t("h2",{attrs:{id:"creating-a-multi-release-jar-using-the-jar-tool"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-multi-release-jar-using-the-jar-tool"}},[s._v("#")]),s._v(" Creating a multi-release Jar using the jar tool")]),s._v(" "),t("p",[s._v("The "),t("code",[s._v("jar")]),s._v(" command can be used to create a multi-release Jar containing two versions of the same class compiled for both Java 8 and Java 9, albeit with a warning telling that the classes are identical:")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\\"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Users")]),s._v("\\manouti"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("jar "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("create "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("file MR"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("jar "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),s._v(" sampleproject"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("base demo "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("release "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),s._v(" sampleproject"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v(" demo\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Warning")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" entry META"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("INF"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("versions"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("demo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SampleClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" contains a "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" that\nis identical "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("an")]),s._v(" entry already in the jar\n\n")])])]),t("p",[s._v("The "),t("code",[s._v("--release 9")]),s._v(" option tells "),t("code",[s._v("jar")]),s._v(" to include everything that follows (the "),t("code",[s._v("demo")]),s._v(" package inside the "),t("code",[s._v("sampleproject-9")]),s._v(" directory) inside a versioned entry in the MRJAR, namely under "),t("code",[s._v("root/META-INF/versions/9")]),s._v(". The result is the following contents:")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v("jar root\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" demo\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SampleClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" META"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("INF\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" versions\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" demo\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SampleClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n\n")])])]),t("p",[s._v("Let us now create a class called Main that prints the URL of the "),t("code",[s._v("SampleClass")]),s._v(", and add it for the Java 9 version:")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("demo")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("net"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),s._v("URL"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Main")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("URL")]),s._v(" url "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getClassLoader")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getResource")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"demo/SampleClass.class"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("url"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])])]),t("p",[s._v("If we compile this class and re-run the jar command, we get an error:")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\\"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Users")]),s._v("\\manouti"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("jar "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("create "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("file MR"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("jar "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),s._v(" sampleproject"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("base demo "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("release "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),s._v(" sampleproject"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v(" demoentry"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" META"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("INF"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("versions"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("demo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" contains a "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" not found in base entries\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Warning")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" entry META"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("INF"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("versions"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("demo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" multiple resources "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("same")]),s._v(" name\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Warning")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" entry META"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("INF"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("versions"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("demo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SampleClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" contains a "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" that\nis identical "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("an")]),s._v(" entry already in the jar\ninvalid multi"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("release jar file MR"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("jar deleted\n\n")])])]),t("p",[s._v("The reason is that the "),t("code",[s._v("jar")]),s._v(" tool prevents adding public classes to versioned entries if they are not added to the base entries as well. This is done so that the MRJAR exposes the same public API for the different Java versions. Note that at runtime, this rule is not required. It may be only applied by tools like "),t("code",[s._v("jar")]),s._v(". In this particular case, the purpose of "),t("code",[s._v("Main")]),s._v(" is to run sample code, so we can simply add a copy in the base entry. If the class were part of a newer implementation that we only need for Java 9, it could be made non-public.")]),s._v(" "),t("p",[s._v("To add "),t("code",[s._v("Main")]),s._v(" to the root entry, we first need to compile it to target a pre-Java 9 release. This can be done using the new "),t("code",[s._v("--release")]),s._v(" option of "),t("code",[s._v("javac")]),s._v(":")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\\"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Users")]),s._v("\\manouti\\sampleproject"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("base\\demo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("javac "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("release "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("8")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("java\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\\"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Users")]),s._v("\\manouti\\sampleproject"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("base\\demo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("cd "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("/"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\\"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Users")]),s._v("\\manouti"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("jar "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("create "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("file MR"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("jar "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),s._v(" sampleproject"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("base demo "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("release "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),s._v(" sampleproject"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v(" demo\n\n")])])]),t("p",[s._v("Running the Main class shows that the SampleClass gets loaded from the versioned directory:")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\\"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Users")]),s._v("\\manouti"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("java "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("path MR"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("jar "),t("span",{pre:!0,attrs:{class:"token class-name"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("demo"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),s._v("Main")]),s._v("\njar"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("file"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Users")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("manouti"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("MR"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("jar"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("META"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("INF"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("versions"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("demo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SampleClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n\n")])])]),t("h2",{attrs:{id:"url-of-a-loaded-class-inside-a-multi-release-jar"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#url-of-a-loaded-class-inside-a-multi-release-jar"}},[s._v("#")]),s._v(" URL of a loaded class inside a multi-release Jar")]),s._v(" "),t("p",[s._v("Given the following multi-release Jar:")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v("jar root\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" demo\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SampleClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" META"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("INF\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" versions\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" demo\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SampleClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n\n")])])]),t("p",[s._v("The following class prints the URL of the "),t("code",[s._v("SampleClass")]),s._v(":")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("demo")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("net"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),s._v("URL"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Main")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("URL")]),s._v(" url "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getClassLoader")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getResource")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"demo/SampleClass.class"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("url"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])])]),t("p",[s._v("If the class is compiled and added on the versioned entry for Java 9 in the MRJAR, running it would result in:")]),s._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\\"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Users")]),s._v("\\manouti"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("java "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("path MR"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("jar "),t("span",{pre:!0,attrs:{class:"token class-name"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("demo"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),s._v("Main")]),s._v("\njar"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("file"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("C")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Users")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("manouti"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("MR"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("jar"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("META"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("INF"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("versions"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("demo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SampleClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v("\n\n")])])])])}),[],!1,null,null,null);a.default=r.exports}}]);