From e7ac7323693edbdc350ec36b578ba3e101657360 Mon Sep 17 00:00:00 2001 From: Robby Date: Mon, 19 Mar 2018 10:13:03 -0500 Subject: Java 9 optimization by caching rt.jar (#239) * Upgraded Ammonite to 1.0.5-7-f032887 that includes a Java 9 performance optimization for mill's client-server mode (lihaoyi/Ammonite#773). * Java 9 optimization for interactive mode by caching rt.jar. * Refactored based on @lihaoyi's comments on #239. * Removed client side rt.jar caching. * Propagatio of home path from Cli. * Propagation, propagation, propagation! --- core/src/mill/eval/Evaluator.scala | 6 ++++-- core/src/mill/util/ClassLoader.scala | 11 +++++++++-- core/src/mill/util/Ctx.scala | 11 +++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) (limited to 'core/src') diff --git a/core/src/mill/eval/Evaluator.scala b/core/src/mill/eval/Evaluator.scala index e61c2c4c..1e1b8b35 100644 --- a/core/src/mill/eval/Evaluator.scala +++ b/core/src/mill/eval/Evaluator.scala @@ -26,7 +26,8 @@ case class Labelled[T](task: NamedTask[T], case _ => None } } -case class Evaluator[T](outPath: Path, +case class Evaluator[T](home: Path, + outPath: Path, externalOutPath: Path, rootModule: mill.define.BaseModule, log: Logger, @@ -265,7 +266,8 @@ case class Evaluator[T](outPath: Path, throw new Exception("No `dest` folder available here") } }, - multiLogger + multiLogger, + home ) val out = System.out diff --git a/core/src/mill/util/ClassLoader.scala b/core/src/mill/util/ClassLoader.scala index a1b42158..b53150c2 100644 --- a/core/src/mill/util/ClassLoader.scala +++ b/core/src/mill/util/ClassLoader.scala @@ -5,7 +5,9 @@ import java.net.{URL, URLClassLoader} import io.github.retronym.java9rtexport.Export object ClassLoader { - def create(urls: Seq[URL], parent: java.lang.ClassLoader): URLClassLoader = { + def create(urls: Seq[URL], + parent: java.lang.ClassLoader) + (implicit ctx: Ctx.Home): URLClassLoader = { val cl = new URLClassLoader(urls.toArray, parent) if (!ammonite.util.Util.java9OrAbove) return cl try { @@ -13,7 +15,12 @@ object ClassLoader { cl } catch { case _: ClassNotFoundException => - new URLClassLoader((urls ++ Some(Export.export().toURI.toURL)).toArray, parent) + val path = ctx.home + val rtFile = new java.io.File(path.toIO, s"rt-${System.getProperty("java.version")}.jar") + if (!rtFile.exists) { + java.nio.file.Files.copy(Export.export().toPath, rtFile.toPath) + } + new URLClassLoader((urls ++ Some(rtFile.toURI.toURL)).toArray, parent) } } } diff --git a/core/src/mill/util/Ctx.scala b/core/src/mill/util/Ctx.scala index 55cc05ab..99818194 100644 --- a/core/src/mill/util/Ctx.scala +++ b/core/src/mill/util/Ctx.scala @@ -20,6 +20,9 @@ object Ctx{ trait Log{ def log: Logger } + trait Home{ + def home: Path + } object Log{ implicit def logToCtx(l: Logger): Log = new Log { def log = l } } @@ -27,13 +30,17 @@ object Ctx{ def args: IndexedSeq[_] } + def defaultHome = ammonite.ops.home / ".mill" / "ammonite" + } class Ctx(val args: IndexedSeq[_], dest0: () => Path, - val log: Logger) + val log: Logger, + val home: Path) extends Ctx.Dest with Ctx.Log - with Ctx.Args{ + with Ctx.Args + with Ctx.Home{ def dest = dest0() def length = args.length -- cgit v1.2.3