diff --git a/main/src/main/java/sbt/internal/FlatLoader.java b/main/src/main/java/sbt/internal/FlatLoader.java index 0c0b9682f..1ded2a242 100644 --- a/main/src/main/java/sbt/internal/FlatLoader.java +++ b/main/src/main/java/sbt/internal/FlatLoader.java @@ -7,6 +7,7 @@ package sbt.internal; +import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; @@ -29,4 +30,9 @@ final class FlatLoader extends URLClassLoader { } return "FlatLoader(\n parent = " + getParent() + "\n jars = " + jars.toString() + ")"; } + + @Override + public void close() throws IOException { + if (SysProp.closeClassLoaders()) super.close(); + } } diff --git a/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java b/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java index 7d9d4f679..2baff55bc 100644 --- a/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java +++ b/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java @@ -7,6 +7,7 @@ package sbt.internal; +import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; @@ -31,4 +32,9 @@ final class ScalaLibraryClassLoader extends URLClassLoader { } return "ScalaLibraryClassLoader(" + builder + " parent = " + getParent() + ")"; } + + @Override + public void close() throws IOException { + if (SysProp.closeClassLoaders()) super.close(); + } } diff --git a/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java b/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java index b8a3fff17..18461547b 100644 --- a/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java +++ b/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java @@ -7,6 +7,7 @@ package sbt.internal; +import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; @@ -26,4 +27,9 @@ final class ScalaReflectClassLoader extends URLClassLoader { public String toString() { return "ScalaReflectClassLoader(" + jar + " parent = " + getParent() + ")"; } + + @Override + public void close() throws IOException { + if (SysProp.closeClassLoaders()) super.close(); + } } diff --git a/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala b/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala index 74ec041f8..c8855bc25 100644 --- a/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala +++ b/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala @@ -31,6 +31,7 @@ private[internal] class LayeredClassLoaderImpl( ) extends URLClassLoader(classpath.map(_.toURI.toURL).toArray, parent) with NativeLoader { 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[_] = 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 = { checkin(parent) - super.close() + if (SysProp.closeClassLoaders) super.close() } } } diff --git a/main/src/main/scala/sbt/internal/SysProp.scala b/main/src/main/scala/sbt/internal/SysProp.scala index a56adf9ef..59d5e27bb 100644 --- a/main/src/main/scala/sbt/internal/SysProp.scala +++ b/main/src/main/scala/sbt/internal/SysProp.scala @@ -82,6 +82,8 @@ object SysProp { */ lazy val color: Boolean = ConsoleAppender.formatEnabledInEnv + def closeClassLoaders: Boolean = getOrTrue("sbt.classloader.close") + def supershell: Boolean = color && getOrTrue("sbt.supershell") def supershellSleep: Long = long("sbt.supershell.sleep", 100L)