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#jansi;1.4 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/lihaoyi/Dropbox/Workspace/test/target/scala-2.10/classes...
[info] Running Main
[email protected]8ff2
class sbt.classpath.ClasspathUtilities$$anon$1
null
class sbt.classpath.ClasspathFilter
[success] Total time: 2 s, completed 29 May, 2017 4:14:11 PM
lihaoyi test$
在这里,我们可以看到getClass.getClassLoader
和Thread.currentThread.getContextClassLoader
返回不同的值。更重要的是,Thread.currentThread.getContextClassLoader
似乎拒绝加载java/lang/String.class
,而另一个可以。为什么SBT的线程上下文类加载器不能将JDK类文件加载为资源?
值得注意的是,当我运行使用像scalac
/scala
,或java
外部工具的jar文件,这两个类加载器能加载类文件作为资源
lihaoyi test$ scalac Foo.scala
lihaoyi test$ scala Main
[email protected]b28cdfa
class scala.reflect.internal.util.ScalaClassLoader$URLClassLoader
[email protected]724f
class scala.reflect.internal.util.ScalaClassLoader$URLClassLoader
我希望SBT同样的行为:使Main.getClass.getClassLoader
和Thread.currentThread().getContextClassLoader
都能够将java/lang/String.class
作为资源加载。是什么赋予了?