Scalaアプリケーションを配布する
Scalaのコードをコンパイルすると.classファイルができるが、これをjavaコマンドで実行するとNoClassDefFoundErrorになる。
$ cat Test.scala object Test { def main(args: Array[String]){ println("Hello, World!") } } $ fsc Test.scala $ java Test Exception in thread "main" java.lang.NoClassDefFoundError: scala/Predef$ at Test$.main(Test.scala:3) at Test.main(Test.scala) Caused by: java.lang.ClassNotFoundException: scala.Predef$ at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 2 more $
実行にはscala-library.jar(その他 scala-swing.jar などのライブラリも必要に応じて)が必要。
自分の環境ではScalaはhomebrewでインストールしているので、これらのjarは /usr/local/Cellar/scala/2.10.3/libexec/lib/ にあった。
$ SCALALIB=/usr/local/Cellar/scala/2.10.3/libexec/lib $ ls $SCALALIB akka-actors.jar scala-actors.jar scala-reflect.jar diffutils.jar scala-compiler.jar scala-swing.jar jline.jar scala-library.jar scalap.jar scala-actors-migration.jar scala-partest.jar typesafe-config.jar $ java -classpath .:$SCALALIB/scala-library.jar Test Hello, World! $
Scalaで作ったアプリケーションを他の人に渡すときは、scala-library.jarを同梱して、クラスパスを設定して起動するスクリプトを付けることになるだろう。
scala-library.jarの配布ライセンスは、Scala Licenseを付けておけば良い?
http://www.scala-lang.org/old/node/401 (2008年の情報)