LoginSignup
3
1

More than 5 years have passed since last update.

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

Posted at

やりたいこと
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 から該当の箇所を削除して対応する

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
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1