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

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

やりたいこと
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'

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を再実行

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 を実行!

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

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

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