CLOVER🍀

That was when it all began.

GradleでScalaを使う

今度は、GradleでScalaを使って「Hello World」をやってみましょう。

基本、ユーザガイドに沿ってやっていく感じです。
http://www.gradle.org/docs/current/userguide/scala_plugin.html

Scala用のプロジェクトを作る

まずはディレクトリ作成。

$ mkdir hello-gradle-scala
$ cd hello-gradle-scala/
$ mkdir -p src/main/scala

続いて、build.gradleを作成します。

apply plugin: 'scala'

repositories {
    mavenCentral()
}

dependencies {
    scalaTools 'org.scala-lang:scala-compiler:2.9.2'
    scalaTools 'org.scala-lang:scala-library:2.9.2'

    compile 'org.scala-lang:scala-library:2.9.2'
}

依存関係の定義の省略表記を、ここで使ってしまいました(笑)。

サンプルソースを用意。
src/main/scala/HelloGradle.scala

import scala.util.Properties

object HelloGradle {
  def main(args: Array[String]): Unit = {
    println("Hello World")
    println("Scala Version = [%s]".format(Properties.versionString))
  }
}

では、ビルド。

$ gradle build
:compileJava UP-TO-DATE
:compileScala
Download http://repo1.maven.org/maven2/org/scala-lang/scala-library/2.9.2/scala-library-2.9.2.pom
> Building > :compileScala > Resolving dependencies ':compile' > 1 KB/1 KB downlDownload http://repo1.maven.org/maven2/org/scala-lang/scala-library/2.9.2/scala-library-2.9.2.jar
Download http://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.9.2/scala-compiler-2.9.2.pom
> Building > :compileScala > Resolving dependencies ':scalaTools' > 1 KB/1 KB doDownload http://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.9.2/scala-compiler-2.9.2.jar
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:compileTestScala UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build

BUILD SUCCESSFUL

Total time: 29.269 secs

実行

やっぱり、applicationプラグインを設定します。

apply plugin: 'scala'
apply plugin: 'application'

mainClassName = 'HelloGradle'

repositories {
    mavenCentral()
}

dependencies {
    scalaTools 'org.scala-lang:scala-compiler:2.9.2'
    scalaTools 'org.scala-lang:scala-library:2.9.2'

    compile 'org.scala-lang:scala-library:2.9.2'
}

あとは、普通に実行するだけです。

$ gradle run
:compileJava UP-TO-DATE
:compileScala
:processResources UP-TO-DATE
:classes
:run
Hello World
Scala Version = [version 2.9.2]

BUILD SUCCESSFUL

Total time: 22.021 secs

それにしても、Scalaコンパイルが死ぬほど重いわけですが…。

fscを使う

というわけで、Scalaコンパイルが重いと思う時にはfscですよね。GradleのScalaプラグインガイドにもfscとの連携方法が載っています。
http://www.gradle.org/docs/current/userguide/scala_plugin.html#N12A2C

では、試してみましょう。build.gradleを修正。

apply plugin: 'scala'
apply plugin: 'application'

mainClassName = 'HelloGradle'

repositories {
    mavenCentral()
}

dependencies {
    scalaTools 'org.scala-lang:scala-compiler:2.9.2'
    scalaTools 'org.scala-lang:scala-library:2.9.2'

    compile 'org.scala-lang:scala-library:2.9.2'
}

compileScala {
    scalaCompileOptions.useCompileDaemon = true
}

ビルド。

$ gradle build
:compileJava UP-TO-DATE
:compileScala
[ant:fsc] : Compile failed; see the compiler error output for details.
[ant:fsc] 	at scala.tools.ant.ScalaTask$class.buildError(ScalaMatchingTask.scala:27)
[ant:fsc] 	at scala.tools.ant.ScalaMatchingTask.buildError(ScalaMatchingTask.scala:30)
[ant:fsc] 	at scala.tools.ant.FastScalac.execute(FastScalac.scala:107)
[ant:fsc] 	at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
[ant:fsc] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

 〜省略〜

[ant:fsc] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[ant:fsc] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ant:fsc] 	at java.lang.reflect.Method.invoke(Method.java:601)
[ant:fsc] 	at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:50)
[ant:fsc] 	at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:32)
[ant:fsc] 	at org.gradle.launcher.GradleMain.main(GradleMain.java:26)

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileScala'.
> Compile failed because of an internal compiler error (Compile failed; see the compiler error output for details.); see the error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 14.939 secs

…なんか、盛大にエラーを吐いてコケてくれましたが?

何がいけないんでしょう?そういえば、サンプルのScalaバージョンって、2.8.2になってますね…もしかして…。

というわけで、build.gradleをちょっと変えて、Scalaバージョンを落としてみます。

dependencies {
    scalaTools 'org.scala-lang:scala-compiler:2.8.2'
    scalaTools 'org.scala-lang:scala-library:2.8.2'

    compile 'org.scala-lang:scala-library:2.8.2'
}

では、試してみましょう。

$ gradle build
:compileJava UP-TO-DATE
:compileScala
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:compileTestScala UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build

BUILD SUCCESSFUL

Total time: 21.723 secs

…動きました。ということは、Scalaの最新版コンパイラには追従できていないんですね。
*2.9.0でも試してみましたが、失敗したので2.9系についていけていないようです

まあScalaの変わりやすさを考えると、どっちが悪いとも言えない気がしますが。

ただ、この時バックグラウンドで起動しているfscはpsで見ると、なぜかローカルに自分でインストールしたもの(2.9.2)ということが確認できました。どうなってるの?

…ちょっと、Gradleでfscを使うのはやめた方がいいかも。あれ?ということは、GradleでScala使うのは微妙ってこと?

う〜ん、ここはちょっと残念ですね。