Scalaでハローワールド
object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, World!") } }
これを「HelloWorld.scala」というファイル名で保存し、scalacでコンパイルする。
D:\Lab\Scala>dir /b HelloWorld.scala D:\Lab\Scala>scalac HelloWorld.scala D:\Lab\Scala>
するとJavaと同じクラスファイルが生成されるので、scalaコマンドで実行。
D:\Lab\Scala>dir /b HelloWorld$.class HelloWorld.class HelloWorld.scala D:\Lab\Scala>scala HelloWorld Hello, World! D:\Lab\Scala>
当然、このクラスファイルをjavaコマンドで実行しても同じように動作する。
D:\Lab\Scala>java HelloWorld Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at HelloWorld.main(HelloWorld.scala) Caused by: java.lang.ClassNotFoundException: scala.ScalaObject at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) ... 13 more D:\Lab\Scala>
わけはなかった…。
ちょっと改造。NoClassDefFoundErrorとか出てるから単純にクラスを作ればいいのかなと思って、それをオブジェクトから呼ぶことに。
class Hello { def print = println("Hello!") }
object HelloWorld2 { def main(args: Array[String]): Unit = { var hello = new Hello() hello.print } }
再度、コンパイルと実行。
D:\Lab\Scala>scalac Hello.scala D:\Lab\Scala>scalac HelloWorld2.scala D:\Lab\Scala>scala HelloWorld2 Hello!
javaコマンドでも実行。
D:\Lab\Scala>java HelloWorld2 Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at HelloWorld.main(HelloWorld.scala) Caused by: java.lang.ClassNotFoundException: scala.ScalaObject at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) ... 13 more D:\Lab\Scala>
ググったら、Scalaに含まれているライブラリを使わないとダメということがわかった。
D:\Lab\Scala>java -classpath .;C:\scala-2.7.3.final\lib\scala-library.jar HelloWorld2
Hello!
D:\Lab\Scala>
てっきりそのまんまjavaコマンドで実行できるもんだと思ってました。