DEV Community

あかやん
あかやん

Posted on

Kotlinでfatjar(shadowjar)を作る(kts版)

毎回fatjarを作るときにやり方ググるのが面倒なので自分の記事としてメモしておきます。
なおGradleはkts版とします。Groovy版では少々記述を変える必要があります

参考

fatjarとは依存ライブラリも含めたjarファイルです。通常のbuildをした場合に生成されるjarファイルは依存ライブラリは含まれていなく、そのjarを実行する際には依存ライブラリを指定してあげる必要があります。
fatjarを生成しておくと、このjarファイルだけでプログラムの実行が可能となります。
なお、ここまでfatjarと書いていますが、実際に作成に使用するのはshadowjarです。

手順

新しいバージョンが常に出ているはずなので、最新のバージョンはこちらで確認しましょう
https://imperceptiblethoughts.com/shadow/getting-started/

build.gradle.kts

plugins {
    kotlin("jvm") version "1.6.20"  // ここはもともと書いてあるはず
    id("com.github.johnrengelman.shadow") version "7.1.2"
    id("java")
}

// jarファイルを実行時に実行されるメインファイルのクラスを指定する。
val jar by tasks.getting(Jar::class) {
    manifest {
        // mainメソッドが存在するファイルのパスに、末尾にKtを付与したものです。
        attributes["Main-Class"] = "packagename.XxxxxXxxxxKt"
    }
}
Enter fullscreen mode Exit fullscreen mode

こうすることで、

gradle shadowJar
Enter fullscreen mode Exit fullscreen mode

build/libs/xxxxxxxxx-1.0-SNAPSHOT-all.jarにshadowJarが生成されます。
このjarを以下のように実行すると

java -jar build/libs/xxxxxxxxx-1.0-SNAPSHOT-all.jar
Enter fullscreen mode Exit fullscreen mode

先程指定したpackagename.XxxxxXxxxxKtのmainメソッドが実行されます。

もしほかのmainメソッドを実行したい場合は

java -cp build/libs/xxxxxxxxx-1.0-SNAPSHOT-all.jar packagename.YyyyyyYyyyyyKt
Enter fullscreen mode Exit fullscreen mode

のように実行することができます。この場合、build.gradle.ktsjar manifestの記載は不要になります。(その代わりjava -jarでは実行できない)

以上です。shadowJarを使うだけであれば、pluginに2行追加するだけで良いので非常に楽です。ただ、依存の衝突などが発生した場合は大変ですがその際はMergeStrategyを記述する必要があります。

Discussion (0)