From 4e6a81f65413a973223627d406564c2bf4351c1e Mon Sep 17 00:00:00 2001 From: Minghao Liu Date: Sat, 20 Jan 2018 02:34:52 +0800 Subject: Run Main.main in current process (#115) * no message * fix compile * fix compile again * finishing in process running * remove comment * fix bug * fix bug --- .../src/main/scala/mill/scalalib/ScalaModule.scala | 12 ++++++++-- .../src/main/scala/mill/scalalib/TestRunner.scala | 26 +++------------------- .../test/scala/mill/scalalib/HelloWorldTests.scala | 24 ++++++++++++++++++++ 3 files changed, 37 insertions(+), 25 deletions(-) (limited to 'scalalib') diff --git a/scalalib/src/main/scala/mill/scalalib/ScalaModule.scala b/scalalib/src/main/scala/mill/scalalib/ScalaModule.scala index 5bae1749..1b2bd28d 100644 --- a/scalalib/src/main/scala/mill/scalalib/ScalaModule.scala +++ b/scalalib/src/main/scala/mill/scalalib/ScalaModule.scala @@ -7,7 +7,7 @@ import mill.define.{Cross, Task} import mill.define.TaskModule import mill.eval.{PathRef, Result} import mill.modules.Jvm -import mill.modules.Jvm.{createAssembly, createJar, interactiveSubprocess, subprocess} +import mill.modules.Jvm.{createAssembly, createJar, interactiveSubprocess, subprocess, inprocess} import Lib._ import mill.define.Cross.Resolver import mill.util.Loose.Agg @@ -217,7 +217,15 @@ trait ScalaModule extends mill.Module with TaskModule { outer => def forkArgs = T{ Seq.empty[String] } - def run(args: String*) = T.command{ + + def run(args: String*) = T.command { + inprocess( + mainClass().getOrElse(throw new RuntimeException("No mainClass provided!")), + runClasspath().map(_.path), + args) + } + + def forkRun(args: String*) = T.command{ subprocess( mainClass().getOrElse(throw new RuntimeException("No mainClass provided!")), runClasspath().map(_.path), diff --git a/scalalib/src/main/scala/mill/scalalib/TestRunner.scala b/scalalib/src/main/scala/mill/scalalib/TestRunner.scala index 11d9c79f..fa387eef 100644 --- a/scalalib/src/main/scala/mill/scalalib/TestRunner.scala +++ b/scalalib/src/main/scala/mill/scalalib/TestRunner.scala @@ -7,6 +7,7 @@ import java.util.zip.ZipInputStream import ammonite.ops.{Path, ls, pwd} import ammonite.util.Colors +import mill.modules.Jvm import mill.util.Ctx.LogCtx import mill.util.{PrintLogger} import mill.util.Loose.Agg @@ -74,23 +75,7 @@ object TestRunner { testClassfilePath: Agg[Path], args: Seq[String]) (implicit ctx: LogCtx): (String, Seq[Result]) = { - val outerClassLoader = getClass.getClassLoader - - val cl = new URLClassLoader( - entireClasspath.map(_.toIO.toURI.toURL).toArray, - ClassLoader.getSystemClassLoader().getParent()){ - override def findClass(name: String) = { - if (name.startsWith("sbt.testing.")){ - outerClassLoader.loadClass(name) - }else{ - super.findClass(name) - } - } - } - - val oldCl = Thread.currentThread().getContextClassLoader - Thread.currentThread().setContextClassLoader(cl) - try { + Jvm.inprocess(entireClasspath, classLoaderOverrideSbtTesting = true, cl => { val framework = cl.loadClass(frameworkName) .newInstance() .asInstanceOf[sbt.testing.Framework] @@ -145,12 +130,7 @@ object TestRunner { ) } (doneMsg, results) - }finally{ - Thread.currentThread().setContextClassLoader(oldCl) - cl.close() - } - - + }) } case class Result(fullyQualifiedName: String, diff --git a/scalalib/src/test/scala/mill/scalalib/HelloWorldTests.scala b/scalalib/src/test/scala/mill/scalalib/HelloWorldTests.scala index 70c78cee..7444604b 100644 --- a/scalalib/src/test/scala/mill/scalalib/HelloWorldTests.scala +++ b/scalalib/src/test/scala/mill/scalalib/HelloWorldTests.scala @@ -262,6 +262,30 @@ object HelloWorldTests extends TestSuite { ) } } + + 'forkRun - { + 'runIfMainClassProvided - { + val runResult = basePath / 'out / 'run / 'dest / "hello-mill" + val Right((_, evalCount)) = helloWorldWithMainEvaluator( + HelloWorldWithMain.forkRun(runResult.toString) + ) + + assert(evalCount > 0) + + + assert( + exists(runResult), + read(runResult) == "hello rockjam, your age is: 25" + ) + } + 'notRunWithoutMainClass - { + val Left(Result.Exception(err, _)) = helloWorldEvaluator(HelloWorld.forkRun()) + + assert( + err.isInstanceOf[RuntimeException] + ) + } + } 'run - { 'runIfMainClassProvided - { val runResult = basePath / 'out / 'run / 'dest / "hello-mill" -- cgit v1.2.3