2011-10-29 2 views
2

저는 Scala REPL에서 Guava 라이브러리에 의해 정의 된 Class 객체를 동적으로로드하고 싶습니다. 나는 Class.forName(...) 방법은 잘 작동하고 관리 Class.forName (...) Vs. Thread.currentThread.getContextClassLoader.loadClass (...) behavior

scala> :cp guava-10.0.1.jar 
Added '/Users/xxx/guava-10.0.1.jar'. Your new classpath is: 
"/Users/rouvoy/Development/tools/axis/default/lib:/Users/xxx/guava-10.0.1.jar" 

scala> Class.forName("com.google.common.base.Ascii") 
res0: java.lang.Class[_] = class com.google.common.base.Ascii 

Class 개체를 검색 할 수 있지만, 나는 ContextClassLoader를 사용하는 경우 이유를 이해하고 싶습니다 : 그러나, 나는 내가 Class 정의를 검색하는 방법에 따라 다른 행동을 관찰 자바에서 완벽하게 작동하는 동안 클래스 정의를 찾을 수 없습니까?

scala> Thread.currentThread.getContextClassLoader.loadClass("com.google.common.base.Ascii") 
java.lang.ClassNotFoundException: com.google.common.base.Ascii 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
at .<init>(<console>:8) 
at .<clinit>(<console>) 
at .<init>(<console>:11) 
at .<clinit>(<console>) 
at $print(<console>) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704) 
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920) 
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43) 
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25) 
at java.lang.Thread.run(Thread.java:680) 

scala> Class.forName("com.google.common.base.Ascii",true,Thread.currentThread.getContextClassLoader) 
java.lang.ClassNotFoundException: com.google.common.base.Ascii 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:247) 
at .<init>(<console>:8) 
at .<clinit>(<console>) 
at .<init>(<console>:11) 
at .<clinit>(<console>) 
at $print(<console>) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704) 
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920) 
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43) 
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25) 
at java.lang.Thread.run(Thread.java:680) 

답변

3

클래스로드는 Scala와 Java에서 약간 다릅니다. scala 실행 파일 (스크립트 또는 .bat)에 -cp를 지정하면 기본 클래스 경로에 추가되지 않고 스칼라 클래스 로더에만 추가됩니다. 나는 당신이 지정할 때 REPL에 대해서도 마찬가지라고 생각한다 : cp.

실제로 Java 클래스 경로에 뭔가를 추가하려면 -toolcp 옵션을 사용하여 scala 또는 scalac을 지정하십시오.

내 대답보기 : scala classloaders confusion.

+0

또는 -usejavacp를 사용하십시오. –