Scala を複数バージョンインストールしてある環境での NoClassDefFoundError
Scala 2.8.0.final と 2.9.0.1 をインストールしてあるWindowsマシンで、2.8.0.final の方を使ってスクリプトを実行しようとしたら NoClassDefFoundError が出た。
C:\tmp>"C:\Program Files (x86)\scala 2.8.0.final\bin\scala" test.scala java.lang.NoClassDefFoundError: scala/Serializable at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.scala$tools$nsc$util$ScalaClassLoader$$super$findClass(ScalaClassLoader.scala:86) at scala.tools.nsc.util.ScalaClassLoader$class.findClass(ScalaClassLoader.scala:51) at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.findClass(ScalaClassLoader.scala:86) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.scala$tools$nsc$util$ScalaClassLoader$$super$loadClass(ScalaClassLoader.scala:86) at scala.tools.nsc.util.ScalaClassLoader$class.loadClass(ScalaClassLoader.scala:57) at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.loadClass(ScalaClassLoader.scala:86) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) at Main$$anon$1.<init>(test.scala:9) at Main$.main(test.scala:1) at Main.main(test.scala) (略)
ググッたところ、両方のバージョンのコンパイルデーモンが立ち上がっている兼ね合いでは…的な情報が得られたので、試しにコンパイルデーモンを使わずにコンパイルしてみた。
C:\tmp>"C:\Program Files (x86)\scala 2.8.0.final\bin\scala" -nocompdaemon test.scala C:\tmp>
成功。
コンパイルデーモンを使ってどうにかする方法もあるのかも知れないが、普段は 2.9.0.1 の方をメインで使っているのでこれでよしとする。