Skip to content

Commit

Permalink
Issue #1797 - JEP 238 - Multi-Release JAR files break bytecode scanni…
Browse files Browse the repository at this point in the history
…ng. Fixed for java 10

Signed-off-by: Greg Wilkins <gregw@webtide.com>
  • Loading branch information
gregw committed Jan 15, 2018
1 parent f4e37b1 commit e0eab58
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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"));
}

}


Expand Down
Binary file modified jetty-util/src/test/resources/example.jar
Binary file not shown.

0 comments on commit e0eab58

Please sign in to comment.