From e0eab58c2442b2aeaa31aa69ed5a9fee358971b3 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Mon, 15 Jan 2018 16:40:57 +0100 Subject: [PATCH] Issue #1797 - JEP 238 - Multi-Release JAR files break bytecode scanning. Fixed for java 10 Signed-off-by: Greg Wilkins --- .../jetty/util/MultiReleaseJarFile.java | 2 +- .../jetty/util/MultiReleaseJarFileTest.java | 110 +++++++++++++----- jetty-util/src/test/resources/example.jar | Bin 4228 -> 6047 bytes 3 files changed, 83 insertions(+), 29 deletions(-) diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiReleaseJarFile.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiReleaseJarFile.java index 294e5e93fb84..3dd99bcafbc0 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiReleaseJarFile.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiReleaseJarFile.java @@ -238,7 +238,7 @@ public InputStream getInputStream() throws IOException boolean isApplicable() { if (multiRelease) - return this.version>=0 && this.version <= platform && name.length()>0; + return ( this.version==0 || this.version == platform ) && name.length()>0; return this.version==0; } diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/MultiReleaseJarFileTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/MultiReleaseJarFileTest.java index dba2a2d00e1f..fb7e36b07706 100644 --- a/jetty-util/src/test/java/org/eclipse/jetty/util/MultiReleaseJarFileTest.java +++ b/jetty-util/src/test/java/org/eclipse/jetty/util/MultiReleaseJarFileTest.java @@ -19,13 +19,15 @@ package org.eclipse.jetty.util; import java.io.File; -import java.util.Set; +import java.net.URL; +import java.net.URLClassLoader; import java.util.stream.Collectors; import org.eclipse.jetty.toolchain.test.AdvancedRunner; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.util.MultiReleaseJarFile.VersionedJarEntry; import org.hamcrest.Matchers; -import org.junit.Assert; +import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; @@ -42,50 +44,102 @@ public class MultiReleaseJarFileTest @Test public void testExampleJarIsMR() throws Exception { - MultiReleaseJarFile jarFile = new MultiReleaseJarFile(example); - assertTrue(jarFile.isMultiRelease()); + try(MultiReleaseJarFile jarFile = new MultiReleaseJarFile(example)) + { + assertTrue(jarFile.isMultiRelease()); + } } @Test public void testBase() throws Exception { - MultiReleaseJarFile jarFile = new MultiReleaseJarFile(example,8,false); - assertThat(jarFile.getEntry("META-INF/MANIFEST.MF").getVersion(), is(0)); - assertThat(jarFile.getEntry("org/example/OnlyInBase.class").getVersion(), is(0)); - assertThat(jarFile.getEntry("org/example/InBoth$InnerBase.class").getVersion(), is(0)); - assertThat(jarFile.getEntry("org/example/InBoth$InnerBoth.class").getVersion(), is(0)); - assertThat(jarFile.getEntry("org/example/InBoth.class").getVersion(), is(0)); + try (MultiReleaseJarFile jarFile = new MultiReleaseJarFile(example,8,false)) + { + assertThat(jarFile.getEntry("META-INF/MANIFEST.MF").getVersion(), is(0)); + assertThat(jarFile.getEntry("org/example/OnlyInBase.class").getVersion(), is(0)); + assertThat(jarFile.getEntry("org/example/InBoth$InnerBase.class").getVersion(), is(0)); + assertThat(jarFile.getEntry("org/example/InBoth$InnerBoth.class").getVersion(), is(0)); + assertThat(jarFile.getEntry("org/example/InBoth.class").getVersion(), is(0)); - assertThat(jarFile.stream().count(), is(5L)); + assertThat(jarFile.stream().map(VersionedJarEntry::getName).collect(Collectors.toSet()), + Matchers.containsInAnyOrder( + "META-INF/MANIFEST.MF", + "org/example/OnlyInBase.class", + "org/example/InBoth$InnerBase.class", + "org/example/InBoth$InnerBoth.class", + "org/example/InBoth.class", + "WEB-INF/web.xml", + "WEB-INF/classes/App.class", + "WEB-INF/lib/depend.jar")); + } } @Test public void test9() throws Exception { - MultiReleaseJarFile jarFile = new MultiReleaseJarFile(example,9,false); - assertThat(jarFile.getEntry("META-INF/MANIFEST.MF").getVersion(), is(0)); - assertThat(jarFile.getEntry("org/example/OnlyInBase.class").getVersion(), is(0)); - assertThat(jarFile.getEntry("org/example/InBoth$InnerBoth.class").getVersion(), is(9)); - assertThat(jarFile.getEntry("org/example/InBoth.class").getVersion(), is(9)); - assertThat(jarFile.getEntry("org/example/OnlyIn9.class").getVersion(), is(9)); - assertThat(jarFile.getEntry("org/example/onlyIn9/OnlyIn9.class").getVersion(), is(9)); - assertThat(jarFile.getEntry("org/example/InBoth$Inner9.class").getVersion(), is(9)); + try(MultiReleaseJarFile jarFile = new MultiReleaseJarFile(example,9,false)) + { + assertThat(jarFile.getEntry("META-INF/MANIFEST.MF").getVersion(), is(0)); + assertThat(jarFile.getEntry("org/example/OnlyInBase.class").getVersion(), is(0)); + assertThat(jarFile.getEntry("org/example/InBoth$InnerBoth.class").getVersion(), is(9)); + assertThat(jarFile.getEntry("org/example/InBoth.class").getVersion(), is(9)); + assertThat(jarFile.getEntry("org/example/OnlyIn9.class").getVersion(), is(9)); + assertThat(jarFile.getEntry("org/example/onlyIn9/OnlyIn9.class").getVersion(), is(9)); + assertThat(jarFile.getEntry("org/example/InBoth$Inner9.class").getVersion(), is(9)); - assertThat(jarFile.stream().count(), is(7L)); + assertThat(jarFile.stream().map(VersionedJarEntry::getName).collect(Collectors.toSet()), + Matchers.containsInAnyOrder( + "META-INF/MANIFEST.MF", + "org/example/OnlyInBase.class", + "org/example/InBoth$InnerBoth.class", + "org/example/InBoth.class", + "org/example/OnlyIn9.class", + "org/example/onlyIn9/OnlyIn9.class", + "org/example/InBoth$Inner9.class", + "WEB-INF/web.xml", + "WEB-INF/classes/App.class", + "WEB-INF/lib/depend.jar")); + } } @Test public void test10() throws Exception { - MultiReleaseJarFile jarFile = new MultiReleaseJarFile(example,10,false); - assertThat(jarFile.getEntry("META-INF/MANIFEST.MF").getVersion(), is(0)); - assertThat(jarFile.getEntry("org/example/OnlyInBase.class").getVersion(), is(0)); - assertThat(jarFile.getEntry("org/example/InBoth.class").getVersion(), is(10)); - assertThat(jarFile.getEntry("org/example/OnlyIn9.class").getVersion(), is(9)); - assertThat(jarFile.getEntry("org/example/onlyIn9/OnlyIn9.class").getVersion(), is(9)); - assertThat(jarFile.getEntry("org/example/In10Only.class").getVersion(), is(10)); + try(MultiReleaseJarFile jarFile = new MultiReleaseJarFile(example,10,false)) + { + assertThat(jarFile.getEntry("META-INF/MANIFEST.MF").getVersion(), is(0)); + assertThat(jarFile.getEntry("org/example/OnlyInBase.class").getVersion(), is(0)); + assertThat(jarFile.getEntry("org/example/InBoth.class").getVersion(), is(10)); + assertThat(jarFile.getEntry("org/example/In10Only.class").getVersion(), is(10)); + + assertThat(jarFile.stream().map(VersionedJarEntry::getName).collect(Collectors.toSet()), + Matchers.containsInAnyOrder( + "META-INF/MANIFEST.MF", + "org/example/OnlyInBase.class", + "org/example/InBoth.class", + "org/example/In10Only.class", + "WEB-INF/web.xml", + "WEB-INF/classes/App.class", + "WEB-INF/lib/depend.jar")); - assertThat(jarFile.stream().count(), is(6L)); + } + } + + + @Test + public void testClassLoaderJava9() throws Exception + { + Assume.assumeTrue(JavaVersion.VERSION.getPlatform()==9); + + try(URLClassLoader loader = new URLClassLoader(new URL[]{example.toURI().toURL()})) + { + assertThat(IO.toString(loader.getResource("org/example/OnlyInBase.class").openStream()),is("org/example/OnlyInBase.class")); + assertThat(IO.toString(loader.getResource("org/example/OnlyIn9.class").openStream()),is("META-INF/versions/9/org/example/OnlyIn9.class")); + assertThat(IO.toString(loader.getResource("WEB-INF/web.xml").openStream()),is("META-INF/versions/9/WEB-INF/web.xml")); + assertThat(IO.toString(loader.getResource("WEB-INF/classes/App.class").openStream()),is("META-INF/versions/9/WEB-INF/classes/App.class")); + assertThat(IO.toString(loader.getResource("WEB-INF/lib/depend.jar").openStream()),is("META-INF/versions/9/WEB-INF/lib/depend.jar")); + } + } diff --git a/jetty-util/src/test/resources/example.jar b/jetty-util/src/test/resources/example.jar index ada1f91be6b288923bc7c9556a9f244723cdb1a1..ae6588831400f7ad3ae07fc0d2d43487c5b3e35f 100644 GIT binary patch literal 6047 zcmb7IT})g>6uvAJwxy(6Dg8;)AEXV?-My3_32Gl8Lb$u^PbgFyeUQS{Qnw52La8P` zRE<(ee5e|2`Y1|jqp{GRSbZ=tjnG|KpcK=XCXFqnKQFYUVq!GT*}He=%rJNNG6dL! zIp6u_oSAdJgU^+oktV|TSjsjJ=FtIQb*KasJ$Z)l8yJT6Yk$#lEh@Akx57JO=R{V$838t zGxcc8;ZDCAGuKjei!+zam@9$ZCEkGlZAYuWB@}wxlhZZ*WFd4_))KL6rm}n@Dm#Do zeper{k0{p`BW30D(eUYM*SKPHWRkFES(VQ^|JqG_fj^pio{ilco0^X9gQmHJuE?Vk zh>7)!d!7%mgzf z0EsM60s%ExWs+9}(&>8`3A^k=_l1R<*{YrPs=}W}}Oy`_>VvJ3Ec@ zyQa6tlD%WDAaDI(-h&tNa_=6y9y|U}*XucuH@376aEI8I;t>A!11O{X0g6pnx2c_K zpv`fpCAhR#U7U`wpKaTDZ*U-Q;Lg`~)g5_hG5Xs#4s{n1cyK|VDo^0q6a;$J1CFDI z{f3@DAKZDb`Su-fk!9_BtG*(i00JmYdoLF;P)>S+=&mohT~DE1dK!(70dhmf)ORP6 zp55Cs1s&cC4cud&>9rM3qz}jH+4J*rU#%y$U{ASx!*N-S(39sgkK0Ler;~_|HcWXH zd;OSeGVHWzs%`V0icQdP!P@wYYY=ukEjp;|bx)lc8PgJfVZ;5KPm{f{pPq?t@EPQ< zY%~8c#HvI%HSEwUHf6>O9mqM}iCZCUI$=gs(ay&-80Rbbtsnvc(%2!?9PCglb~P;_ zReR=)t5|IdIc=V6sPBhP-}+<=K>;LVKadpcM?09nN337sw(vorcWx801_WdLq=6Hk z26g5jcc!!lkA8ugs>LqNk}I(TjfMOT77R4(N(=)q-uPUsDV`}nNYb^3d`y_4;RX;^ zNm{!Q%^nnC3L_+hX)^nD)R=s-q#*_g``Bb+OaUG{T@^+Uka)~QG^QglK5t z5#c!k#0*_$%)qge49**X`q2n~}4%?DqK;EmAr z!~lU$hiLYoD7(@{M`R@^4j9ZLcoqQ7Lsz>AG~r}|T|iE-um^EZS2}r*O*W(8A68z|xz&SfwjcAA%94JTz9*ps4Bk*#tB$&w#AgAdwoU$S-B4 zCatS#%oo%-mdNat`FI(qOG2U(7in!ud~24NxGscn2t?YOBJEFsq)RG%d{B~DBC|K) zlu5*dNW)}B8k>^cLIkAfrRc}j6dEnGKopB%5X5x7W&(|>I6eSa@q+55>qZLPxPrsS z771kv=vzr8F18X0XKHl>Ss7&!i(s}l4hXD;851dHN`gGZggO^x2kT$Zz;xL-OXEyn z)eFj(u0Dhzh&tbmSZy>zjQP$Z63W!w-*F40o{tr7J~bns^0P&1Q~QsSaW%$D7St?V zpK^G-O2(HNniJNnY)}4&L*fgqt~3D!t5EiQuab#kslte#FQImQt`($oN>Ty&x