diff --git a/core/src/main/java/org/apache/spark/util/ParentClassLoader.java b/core/src/main/java/org/apache/spark/util/ParentClassLoader.java index e0eb8429e139f..8417f2281613f 100644 --- a/core/src/main/java/org/apache/spark/util/ParentClassLoader.java +++ b/core/src/main/java/org/apache/spark/util/ParentClassLoader.java @@ -27,6 +27,11 @@ public ParentClassLoader(ClassLoader myParent) { @Override public Class findClass(String name) throws ClassNotFoundException { - return super.findClass(name); + return super.loadClass(name); + } + + @Override + public Class loadClass(String name) throws ClassNotFoundException { + return super.loadClass(name); } } diff --git a/core/src/test/resources/classes2/META-INF/MANIFEST.MF b/core/src/test/resources/classes2/META-INF/MANIFEST.MF new file mode 100644 index 0000000000000..21d9cb5ec34ad --- /dev/null +++ b/core/src/test/resources/classes2/META-INF/MANIFEST.MF @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +Implementation-Vendor: fake-spark-class +Implementation-Title: fake spark class +Implementation-Version: 0.0.1 +Implementation-Vendor-Id: fake-spark-class +Specification-Vendor: fake-spark-class +Specification-Title: fake spark class +Specification-Version: 0.0.1 + diff --git a/core/src/test/resources/classes2/org/apache/spark/test/FakeClass1.class b/core/src/test/resources/classes2/org/apache/spark/test/FakeClass1.class new file mode 100644 index 0000000000000..31685294a6a00 Binary files /dev/null and b/core/src/test/resources/classes2/org/apache/spark/test/FakeClass1.class differ diff --git a/core/src/test/resources/classes2/org/apache/spark/test/FakeClass2.class b/core/src/test/resources/classes2/org/apache/spark/test/FakeClass2.class new file mode 100644 index 0000000000000..0babf0fe7085b Binary files /dev/null and b/core/src/test/resources/classes2/org/apache/spark/test/FakeClass2.class differ diff --git a/core/src/test/resources/classes2/org/apache/spark/test/FakeClass3.class b/core/src/test/resources/classes2/org/apache/spark/test/FakeClass3.class new file mode 100644 index 0000000000000..19aaf0a24d7f2 Binary files /dev/null and b/core/src/test/resources/classes2/org/apache/spark/test/FakeClass3.class differ diff --git a/core/src/test/resources/fake-spark-class-2.jar b/core/src/test/resources/fake-spark-class-2.jar index 2c9b3493d6e28..3cb803cfce552 100644 Binary files a/core/src/test/resources/fake-spark-class-2.jar and b/core/src/test/resources/fake-spark-class-2.jar differ diff --git a/core/src/test/scala/org/apache/spark/executor/ExecutorURLClassLoaderSuite.scala b/core/src/test/scala/org/apache/spark/executor/ExecutorURLClassLoaderSuite.scala index 793b8b5db3e7c..a931ad9c926da 100644 --- a/core/src/test/scala/org/apache/spark/executor/ExecutorURLClassLoaderSuite.scala +++ b/core/src/test/scala/org/apache/spark/executor/ExecutorURLClassLoaderSuite.scala @@ -27,6 +27,7 @@ class ExecutorURLClassLoaderSuite extends FunSuite { val spark_home = sys.env.get("SPARK_HOME").orElse(sys.props.get("spark.home")).get val urls = List(new File(spark_home + "/core/src/test/resources/fake-spark-class.jar").toURI.toURL).toArray val urls2 = List(new File(spark_home + "/core/src/test/resources/fake-spark-class-2.jar").toURI.toURL).toArray + test("child first") { val parentLoader = new URLClassLoader(urls2, null) val classLoader = new ChildExecutorURLClassLoader(urls, parentLoader) @@ -42,4 +43,13 @@ class ExecutorURLClassLoaderSuite extends FunSuite { val fakeClassVersion = fakeClass.toString assert(fakeClassVersion === "2") } + + test("child first can fall back") { + val parentLoader = new URLClassLoader(urls2, null) + val classLoader = new ChildExecutorURLClassLoader(urls, parentLoader) + val fakeClass = classLoader.loadClass("org.apache.spark.test.FakeClass3").newInstance() + val fakeClassVersion = fakeClass.toString + assert(fakeClassVersion === "2") + } + } diff --git a/repl/src/test/scala/org/apache/spark/repl/ExecutorClassLoaderSuite.scala b/repl/src/test/scala/org/apache/spark/repl/ExecutorClassLoaderSuite.scala index fcf0fb7decf0b..e60c20b7522ea 100644 --- a/repl/src/test/scala/org/apache/spark/repl/ExecutorClassLoaderSuite.scala +++ b/repl/src/test/scala/org/apache/spark/repl/ExecutorClassLoaderSuite.scala @@ -43,4 +43,14 @@ class ExecutorClassLoaderSuite extends FunSuite { val fakeClassVersion = fakeClass.toString assert(fakeClassVersion === "2") } + + test("child first can fall back") { + println("url1 "+url1) + val parentLoader = new URLClassLoader(urls2, null) + val classLoader = new ExecutorClassLoader(url1, parentLoader, true) + val fakeClass = classLoader.loadClass("org.apache.spark.test.FakeClass3").newInstance() + val fakeClassVersion = fakeClass.toString + assert(fakeClassVersion === "2") + } + }