Use named loader for ScalaLibrary

I'd already made a ScalaReflect loader and it makes sense to have a
ScalaLibraryClassLoader as well.
This commit is contained in:
Ethan Atkins 2019-06-06 17:18:01 -07:00
parent af0cfc9740
commit 66d3d8d504
2 changed files with 41 additions and 1 deletions

View File

@ -0,0 +1,34 @@
/*
* sbt
* Copyright 2011 - 2018, Lightbend, Inc.
* Copyright 2008 - 2010, Mark Harrah
* Licensed under Apache License 2.0 (see LICENSE)
*/
package sbt.internal;
import java.net.URL;
import java.net.URLClassLoader;
final class ScalaLibraryClassLoader extends URLClassLoader {
static {
ClassLoader.registerAsParallelCapable();
}
private final URL[] jars;
ScalaLibraryClassLoader(final URL[] jars, final ClassLoader parent) {
super(jars, parent);
this.jars = jars;
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
for (int i = 0; i < jars.length; ++ i) {
builder.append(jars[i].toString());
if (i < jars.length - 2) builder.append(", ");
}
return "ScalaLibraryClassLoader(" + builder + " parent = " + getParent() + ")";
}
}

View File

@ -133,7 +133,13 @@ private[sbt] object ClassLoaders {
case _: AllLibraryJars => true
case _ => false
}
val scalaLibraryLayer = layer(si.libraryJars, interfaceLoader, cache, resources, tmp)
val scalaLibraryLayer = {
cache.apply(
si.libraryJars.map(j => j -> IO.getModifiedTimeOrZero(j)).toList,
interfaceLoader,
() => new ScalaLibraryClassLoader(si.libraryJars.map(_.toURI.toURL), interfaceLoader)
)
}
val cpFiles = fullCP.map(_._1)
val scalaReflectJar = allDependencies.collectFirst {