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コマンドで実行できるもんだと思ってました。