summaryrefslogtreecommitdiff
path: root/core/src/main/scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-12-06 20:53:29 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-12-06 20:54:04 -0800
commit7239d6bd64ec0d025686f5f97aaaf94b7ab43951 (patch)
treeada5a410d1ee7d658d98e3b57e4188d013109451 /core/src/main/scala
parent7a1b339b08a7e6b99da7d98b1856d534c207c99e (diff)
downloadmill-7239d6bd64ec0d025686f5f97aaaf94b7ab43951.tar.gz
mill-7239d6bd64ec0d025686f5f97aaaf94b7ab43951.tar.bz2
mill-7239d6bd64ec0d025686f5f97aaaf94b7ab43951.zip
Explicitly pass built compiler-bridge jar locations from the build system into Mill as JVM properties.
This makes the dependency between the compiler-bridge jar and the Mill executable explicit, allowing us to swap out the locations compiler-bridge jars (which end up in different places, depending on whether you're building with SBT or Mill) or eventually making them load from Maven Central in a "release" Mill executable Since Mill (and uTest) both do not support SBT-style test arguments, we need to use `forkTest` instead of `test` to run the Mill tests passing the compiler-jar locations as JVM props. This necessitated some fixes to make `forkTest` behave properly
Diffstat (limited to 'core/src/main/scala')
-rw-r--r--core/src/main/scala/mill/modules/Jvm.scala24
1 files changed, 22 insertions, 2 deletions
diff --git a/core/src/main/scala/mill/modules/Jvm.scala b/core/src/main/scala/mill/modules/Jvm.scala
index 43382b8d..ddc8b427 100644
--- a/core/src/main/scala/mill/modules/Jvm.scala
+++ b/core/src/main/scala/mill/modules/Jvm.scala
@@ -1,6 +1,7 @@
package mill.modules
import java.io.FileOutputStream
+import java.net.URLClassLoader
import java.nio.file.attribute.PosixFilePermission
import java.util.jar.{JarEntry, JarFile, JarOutputStream}
@@ -14,16 +15,35 @@ import scala.collection.mutable
object Jvm {
-
+ def gatherClassloaderJars(): Seq[Path] = {
+ val allJars = collection.mutable.Buffer.empty[Path]
+ var currentClassloader = Thread.currentThread().getContextClassLoader
+ while(currentClassloader != null){
+ currentClassloader match{
+ case u: URLClassLoader => allJars.appendAll(u.getURLs.map(x => Path(x.getFile)))
+ case _ =>
+ }
+ currentClassloader = currentClassloader.getParent
+ }
+ allJars
+ }
def subprocess(mainClass: String,
classPath: Seq[Path],
+ jvmOptions: Seq[String] = Seq.empty,
options: Seq[String] = Seq.empty,
workingDir: Path = ammonite.ops.pwd)
(implicit ctx: Ctx) = {
+
+ val commandArgs =
+ Vector("java") ++
+ jvmOptions ++
+ Vector("-cp", classPath.mkString(":"), mainClass) ++
+ options
+
val proc =
new java.lang.ProcessBuilder()
.directory(workingDir.toIO)
- .command(Vector("java", "-cp", classPath.mkString(":"), mainClass) ++ options:_*)
+ .command(commandArgs:_*)
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE)
.start()