やりたいこと
Scalaの開発環境をさくっと用意して、コンパイルして実行する.ファイルの変更が入ったら再度コンパイルしてテストが動く。というサイクルを作る
###前提
- maven をインストールする
- scala をインストールする
###maven で scalaプロジェクトを作る
# これは問題無し
mvn archetype:generate
...
# scalaを選択
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 689: scala
... # scala-archetype-simpleを選ぶ
5: remote -> net.alchim31.maven:scala-archetype-simple
...
# ここでエラー
mvn package
...
[ERROR] scalac error: bad option: '-make:transitive'
Scala 2.11 から -make:transitive オプションが無くなったことが原因...
pom.xml から該当の箇所を削除して対応する
70: <arg>-make:transitive</arg> <!-- ここ -->
変更したのち、mvn packageを再実行
mvn package
...
error: not found: type JUnitRunner
エラー出た.
JUnitのdependencyが不足している.ということで、pom.xml に追加.
https://github.com/etorreborre/specs2/issues/408
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<!-- ここから -->
<dependency>
<groupId>org.specs2</groupId>
<artifactId>specs2-junit_${scala.compat.version}</artifactId>
<version>2.4.16</version>
<scope>test</scope>
</dependency>
<!-- ここまで追加 -->
再度 mvn package を実行!
mvn package
...
[INFO] BUILD SUCCESS
次は実行
mvn scala:run
...
[INFO] --- scala-maven-plugin:3.2.0:run (default-cli) @ hello ---
[WARNING] Not mainClass or valid launcher found/define
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
あらら... mainClassが無いと言われてしまった.
参考: こちらに全部記載がありました...
https://blogs.oracle.com/arungupta/entry/scala_and_maven_getting_started
pom.xmlに実行情報を追加!
<plugin>
<!-- see http://davidb.github.com/scala-maven-plugin -->
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<arg>-dependencyfile</arg>
<arg>${project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
<!-- ここから -->
<configuration>
<launchers>
<launcher>
<id>hello</id>
<mainClass>test.App</mainClass>
<args>
<arg>${basedir}</arg>
</args>
</launcher>
</launchers>
</configuration>
<!-- ここまで追加 -->
</plugin>
実行する
[INFO] --- scala-maven-plugin:3.2.0:run (default-cli) @ hello ---
[INFO] launcher 'hello' selected => test.App
Hello World!
concat arguments = /Users/motokazu/Documents/scala/project/hello
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Watcherを追加
コードの変更を察知して、自動的にpacakge してほしい。fizzed-watcher-maven-pluginを使うことにした。
https://github.com/fizzed/maven-plugins
pom.xml にプラグイン情報を追加する
<plugin>
<groupId>com.fizzed</groupId>
<artifactId>fizzed-watcher-maven-plugin</artifactId>
<version>1.0.6</version>
<configuration>
<touchFile>target/classes/watcher.txt</touchFile>
<watches>
<watch>
<directory>src/main/scala</directory>
</watch>
</watches>
<goals>
<goal>compile</goal>
<goal>process-classes</goal>
</goals>
<profiles>
<profile>optional-profile-to-activate</profile>
</profiles>
</configuration>
</plugin>
実行.
mvn fizzed-watcher:run
... (初回)いろいろ必要なファイルのダウンロード
...
[INFO] Watcher - registering watch on dir: src/main/scala
[INFO] Watcher - registering watch on dir: src/main/scala/test
[INFO] Watcher - waiting for changes...
ファイルを変更してみると... コンパイルが動いた。これは便利だ。
[INFO] Watcher - file modified: src/main/scala/test/App.scala
[INFO] Changed detected. Running command-line equivalent of:
[INFO] mvn -Poptional-profile-to-activate compile process-classes
[INFO] Scanning for projects...
##追記
mvn archetype:generate 実行して、毎回 scalaを選択するの面倒だな..と思ったら,以下のようにすると一気にセットアップされる
mvn archetype:generate -DarchetypeCatalog=remote -DarchetypeGroupId=net.alchim31.maven -DarchetypeArtifactId=scala-archetype-simple -DarchetypeVersion=1.6