mirror of https://github.com/sbt/sbt.git
Close test and run classloaders
It's good practice to call close on a URLClassLoader when we're done with it.
This commit is contained in:
parent
8ef5a67b64
commit
a4f1d23d71
|
|
@ -8,7 +8,7 @@
|
||||||
package sbt
|
package sbt
|
||||||
|
|
||||||
import java.io.{ File, PrintWriter }
|
import java.io.{ File, PrintWriter }
|
||||||
import java.net.{ URI, URL }
|
import java.net.{ URI, URL, URLClassLoader }
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
import java.util.concurrent.{ Callable, TimeUnit }
|
import java.util.concurrent.{ Callable, TimeUnit }
|
||||||
|
|
||||||
|
|
@ -787,9 +787,14 @@ object Defaults extends BuildCommon {
|
||||||
// ((streams in test, loadedTestFrameworks, testLoader, testGrouping in test, testExecution in test, fullClasspath in test, javaHome in test, testForkedParallel, javaOptions in test) flatMap allTestGroupsTask).value,
|
// ((streams in test, loadedTestFrameworks, testLoader, testGrouping in test, testExecution in test, fullClasspath in test, javaHome in test, testForkedParallel, javaOptions in test) flatMap allTestGroupsTask).value,
|
||||||
testResultLogger in (Test, test) :== TestResultLogger.SilentWhenNoTests, // https://github.com/sbt/sbt/issues/1185
|
testResultLogger in (Test, test) :== TestResultLogger.SilentWhenNoTests, // https://github.com/sbt/sbt/issues/1185
|
||||||
test := {
|
test := {
|
||||||
|
val loader = testLoader.value match { case u: URLClassLoader => Some(u); case _ => None }
|
||||||
val trl = (testResultLogger in (Test, test)).value
|
val trl = (testResultLogger in (Test, test)).value
|
||||||
val taskName = Project.showContextKey(state.value).show(resolvedScoped.value)
|
val taskName = Project.showContextKey(state.value).show(resolvedScoped.value)
|
||||||
trl.run(streams.value.log, executeTests.value, taskName)
|
try {
|
||||||
|
trl.run(streams.value.log, executeTests.value, taskName)
|
||||||
|
} finally {
|
||||||
|
loader.foreach(_.close())
|
||||||
|
}
|
||||||
},
|
},
|
||||||
testOnly := inputTests(testOnly).evaluated,
|
testOnly := inputTests(testOnly).evaluated,
|
||||||
testQuick := inputTests(testQuick).evaluated
|
testQuick := inputTests(testQuick).evaluated
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,15 @@ package sbt
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.lang.reflect.{ Method, Modifier }
|
import java.lang.reflect.{ Method, Modifier }
|
||||||
import Modifier.{ isPublic, isStatic }
|
import Modifier.{ isPublic, isStatic }
|
||||||
|
|
||||||
import sbt.internal.inc.classpath.ClasspathUtilities
|
import sbt.internal.inc.classpath.ClasspathUtilities
|
||||||
import sbt.internal.inc.ScalaInstance
|
import sbt.internal.inc.ScalaInstance
|
||||||
import sbt.internal.util.MessageOnlyException
|
import sbt.internal.util.MessageOnlyException
|
||||||
|
|
||||||
import sbt.io.Path
|
import sbt.io.Path
|
||||||
|
|
||||||
import sbt.util.Logger
|
import sbt.util.Logger
|
||||||
import scala.util.{ Try, Success, Failure }
|
|
||||||
|
import scala.reflect.internal.util.ScalaClassLoader.URLClassLoader
|
||||||
|
import scala.util.{ Failure, Success, Try }
|
||||||
import scala.util.control.NonFatal
|
import scala.util.control.NonFatal
|
||||||
import scala.sys.process.Process
|
import scala.sys.process.Process
|
||||||
|
|
||||||
|
|
@ -90,8 +91,15 @@ class Run(newLoader: Seq[File] => ClassLoader, trapExit: Boolean) extends ScalaR
|
||||||
): Unit = {
|
): Unit = {
|
||||||
log.debug(" Classpath:\n\t" + classpath.mkString("\n\t"))
|
log.debug(" Classpath:\n\t" + classpath.mkString("\n\t"))
|
||||||
val loader = newLoader(classpath)
|
val loader = newLoader(classpath)
|
||||||
val main = getMainMethod(mainClassName, loader)
|
try {
|
||||||
invokeMain(loader, main, options)
|
val main = getMainMethod(mainClassName, loader)
|
||||||
|
invokeMain(loader, main, options)
|
||||||
|
} finally {
|
||||||
|
loader match {
|
||||||
|
case u: URLClassLoader => u.close()
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
private def invokeMain(
|
private def invokeMain(
|
||||||
loader: ClassLoader,
|
loader: ClassLoader,
|
||||||
|
|
|
||||||
|
|
@ -48,9 +48,10 @@ Provided by:
|
||||||
Defined at:
|
Defined at:
|
||||||
\t(sbt.Defaults.testTasks) Defaults.scala:670
|
\t(sbt.Defaults.testTasks) Defaults.scala:670
|
||||||
Dependencies:
|
Dependencies:
|
||||||
\tTest / executeTests
|
|
||||||
\tTest / test / streams
|
|
||||||
\tTest / state
|
\tTest / state
|
||||||
|
\tTest / testLoader
|
||||||
|
\tTest / test / streams
|
||||||
|
\tTest / executeTests
|
||||||
\tTest / test / testResultLogger
|
\tTest / test / testResultLogger
|
||||||
Delegates:
|
Delegates:
|
||||||
\tTest / test
|
\tTest / test
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue