Bug 507417 [java 9] cannot load java.* classes that are not contained in
the java.base module

Change-Id: I788208133cd71e4ce6bbdc92bea890a8cf7d5ce4
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/ContextFinder.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/ContextFinder.java
index 3be8491..7ce416c 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/ContextFinder.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/ContextFinder.java
@@ -46,7 +46,7 @@
 
 	public ContextFinder(ClassLoader contextClassLoader) {
 		super(contextClassLoader);
-		this.parentContextClassLoader = contextClassLoader != null ? contextClassLoader : new ClassLoader(Object.class.getClassLoader()) {/*boot classloader*/};
+		this.parentContextClassLoader = contextClassLoader != null ? contextClassLoader : EquinoxContainerAdaptor.BOOT_CLASSLOADER;
 	}
 
 	// Return a list of all classloaders on the stack that are neither the 
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java
index 5f42a20..db901c5 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainer.java
@@ -182,7 +182,7 @@
 			if (EquinoxConfiguration.CONTEXTCLASSLOADER_PARENT_APP.equals(type))
 				parent = ClassLoader.getSystemClassLoader();
 			else if (EquinoxConfiguration.CONTEXTCLASSLOADER_PARENT_BOOT.equals(type))
-				parent = null;
+				parent = EquinoxContainerAdaptor.BOOT_CLASSLOADER;
 			else if (EquinoxConfiguration.CONTEXTCLASSLOADER_PARENT_FWK.equals(type))
 				parent = EquinoxContainer.class.getClassLoader();
 			else if (EquinoxConfiguration.CONTEXTCLASSLOADER_PARENT_EXT.equals(type)) {
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainerAdaptor.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainerAdaptor.java
index 560392b..282bfb7 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainerAdaptor.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxContainerAdaptor.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.osgi.internal.framework;
 
+import java.lang.reflect.Method;
 import java.security.ProtectionDomain;
 import java.util.*;
 import java.util.concurrent.*;
@@ -29,7 +30,18 @@
 import org.osgi.framework.wiring.BundleRevision;
 
 public class EquinoxContainerAdaptor extends ModuleContainerAdaptor {
-	private static final ClassLoader BOOT_CLASSLOADER = new ClassLoader(Object.class.getClassLoader()) { /* boot class loader */};
+	public static final ClassLoader BOOT_CLASSLOADER;
+	static {
+		ClassLoader platformClassLoader = null;
+		try {
+			Method getPlatformClassLoader = ClassLoader.class.getMethod("getPlatformClassLoader"); //$NON-NLS-1$
+			platformClassLoader = (ClassLoader) getPlatformClassLoader.invoke(null);
+		} catch (Throwable t) {
+			// try everything possible to not fail <clinit>
+			platformClassLoader = new ClassLoader(Object.class.getClassLoader()) { /* boot class loader */};
+		}
+		BOOT_CLASSLOADER = platformClassLoader;
+	}
 	private final EquinoxContainer container;
 	private final Storage storage;
 	private final OSGiFrameworkHooks hooks;
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/buddy/SystemPolicy.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/buddy/SystemPolicy.java
index 8598376..7edefe1 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/buddy/SystemPolicy.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/buddy/SystemPolicy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2012 IBM Corporation and others.
+ * Copyright (c) 2005, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -15,15 +15,10 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.Enumeration;
+import org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor;
 
 public class SystemPolicy implements IBuddyPolicy {
 
-	private static class ParentClassLoader extends ClassLoader {
-		protected ParentClassLoader() {
-			super(Object.class.getClassLoader());
-		}
-	}
-
 	public static final byte BOOT = 0;
 	public static final byte EXT = 1;
 	public static final byte APP = 2;
@@ -57,15 +52,15 @@
 			case APP :
 				if (ClassLoader.getSystemClassLoader() != null)
 					return ClassLoader.getSystemClassLoader();
-				return new ParentClassLoader();
+				return EquinoxContainerAdaptor.BOOT_CLASSLOADER;
 
 			case BOOT :
-				return new ParentClassLoader();
+				return EquinoxContainerAdaptor.BOOT_CLASSLOADER;
 
 			case EXT :
 				if (ClassLoader.getSystemClassLoader() != null)
 					return ClassLoader.getSystemClassLoader().getParent();
-				return new ParentClassLoader();
+				return EquinoxContainerAdaptor.BOOT_CLASSLOADER;
 		}
 		return null;
 	}