ScalaをSBTやIDEで使ってみる


目的:MacにScalaをインストールして、ビルドツールやIDEのプロジェクト作成などをやってみる。

Scalaのインストール

Macにscalaをインストールする。
JDKはあらかじめインストールしておく。
brewを使ってscalaをインストールする。

$ brew install scala
$ brew install sbt

sbtはscala用のビルドツールでJavaにおけるAntみたいなやつ。
simple build toolの略らしい。

SBT

SBTを使ってみる。プロジェクトのディレクトリから作成する。

$ mkdir hello
$ cd hello
$ vi build.sbt

build.sbtに以下を書く。

name := "Hello"

version := "1.0" 

Scalaのソースを書く。ソースの位置はsrc/main/scalaに置くのが一般的なようだ。

$ mkdir -p src/main/scala
$ vi src/main/scala/HelloScala.scala
object HelloScala {
  def main(args: Array[String]) :Unit = {
    println("Hello Scala")
  }
}

実行してみる。

$ sbt compile
$ sbt run
[info] Set current project to hello (in build file:~/scala/projects/hello/)
[info] Running HelloScala
Hello Scala
[success] Total time: 1 s, completed 2014/05/14 14:51:18

Javaも実行できる。

$ mkdir -p src/main/java

$ vi src/main/java/HelloJava.java

Javaのソースを書く。

public class HelloJava {
    public static void main(String[] args) {
        System.out.println("Hello Java");
    }
}

実行するときに、どれを処理するか番号で選択する。

$ sbt compile
$ sbt run
[info] Set current project to hello (in build file:~/work/scala/projects/hello/)

Multiple main classes detected, select one to run:

 [1] HelloJava
 [2] HelloScala

Enter number: 1

[info] Running HelloJava
Hello Java
[success] Total time: 4 s, completed 2014/05/14 14:55:08

外部ライブラリであるjson4sを試してみる。

$ vi build.sbt
name := "Hello"

version := "1.0" 

libraryDependencies += "org.json4s" %% "json4s-jackson" % "3.2.9"

build.sbtにライブラリの情報を追記する。

$ vi src/main/scala/JsonExample.scala

json4sのサンプルコード

object JsonExample extends App {
  import org.json4s._
  import org.json4s.JsonDSL._
  import org.json4s.jackson.JsonMethods._

  case class Winner(id: Long, numbers: List[Int])
  case class Lotto(id: Long, winningNumbers: List[Int], winners: List[Winner], drawDate: Option[java.util.Date])

  val winners = List(Winner(23, List(2, 45, 34, 23, 3, 5)), Winner(54, List(52, 3, 12, 11, 18, 22)))
  val lotto = Lotto(5, List(2, 45, 34, 23, 7, 5, 3), winners, None)

  val json =
    ("lotto" ->
      ("lotto-id" -> lotto.id) ~
      ("winning-numbers" -> lotto.winningNumbers) ~
      ("draw-date" -> lotto.drawDate.map(_.toString)) ~
      ("winners" ->
        lotto.winners.map { w =>
          (("winner-id" -> w.id) ~
           ("numbers" -> w.numbers))}))

  println(compact(render(json)))
}
$ sbt compile

自動的に依存してるライブラリをダウンロードしてくれる。
JsonExampleを実行してみる。

$ sbt run
[info] Set current project to hello (in build file:~/work/scala/projects/hello/)

Multiple main classes detected, select one to run:

 [1] HelloJava
 [2] HelloScala
 [3] JsonExample

Enter number: 3

[info] Running JsonExample
{"lotto":{"lotto-id":5,"winning-numbers":[2,45,34,23,7,5,3],"winners":[{"winner-id":23,"numbers":[2,45,34,23,3,5]},{"winner-id":54,"numbers":[52,3,12,11,18,22]}]}}
[success] Total time: 3 s, completed 2014/05/14 15:17:22

インタプリタっぽい仕組みのREPLもsbtから使えるようだ。

$ sbt console
[info] Set current project to hello (in build file:~/work/scala/projects/hello/)
[info] Starting scala interpreter...
[info]
Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_55).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import org.json4s._
import org.json4s._

scala> import org.json4s.jackson.JsonMethods._
import org.json4s.jackson.JsonMethods._

scala> parse(""" { "numbers" : [1, 2, 3, 4] } """)
res0: org.json4s.JValue = JObject(List((numbers,JArray(List(JInt(1), JInt(2), JInt(3), JInt(4))))))

scala> parse("""{"name":"Toy","price":35.35}""", useBigDecimalForDouble = true)
res1: org.json4s.JValue = JObject(List((name,JString(Toy)), (price,JDecimal(35.35))))

IntelliJ IDEAを使ってみる

IDEであるIntelliJ IDEAでプロジェクトを作成してみる。
IntelliJ IDEA 13をダウンロードしてインストールする。
http://www.jetbrains.com/idea/download/
Community Editionは無料なのでこれを使う。

IDEAをインストールしたら、設定からでscalaとsbtのプラグインをインストールする。

プロジェクトの作成は新規作成でSBTを選択する。
スクリーンショット 2014-05-14 16.09.47

ディレクトリが自動的に生成されるので、src/main/scala/にJsonExample.scalaをソースに追加する。
スクリーンショット 2014-05-14 16.41.52

ライブラリの設定をbuild.sbtに追記する。
スクリーンショット 2014-05-14 16.15.26

実行する。エラーが出たらbuild.sbtをリフレッシュする。
スクリーンショット 2014-05-14 16.42.22

楽ちんである。