lihaoyi test$ tree . └── Foo.scala 0 directories, 1 file lihaoyi test$ cat Foo.scala object Main{ def main(args: Array[String]): Unit = { println(getClass.getClassLoader.getResourceAsStream("java/lang/String.class")) println(getClass.getClassLoader.getClass) println(Thread.currentThread().getContextClassLoader.getResourceAsStream("java/lang/String.class")) println(Thread.currentThread().getContextClassLoader.getClass) } } lihaoyi test$ sbt run [info] Loading global plugins from /Users/lihaoyi/.sbt/0.13/plugins [info] Set current project to test (in build file:/Users/lihaoyi/Dropbox/Workspace/test/) [info] Updating {file:/Users/lihaoyi/Dropbox/Workspace/test/}test... [info] Resolving org.fusesource.jansi
Here we see that getClass.getClassLoader and Thread.currentThread.getContextClassLoader return different values. Moreover, Thread.currentThread.getContextClassLoader seems to refuse to load java/lang/String.class , and the other can.
Remarkably, when I run the jar file with an external tool like scalac / scala or java , both class loaders can load the class file as a resource
lihaoyi test$ scalac Foo.scala lihaoyi test$ scala Main sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@1b28 cdfa class scala.reflect.internal.util.ScalaClassLoader$URLClassLoader sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@7229 724f class scala.reflect.internal.util.ScalaClassLoader$URLClassLoader
I would expect the SBT to behave similarly: so that Main.getClass.getClassLoader and Thread.currentThread().getContextClassLoader could load java/lang/String.class as a resource. What gives?
source share