Scala ソースをもとに Java で実行できる全部入りの jar を Maven で生成する
[履歴] [最終更新] (2015/04/26 04:07:16)
1
作品
371
技術情報
最近の投稿
ここは
趣味の電子工作を楽しむ人のためのハードウェア情報共有サイト

技術情報や作品の投稿機能、リアルタイム遠隔操作 API をご利用いただけます。
新着作品

概要および事前準備

Scala は JVM 上で動作するバイトコードにコンパイルできる言語です。JAVA よりも柔軟な記述ができます。事前にこちらからダウンロードおよびインストールしておいてください。以下は Maven を利用する前提での記述になっています。以下のようにしてプロジェクトのテンプレートを生成します。

scala-quickstart-archetype (GitHub)

$ mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-scala-app -Dversion=1.0 \
-DarchetypeGroupId=pl.org.miki -DarchetypeArtifactId=scala-quickstart-archetype -DinteractiveMode=false
  • artifact: 通常 JAR のことを指します
  • group: artifact の集合体です
  • archetype: pl.org.miki グループの scala-quickstart-archetype アーティファクトでテンプレートを生成します

Java で実行できる全部入りの jar を生成

scala や scalac コマンドを用いてコンパイルしていってもよいのですが mvn を利用していると成果物 jar を汎用的な手順で生成できます。

src/main/scala/com/mycompany/app/HelloWorld.scala

package com.mycompany.app

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, world!")
  }
}

以下のコマンドで jar を生成します。

$ mvn package

「-cp jarファイルのクラス検索パス」オプションを利用して成果物 jar を実行してみます。

$ jar tf target/my-scala-app-1.0.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/mycompany/
com/mycompany/app/
com/mycompany/app/HelloWorld$.class
com/mycompany/app/HelloWorld.class
META-INF/maven/
META-INF/maven/com.mycompany.app/
META-INF/maven/com.mycompany.app/my-scala-app/
META-INF/maven/com.mycompany.app/my-scala-app/pom.xml
META-INF/maven/com.mycompany.app/my-scala-app/pom.properties
$ scala -cp target/my-scala-app-1.0.jar com.mycompany.app.HelloWorld
Hello, world!

ただしこのままでは java では実行できません。java は scala ライブラリの所在を知らないためです。

$ java -cp target/my-scala-app-1.0.jar com.mycompany.app.HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: scala/Predef$
    at com.mycompany.app.HelloWorld$.main(HelloWorld.scala:5)
    at com.mycompany.app.HelloWorld.main(HelloWorld.scala)
    ...

Apache Maven Assembly Plugin の利用

Maven の Assembly Plugin を利用すると mvn package で生成される jar 内に依存関係がある外部 jar をすべて含めることができます。scala ライブラリが jar に含められるため java でも実行できるようになります。利用方法は簡単です。pom.xml に以下の内容を追記します。

参考ページ

<plugin>
  <!-- NOTE: We don't need a groupId specification because the group is
       org.apache.maven.plugins ...which is assumed by default.
  -->
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.5.3</version>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
      <manifest>
        <mainClass>com.mycompany.app.HelloWorld</mainClass>
      </manifest>
    </archive>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id> <!-- this is used for inheritance merges -->
      <phase>package</phase> <!-- bind to the packaging phase -->
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

再度 jar を生成して実行してみましょう。

$ mvn package
$ java -jar target/my-scala-app-1.0-jar-with-dependencies.jar
Hello, world!

このうち以下の部分を削除すると -jar オプションで実行はできなくなります。メイン・マニフェスト情報がないためです。

<archive>
  <manifest>
    <mainClass>com.mycompany.app.HelloWorld</mainClass>
  </manifest>
</archive>

実行例

$ mvn package
$ java -jar target/my-scala-app-1.0-jar-with-dependencies.jar
target/my-scala-app-1.0-jar-with-dependencies.jarにメイン・マニフェスト属性がありません
$ java -cp target/my-scala-app-1.0-jar-with-dependencies.jar com.mycompany.app.HelloWorld
Hello, world!

Apache Maven Shade Plugin

Apache Maven Shade Plugin でも Apache Maven Assembly Plugin と同様のことができます。利用方法は簡単です。POM を以下のように書き換えるだけです。

pom.xml

  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <!-- put your configurations here -->
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <manifestEntries>
                <Main-Class>com.mycompany.app.HelloWorld</Main-Class>
              </manifestEntries>
            </transformer>
          </transformers>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...

参考にした公式ページは以下のとおりです。

実行例

$ mvn package
$ java -jar target/my-scala-app-1.0.jar 
Hello, world!
関連ページ
    概要 Eclipse はフリーの統合開発環境です。v4.4 (Luna) の Windows への導入方法と基本操作についてまとめます。 インストール Eclipse Luna SR2 Packages にアクセスして Eclipse IDE for Eclipse Committers 4.4.x を開きます。右サイドバーの Download Links から使用している OS のものをダ
    概要 Logback は log4j の後継となる Java のロガーです。作者は log4j と同じです。log4j と同様に SLF4J (Simple Logging Facade for Java) というインターフェースを実装しています。JAR ファイルを直接利用する方法と Maven から利用する方法について最も初歩的な例を紹介します。
    概要 HandlerSocket は MySQL プロセス内のスレッドとして動作する、MySQL の NoSQL フロントエンドです。独自のプロトコルを用いて TCP 通信を行います。SQL 構文の解析が不要、プロトコルがシンプルなどの理由によって、単純な DB アクセスが高速に実行可能になります。MariaDB であれば
    概要 sbt は Scala および Java を主な対象としたビルドツールです。Scala Build Tool の略ではありませんが、Simple Build Tool という明示的な記述も公式ドキュメントなどには見当りません。以下 sbt の基本的な使用例をまとめます。使用した sbt のバージョンは 0.13 です。