diff --git a/java/pom.xml b/java/pom.xml index 7ea593eb53238acdc465a2bec4a34308e7444f59..a839c769a1f12a3c50359e0a34c064db87801004 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -18,6 +18,7 @@ <module>runjava</module> <module>tests</module> <module>tests-isolates</module> + <module>tests-jre-extension</module> </modules> <dependencies> @@ -56,6 +57,11 @@ <artifactId>tests-isolates</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>io.osv</groupId> + <artifactId>tests-jre-extension</artifactId> + <version>${project.version}</version> + </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> diff --git a/java/runjava/pom.xml b/java/runjava/pom.xml index 8aeb185723052e612ca8ebc14ffba517c0cf032c..feed5f1912698ce948f965e6869e9f84d30b8519 100644 --- a/java/runjava/pom.xml +++ b/java/runjava/pom.xml @@ -43,6 +43,31 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <version>2.2</version> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <relocations> + <relocation> + <pattern>net.sf.cglib</pattern> + <shadedPattern>io.osv.shade.net.sf.cglib</shadedPattern> + </relocation> + <relocation> + <pattern>org.objectweb.asm</pattern> + <shadedPattern>io.osv.shade.org.objectweb.asm</shadedPattern> + </relocation> + </relocations> + </configuration> + </execution> + </executions> + </plugin> </plugins> </build> </project> diff --git a/java/runjava/src/main/java/io/osv/ContextIsolator.java b/java/runjava/src/main/java/io/osv/ContextIsolator.java index 2c425e99a1954e1253c8cccc139efe6b739a9452..96e00504bb695319d077a66f4e840d482cbec1fe 100644 --- a/java/runjava/src/main/java/io/osv/ContextIsolator.java +++ b/java/runjava/src/main/java/io/osv/ContextIsolator.java @@ -60,8 +60,7 @@ public class ContextIsolator { ClassLoader originalSystemClassLoader = getOsvClassLoader().getParent(); masterContext = new Context(originalSystemClassLoader, System.getProperties()); - parentClassLoaderForIsolates = new TeeClassLoader( - new FilteringClassLoader(originalSystemClassLoader, "io.osv.")); + parentClassLoaderForIsolates = originalSystemClassLoader; installSystemPropertiesProxy(); } diff --git a/java/runjava/src/main/java/io/osv/FilteringClassLoader.java b/java/runjava/src/main/java/io/osv/FilteringClassLoader.java deleted file mode 100644 index 6c8c28a1af00394b4ed3a4186befcbf81363accc..0000000000000000000000000000000000000000 --- a/java/runjava/src/main/java/io/osv/FilteringClassLoader.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.osv; - -class FilteringClassLoader extends ClassLoader { - private final String allowedPrefix; - - public FilteringClassLoader(ClassLoader parent, String allowedPrefix) { - super(parent); - this.allowedPrefix = allowedPrefix; - } - - private boolean isClassAllowed(String name) { - return name.startsWith(allowedPrefix); - } - - @Override - protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { - if (!isClassAllowed(name)) { - throw new ClassNotFoundException(name); - } - return super.loadClass(name, resolve); - } -} diff --git a/java/runjava/src/main/java/io/osv/TeeClassLoader.java b/java/runjava/src/main/java/io/osv/TeeClassLoader.java deleted file mode 100644 index 1d98a3b83582767aa439d7e0cecfa91e65d6d21e..0000000000000000000000000000000000000000 --- a/java/runjava/src/main/java/io/osv/TeeClassLoader.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.osv; - -import java.io.IOException; -import java.net.URL; -import java.util.Enumeration; - -class TeeClassLoader extends ClassLoader { - private ClassLoader delegate; - - public TeeClassLoader(ClassLoader delegate) { - super(null); - this.delegate = delegate; - } - - @Override - protected Class<?> findClass(String name) throws ClassNotFoundException { - return delegate.loadClass(name); - } - - @Override - protected URL findResource(String name) { - return delegate.getResource(name); - } - - @Override - protected Enumeration<URL> findResources(String name) throws IOException { - return delegate.getResources(name); - } -} diff --git a/java/tests-jre-extension/pom.xml b/java/tests-jre-extension/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..84a861e5bd02ccf6d0efe86e64b369a959d91294 --- /dev/null +++ b/java/tests-jre-extension/pom.xml @@ -0,0 +1,19 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 + http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>io.osv</groupId> + <artifactId>java-parent</artifactId> + <version>${version}</version> + </parent> + + <artifactId>tests-jre-extension</artifactId> + <packaging>jar</packaging> + + <build> + <finalName>tests-jre-extension</finalName> + </build> +</project> diff --git a/java/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java b/java/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java new file mode 100644 index 0000000000000000000000000000000000000000..bc07386468818095c82e672011e76dedc0e9bcab --- /dev/null +++ b/java/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java @@ -0,0 +1,10 @@ +package tests; + +/* + * Copyright (C) 2014 Cloudius Systems, Ltd. + * + * This work is open source software, licensed under the terms of the + * BSD license as described in the LICENSE file in the top-level directory. + */ +public class SomeExtensionClass { +} diff --git a/java/tests/pom.xml b/java/tests/pom.xml index e34b357d428372a1e1e5f24111a5431ad5facc85..f359f43c1d8ed54ae4f98cac588f4adffe7f2613 100644 --- a/java/tests/pom.xml +++ b/java/tests/pom.xml @@ -31,6 +31,11 @@ <artifactId>runjava</artifactId> <scope>provided</scope> </dependency> + <dependency> + <groupId>io.osv</groupId> + <artifactId>tests-jre-extension</artifactId> + <scope>provided</scope> + </dependency> <dependency> <groupId>io.osv</groupId> <artifactId>tests-isolates</artifactId> @@ -81,23 +86,6 @@ </execution> </executions> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <testSourceDirectory>${basedir}/src/main/java/</testSourceDirectory> - <testClassesDirectory>target/classes</testClassesDirectory> - <argLine>-ea -Djava.system.class.loader=io.osv.OsvSystemClassLoader - -Djava.util.logging.manager=io.osv.jul.IsolatingLogManager - </argLine> - <systemProperties> - <property> - <name>isolates.jar</name> - <value>${io.osv:tests-isolates:jar:jar-with-dependencies}</value> - </property> - </systemProperties> - </configuration> - </plugin> </plugins> </build> </project> diff --git a/java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java b/java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java index f31d5d8a8fd0a0e6f51026467d58298f3b118ff0..df0b879440270f89257138949a8746108ca4a660 100644 --- a/java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java +++ b/java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java @@ -7,6 +7,7 @@ import java.util.concurrent.CyclicBarrier; import static io.osv.TestIsolateLaunching.runIsolate; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; /* * Copyright (C) 2014 Cloudius Systems, Ltd. @@ -66,4 +67,9 @@ public class ClassLoaderIsolationTest { } } } + + @Test + public void testClassesFromExtensionDirectoryCanBeLoaded() throws Exception { + assertNotNull(SomeExtensionClass.class); + } } diff --git a/modules/java-tests/module.py b/modules/java-tests/module.py index 3ff51677d07946b975e244ab60b4392d47cc08a2..828c8a6d75f5f0d35594ed4816c7a8dec11c0391 100644 --- a/modules/java-tests/module.py +++ b/modules/java-tests/module.py @@ -10,5 +10,8 @@ usr_files = FileMap() usr_files.add('${OSV_BASE}/java/tests/target/runjava-tests.jar').to(_jar) usr_files.add('${OSV_BASE}/java/tests-isolates/target/tests-isolates-jar-with-dependencies.jar').to(_isolates_jar) +usr_files.add('${OSV_BASE}/java/tests-jre-extension/target/tests-jre-extension.jar') \ + .to('/usr/lib/jvm/jre/lib/ext/tests-jre-extension.jar') + run_tests = api.run_java(classpath=[_jar, _isolates_jar], args=['-Disolates.jar=' + _isolates_jar, 'org.junit.runner.JUnitCore', 'io.osv.AllTests'])