public void build(PhysicalClassLoaderDefinition definition) throws ClassLoaderBuilderException { URI uri = definition.getUri(); int count = tracker.increment(uri); ClassLoader classLoader = classLoaderRegistry.getClassLoader(uri); if (classLoader != null) { // The classloader was already loaded. The classloader will already be created if: it is the boot classloader; the environment is // single-VM as classloaders are shared between the contribution and runtime infrastructure; two composites are deployed individually // from the same contribution. for (PhysicalClassLoaderWireDefinition wireDefinition : definition.getWireDefinitions()) { URI target = wireDefinition.getTargetClassLoader(); classLoader = classLoaderRegistry.getClassLoader(target); tracker.incrementImported(classLoader); } notifyListenersBuild(count, classLoader); return; } if (info.supportsClassLoaderIsolation()) { buildIsolatedClassLoaderEnvironment(definition); } else { buildCommonClassLoaderEnvironment(definition); } notifyListenersBuild(count, classLoader); }
private void buildIsolatedClassLoaderEnvironment(PhysicalClassLoaderDefinition definition) throws ClassLoaderBuilderException { URI uri = definition.getUri(); // build the classloader using the locally cached resources ClassLoader hostClassLoader = classLoaderRegistry.getClassLoader(HOST_CONTRIBUTION); MultiParentClassLoader loader; if (definition.isProvisionArtifact()) { URL[] classpath = resolveClasspath(definition); loader = new MultiParentClassLoader(uri, classpath, hostClassLoader); setSysPathsField(loader); } else { loader = new MultiParentClassLoader(uri, hostClassLoader); } for (PhysicalClassLoaderWireDefinition wireDefinition : definition.getWireDefinitions()) { wireBuilder.build(loader, wireDefinition); URI target = wireDefinition.getTargetClassLoader(); ClassLoader classLoader = classLoaderRegistry.getClassLoader(target); tracker.incrementImported(classLoader); } classLoaderRegistry.register(uri, loader); }