今度は、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
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使うのは微妙ってこと?
う〜ん、ここはちょっと残念ですね。