Maven (Scala-maven-plugin) でScala packageをビルドして実行して、サイクルを回す


やりたいこと
Scalaの開発環境をさくっと用意して、コンパイルして実行する.ファイルの変更が入ったら再度コンパイルしてテストが動く。というサイクルを作る


###前提
- maven をインストールする
- scala をインストールする

###maven で scalaプロジェクトを作る

```bash
# これは問題無し
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'
```


http://stackoverflow.com/questions/23875515/compilation-error-in-scala

Scala 2.11 から -make:transitive オプションが無くなったことが原因...
pom.xml から該当の箇所を削除して対応する

```pom.xml
 70: <arg>-make:transitive</arg> <!-- ここ -->
```

変更したのち、mvn packageを再実行

```bash
mvn package
...
error: not found: type JUnitRunner

```
エラー出た.
JUnitのdependencyが不足している.ということで、pom.xml に追加.
https://github.com/etorreborre/specs2/issues/408

```pom.xml
  <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 を実行!

```bash
mvn package
...

[INFO] BUILD SUCCESS
```

次は実行

```bash
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に実行情報を追加!

```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>
```

実行する

```bash
[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 にプラグイン情報を追加する

```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>
```

実行.

```bash
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...

```

ファイルを変更してみると... コンパイルが動いた。これは便利だ。

```bash
[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を選択するの面倒だな..と思ったら,以下のようにすると一気にセットアップされる

```bash
mvn archetype:generate -DarchetypeCatalog=remote -DarchetypeGroupId=net.alchim31.maven -DarchetypeArtifactId=scala-archetype-simple -DarchetypeVersion=1.6
```