Add system property for closing classloaders

I realized that some builds may crash if we automatically close the
classloaders. While I do think that is a good thing in general that we
are closing the loaders by default, we shuold have an option for
supressing this behavior.

I made all of the custom classloaders that we define for test and run
check this property before calling the super.close method.
This commit is contained in:
Ethan Atkins 2019-06-08 14:28:10 -07:00
parent a6bc7b1c76
commit a38d2669e1
5 changed files with 23 additions and 1 deletions

View File

@ -7,6 +7,7 @@
package sbt.internal; package sbt.internal;
import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
@ -29,4 +30,9 @@ final class FlatLoader extends URLClassLoader {
} }
return "FlatLoader(\n parent = " + getParent() + "\n jars = " + jars.toString() + ")"; return "FlatLoader(\n parent = " + getParent() + "\n jars = " + jars.toString() + ")";
} }
@Override
public void close() throws IOException {
if (SysProp.closeClassLoaders()) super.close();
}
} }

View File

@ -7,6 +7,7 @@
package sbt.internal; package sbt.internal;
import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
@ -31,4 +32,9 @@ final class ScalaLibraryClassLoader extends URLClassLoader {
} }
return "ScalaLibraryClassLoader(" + builder + " parent = " + getParent() + ")"; return "ScalaLibraryClassLoader(" + builder + " parent = " + getParent() + ")";
} }
@Override
public void close() throws IOException {
if (SysProp.closeClassLoaders()) super.close();
}
} }

View File

@ -7,6 +7,7 @@
package sbt.internal; package sbt.internal;
import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
@ -26,4 +27,9 @@ final class ScalaReflectClassLoader extends URLClassLoader {
public String toString() { public String toString() {
return "ScalaReflectClassLoader(" + jar + " parent = " + getParent() + ")"; return "ScalaReflectClassLoader(" + jar + " parent = " + getParent() + ")";
} }
@Override
public void close() throws IOException {
if (SysProp.closeClassLoaders()) super.close();
}
} }

View File

@ -31,6 +31,7 @@ private[internal] class LayeredClassLoaderImpl(
) extends URLClassLoader(classpath.map(_.toURI.toURL).toArray, parent) ) extends URLClassLoader(classpath.map(_.toURI.toURL).toArray, parent)
with NativeLoader { with NativeLoader {
setTempDir(tempDir) setTempDir(tempDir)
override def close(): Unit = if (SysProp.closeClassLoaders) super.close()
} }
/** /**
@ -146,6 +147,7 @@ private[internal] final class ReverseLookupClassLoaderHolder(
} }
override def loadClass(name: String, resolve: Boolean): Class[_] = override def loadClass(name: String, resolve: Boolean): Class[_] =
loadClass(name, resolve, reverseLookup = true) loadClass(name, resolve, reverseLookup = true)
override def close(): Unit = if (SysProp.closeClassLoaders) super.close()
} }
/** /**
@ -193,7 +195,7 @@ private[internal] final class ReverseLookupClassLoaderHolder(
} }
override def close(): Unit = { override def close(): Unit = {
checkin(parent) checkin(parent)
super.close() if (SysProp.closeClassLoaders) super.close()
} }
} }
} }

View File

@ -82,6 +82,8 @@ object SysProp {
*/ */
lazy val color: Boolean = ConsoleAppender.formatEnabledInEnv lazy val color: Boolean = ConsoleAppender.formatEnabledInEnv
def closeClassLoaders: Boolean = getOrTrue("sbt.classloader.close")
def supershell: Boolean = color && getOrTrue("sbt.supershell") def supershell: Boolean = color && getOrTrue("sbt.supershell")
def supershellSleep: Long = long("sbt.supershell.sleep", 100L) def supershellSleep: Long = long("sbt.supershell.sleep", 100L)