From b560ef280e0f8aaa358ed262cc1d98702eb630d5 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Fri, 5 Apr 2013 09:02:24 -0400 Subject: [PATCH] Fork run directly with 'java' to avoid additional class loader from 'scala' command. Fixes #702. --- run/src/main/scala/sbt/Run.scala | 3 ++- sbt/src/sbt-test/run/fork-loader/CheckLoader.scala | 8 ++++++++ sbt/src/sbt-test/run/fork-loader/build.sbt | 5 +++++ .../run/fork-loader/src/test/scala/TestForked.scala | 8 ++++++++ sbt/src/sbt-test/run/fork-loader/test | 6 ++++++ 5 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 sbt/src/sbt-test/run/fork-loader/CheckLoader.scala create mode 100644 sbt/src/sbt-test/run/fork-loader/build.sbt create mode 100644 sbt/src/sbt-test/run/fork-loader/src/test/scala/TestForked.scala create mode 100644 sbt/src/sbt-test/run/fork-loader/test diff --git a/run/src/main/scala/sbt/Run.scala b/run/src/main/scala/sbt/Run.scala index cc33acc49..1166c3239 100644 --- a/run/src/main/scala/sbt/Run.scala +++ b/run/src/main/scala/sbt/Run.scala @@ -24,7 +24,8 @@ class ForkRun(config: ForkOptions) extends ScalaRun val scalaOptions = classpathOption(classpath) ::: mainClass :: options.toList val configLogged = if(config.outputStrategy.isDefined) config else config.copy(outputStrategy = Some(LoggedOutput(log))) - val process = Fork.scala.fork(configLogged, scalaOptions) + // fork with Java because Scala introduces an extra class loader (#702) + val process = Fork.java.fork(configLogged, scalaOptions) def cancel() = { log.warn("Run canceled.") process.destroy() diff --git a/sbt/src/sbt-test/run/fork-loader/CheckLoader.scala b/sbt/src/sbt-test/run/fork-loader/CheckLoader.scala new file mode 100644 index 000000000..6bdc95a81 --- /dev/null +++ b/sbt/src/sbt-test/run/fork-loader/CheckLoader.scala @@ -0,0 +1,8 @@ +object CheckLoader { + def main(args: Array[String]) { apply() } + def apply() { + val loader = getClass.getClassLoader + val appLoader = ClassLoader.getSystemClassLoader + assert(loader eq appLoader, "Application classes not loaded in the system class loader") + } +} \ No newline at end of file diff --git a/sbt/src/sbt-test/run/fork-loader/build.sbt b/sbt/src/sbt-test/run/fork-loader/build.sbt new file mode 100644 index 000000000..a542a2d90 --- /dev/null +++ b/sbt/src/sbt-test/run/fork-loader/build.sbt @@ -0,0 +1,5 @@ +name := "forked-test" + +organization := "org.example" + +libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.10.0" % "test" \ No newline at end of file diff --git a/sbt/src/sbt-test/run/fork-loader/src/test/scala/TestForked.scala b/sbt/src/sbt-test/run/fork-loader/src/test/scala/TestForked.scala new file mode 100644 index 000000000..cb1b191dc --- /dev/null +++ b/sbt/src/sbt-test/run/fork-loader/src/test/scala/TestForked.scala @@ -0,0 +1,8 @@ +import org.scalacheck._ + +object TestForked extends Properties("Forked loader") { + property("Loaded from application loader") = Prop.secure { + CheckLoader() + true + } +} \ No newline at end of file diff --git a/sbt/src/sbt-test/run/fork-loader/test b/sbt/src/sbt-test/run/fork-loader/test new file mode 100644 index 000000000..e2928bd3b --- /dev/null +++ b/sbt/src/sbt-test/run/fork-loader/test @@ -0,0 +1,6 @@ +# This test verifies that the forked code is loaded in the application class loader. +-> run +-> test +> set fork := true +> run +> test \ No newline at end of file