diff options
author | Minghao Liu <molikto@gmail.com> | 2018-01-20 02:34:52 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-01-19 10:34:52 -0800 |
commit | 4e6a81f65413a973223627d406564c2bf4351c1e (patch) | |
tree | ae0308d6c3878530780d6669d6dfa5047aa101cf /scalalib | |
parent | a80201ad73fd9803da3a2e2d0a088766d4de4e1a (diff) | |
download | mill-4e6a81f65413a973223627d406564c2bf4351c1e.tar.gz mill-4e6a81f65413a973223627d406564c2bf4351c1e.tar.bz2 mill-4e6a81f65413a973223627d406564c2bf4351c1e.zip |
Run Main.main in current process (#115)
* no message
* fix compile
* fix compile again
* finishing in process running
* remove comment
* fix bug
* fix bug
Diffstat (limited to 'scalalib')
3 files changed, 37 insertions, 25 deletions
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" |