【Scala】SBT ~ JAR作成/実行 ~

■ はじめに

ScalaのモジュールをJARファイル化して
JAVAしか入っていない環境で実行するってことをやっていて
意外と手間取ったので、メモ。

目次

【1】前提条件
 1)sbt 含む Scala 環境
 2)sbtプラグイン「sbt-assembly」
【2】JAR作成
 1)作成コマンド例 
【3】JAR実行
【4】おまけ:JARコマンド
 1)JAR ファイルの内容を一覧表示
 2)JAR ファイルの抽出
 3)JAR ファイルの更新
 4)JAR ファイルの解凍
 5)JAR ファイルの作成

【1】前提条件

1)sbt 含む Scala 環境

* sbt 含む Scala 環境が設定されていること
 => 設定されていない場合は、以下の関連記事を参照のこと

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 環境構築編 / IntelliJ IDEA in WSL ~
https://dk521123.hatenablog.com/entry/2023/06/10/034839
SDKMAN ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/08/13/000000

2)sbtプラグイン「sbt-assembly」

* sbtプラグイン「sbt-assembly」が設定されていること
 => sbtプラグイン「sbt-assembly」については、以下の関連記事を参照のこと

SBT ~ sbtプラグイン
https://dk521123.hatenablog.com/entry/2023/01/25/000000

【2】JAR作成

* 依存関連のJAR込み込みのJAR(Fat jar)の作成
* 作成時でのエラーなどのトラブルは、以下の関連記事を参照のこと

SBTでのエラー/警告対応
https://dk521123.hatenablog.com/entry/2023/04/06/093458

1)作成コマンド例

# [1] 一旦クリア
sbt clean

# [2] JAR作成
sbt assembly

# [2]' 引数を付与したい場合
sbt -Dxx=xxx assembly

出力ファイル先

実行後にプロジェクトから target/scala-x.xx (x.xxはScalaバージョン e.g. scala-2.12)
配下にJARファイルが作成されているはず

【3】JAR実行

# 作成したJARファイルが「xxxx.jar」の場合
java -jar xxxx.jar

【4】おまけ:JARコマンド

JARファイルは、結局、ZIPファイルなので
拡張子 *.jar を *.zip に返れば、中身は確認できるが
コマンドでもできるので、メモ

https://qiita.com/rita_cano_bika/items/f810c27e66946367444d
https://itechblog.hatenablog.com/entry/2019/12/17/2019-12-17-155907/

公式サイト
https://docs.oracle.com/javase/jp/1.5.0/tooldocs/windows/jar.html

1)JAR ファイルの内容を一覧表示

jar tf [JAR_FILE_NAME.jar]

jar tf ./target/scala-2.12/xxx.jar

2)JAR ファイルの抽出

jar xf [JAR_FILE_NAME.jar]

jarファイルの中身一部分を抽出

# v が増えた
jar -xvf [JAR_FILE_NAME.jar] [TARGET_FILE_NAME] [TARGET_DIR]

3)JAR ファイルの更新

jar u[v0M]f jarfile [-C dir] inputfiles [-Joption]

# xxxx.jar に scala-library-2.12.17.jar を追加する場合
jar -uf xxxx.jar scala-library-2.12.17.jar

# なお、
# jar -uf xxxx.jar ./libs/scala-library-2.12.17.jar
# とした場合、追加

4)JAR ファイルの解凍

jar xf xxxxx.jar

5)JAR ファイルの作成

jar cmf manifestjarfile [-C dir] inputfiles[-Joption]

使用上の注意

c: JARファイル作成(Create?)
m: Manifastファイル
f: Jar File指定

https://qiita.com/maple_syrup/items/a2f21fe356fa5f06bf44

mオプションとfオプションの記載順は決まっていないが、
cmfならばmanifest jarfile、cfmならjarfile manifestというように、
後続の引数の順番を合わせる必要がある。

関連記事

SBT ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/22/000000
SBT ~ 基本編 / build.sbt ~
https://dk521123.hatenablog.com/entry/2023/01/27/000000
SBT ~ 基本編 / sbtコマンド ~
https://dk521123.hatenablog.com/entry/2023/01/26/000000
SBT ~ sbtプラグイン
https://dk521123.hatenablog.com/entry/2023/01/25/000000
SBT ~ 設定の切替 ~
https://dk521123.hatenablog.com/entry/2023/08/28/165323
SBTでのエラー/警告対応
https://dk521123.hatenablog.com/entry/2023/04/06/093458