2011-10-29 11 views
2

私はGualaライブラリによって定義されたClassオブジェクトをScala REPLから動的にロードしたいと思います。しかし、私はClass定義を取得する方法に応じて、異なる振る舞いを観察:Class.forName(...)とThread.currentThread.getContextClassLoader.loadClass(...)ビヘイビア

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.forName(...)方法が正常に動作してClassオブジェクトを取得するために管理し、私はContextClassLoaderを使用した場合、理由を理解したいと思い、I Javaで完全に動作している間にクラス定義を見つけることができませんか?

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を指定すると、基本クラスパスに追加されず、Scalaクラスローダーにのみ追加されます。私はあなたが指定するとき、REPLに同じことが当てはまると思う:cp。

実際にJavaクラスパスに何かを追加するには、-toolcpオプションを使用してscalaまたはscalacを指定します。

私の答えはscala classloaders confusionです。

+0

または-usejavacpを使用してください。 –

関連する問題