PIG-5387: Test failures on JRE 11
git-svn-id: https://svn.apache.org/repos/asf/pig/trunk@1859620 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/org/apache/pig/impl/plan/Operator.java b/src/org/apache/pig/impl/plan/Operator.java
index c64fec7..2a870a9 100644
--- a/src/org/apache/pig/impl/plan/Operator.java
+++ b/src/org/apache/pig/impl/plan/Operator.java
@@ -18,12 +18,9 @@
package org.apache.pig.impl.plan;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.io.Serializable;
-import java.lang.StringBuilder;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.pig.impl.plan.OperatorKey;
/**
* Base class for all types of operators.
@@ -152,7 +149,11 @@
return getProjectionMap();
}
-
+ // Added because on Java 11 while serializing the logical plan we hit JDK-8201131
+ private void readObject(ObjectInputStream in) throws ClassNotFoundException, IOException {
+ in.defaultReadObject();
+ }
+
/**
* Make any necessary changes to a node based on a change of position in the
* plan. This allows operators to rewire their projections, etc. when they
diff --git a/test/org/apache/pig/test/TestPigServer.java b/test/org/apache/pig/test/TestPigServer.java
index de5ed47..0f0de75 100644
--- a/test/org/apache/pig/test/TestPigServer.java
+++ b/test/org/apache/pig/test/TestPigServer.java
@@ -33,6 +33,7 @@
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
@@ -141,11 +142,26 @@
// dynamically add more resources to the system class loader
private static void registerNewResource(String file) throws Exception {
URL urlToAdd = new File(file).toURI().toURL();
- URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
- Method addMethod = URLClassLoader.class.
- getDeclaredMethod("addURL", new Class[]{URL.class});
- addMethod.setAccessible(true);
- addMethod.invoke(sysLoader, new Object[]{urlToAdd});
+ ClassLoader sysLoader = ClassLoader.getSystemClassLoader();
+ // Find the class loader below bootstrap class loader
+ // It is either the system class loader (first invocation), or the new URLClassLoader added below
+ while (sysLoader.getParent().getParent() != null) {
+ sysLoader = sysLoader.getParent();
+ }
+ // Check if this class loader is instance of URLClassLoader
+ // On Java 8 and before it is, add resources via addURL method
+ // On Java 11 and after it isn't, add a new URLClassLoader with the new resources above it
+ if (sysLoader instanceof URLClassLoader) {
+ Method addMethod = URLClassLoader.class.
+ getDeclaredMethod("addURL", new Class[]{URL.class});
+ addMethod.setAccessible(true);
+ addMethod.invoke(sysLoader, new Object[]{urlToAdd});
+ } else {
+ Field parent = ClassLoader.class.getDeclaredField("parent");
+ parent.setAccessible(true);
+ ClassLoader urlClassLoader = new URLClassLoader(new URL[]{urlToAdd}, ClassLoader.getSystemClassLoader().getParent());
+ parent.set(ClassLoader.getSystemClassLoader(), urlClassLoader);
+ }
}
/**
diff --git a/test/org/apache/pig/test/TestPigServerLocal.java b/test/org/apache/pig/test/TestPigServerLocal.java
index f50eac3..a3e5969 100644
--- a/test/org/apache/pig/test/TestPigServerLocal.java
+++ b/test/org/apache/pig/test/TestPigServerLocal.java
@@ -29,6 +29,7 @@
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
@@ -68,17 +69,6 @@
public void setUp() throws Exception{
tempDir = Files.createTempDir();
tempDir.deleteOnExit();
- registerNewResource(tempDir.getAbsolutePath());
- }
-
- // dynamically add more resources to the system class loader
- private static void registerNewResource(String file) throws Exception {
- URL urlToAdd = new File(file).toURI().toURL();
- URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
- Method addMethod = URLClassLoader.class.
- getDeclaredMethod("addURL", new Class[]{URL.class});
- addMethod.setAccessible(true);
- addMethod.invoke(sysLoader, new Object[]{urlToAdd});
}
@Test