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 138ec14c6..59d5e27bb 100644 --- a/main/src/main/scala/sbt/internal/SysProp.scala +++ b/main/src/main/scala/sbt/internal/SysProp.scala @@ -82,9 +82,11 @@ object SysProp { */ lazy val color: Boolean = ConsoleAppender.formatEnabledInEnv + def closeClassLoaders: Boolean = getOrTrue("sbt.classloader.close") + def supershell: Boolean = color && getOrTrue("sbt.supershell") - def supersheelSleep: Long = long("sbt.supershell.sleep", 100L) + def supershellSleep: Long = long("sbt.supershell.sleep", 100L) def defaultUseCoursier: Boolean = { val coursierOpt = booleanOpt("sbt.coursier") diff --git a/main/src/main/scala/sbt/internal/TaskProgress.scala b/main/src/main/scala/sbt/internal/TaskProgress.scala index dae694248..e249076f6 100644 --- a/main/src/main/scala/sbt/internal/TaskProgress.scala +++ b/main/src/main/scala/sbt/internal/TaskProgress.scala @@ -23,7 +23,7 @@ private[sbt] final class TaskProgress(log: ManagedLogger) with ExecuteProgress[Task] { private[this] val lastTaskCount = new AtomicInteger(0) private[this] val currentProgressThread = new AtomicReference[Option[ProgressThread]](None) - private[this] val sleepDuration = SysProp.supersheelSleep + private[this] val sleepDuration = SysProp.supershellSleep private[this] final class ProgressThread extends Thread("task-progress-report-thread") with AutoCloseable {