モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

Scala ソースをもとに Java で実行できる全部入りの jar を Maven で生成する

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/03/22
最終更新最終更新
2021/09/07
記事区分記事区分
一般公開

概要および事前準備

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!
Likeボタン(off)0
詳細設定を開く/閉じる
アカウント プロフィール画像

Java初心者向けの記事が多め

記事の執筆者にステッカーを贈る

有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

>>さらに詳しくステッカーを贈る
ステッカーを贈る コンセプト画像

Feedbacks

Feedbacks コンセプト画像

    ログインするとコメントを投稿できます。

    ログインする

    関連記事

    • Spring Security フォームログインのサンプルコード
      Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
      えびちゃんえびちゃん11/4/2019に更新
      いいねアイコン画像0
    • Java配列の宣言方法 (C/C++との違い)
      Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
      てんとうむしてんとうむし4/13/2018に更新
      いいねアイコン画像0
    • PlantUML による UML 図の描き方
      サムネイル画像-c788fffde5
      PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
      kentakenta12/21/2019に更新
      いいねアイコン画像0
    • Akka HTTP サンプルコード (Scala)
      サムネイル画像-a98142497c
      Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
      雄太雄太9/7/2021に更新
      いいねアイコン画像0
    • Kestrel の使用例
      Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
      したくんしたくん9/12/2017に更新
      いいねアイコン画像0