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$
Ở đây, chúng ta có thể thấy rằng getClass.getClassLoader
và Thread.currentThread.getContextClassLoader
đang trả về các giá trị khác nhau. Hơn nữa, các Thread.currentThread.getContextClassLoader
dường như từ chối để tải java/lang/String.class
, trong khi khác có thể.Tại sao trình nạp lớp ngữ cảnh chủ đề của SBT không tải được các tệp lớp JDK làm tài nguyên?
Đáng chú ý, khi tôi chạy file jar sử dụng một công cụ bên ngoài như scalac
/scala
, hoặc java
, cả classloaders có thể tải các classfile như một nguồn lực
lihaoyi test$ scalac Foo.scala
lihaoyi test$ scala Main
[email protected]cdfa
class scala.reflect.internal.util.ScalaClassLoader$URLClassLoader
[email protected]724f
class scala.reflect.internal.util.ScalaClassLoader$URLClassLoader
Tôi mong chờ SBT để hành xử tương tự: để có Main.getClass.getClassLoader
và Thread.currentThread().getContextClassLoader
cả hai đều có thể tải java/lang/String.class
làm tài nguyên. Đưa cái gì?