Help us understand the problem. What is going on with this article?

JavaFXプロジェクトを実行可能なJARファイルとしてエクスポートする

こんにちは、Androidエンジニアの忽那です。

現在、社内用に受付システムを空いた時間で開発中です。
受付からの通知を社内で受け取る為に、PC用GUIアプリを作成しようと思い、IntelliJ IDEAでJavaFXプロジェクトを作成しました。

Javaそのままでも良かったのですが、せっかくなのでKotlinを使いたかったので、JavaFXをKotlinで書きやすくしてくれるTornadoFXというライブラリを使ってみました。
この辺のシステムの実装方法はいずれ別記事として出したいと思います。

本題はタイトルにあるように、TornadoFXを使って作成したJavaFXプロジェクトを実行可能のJARファイルとしてエクスポートする方法です。

アプリの開発が完了し、いざエクスポートしようとしたところ
方法が全くわからん!

ググったら情報がたくさん出てきますが、どうやっても上手くいかない...
ビルドが通らなかったり、jar作っても起動時にMainクラスが見つからないと怒られたり、ライブラリが存在しないと怒られたり...

ということで、詰まったところと解決方法を備忘録として残しておきます。
ちなみに今回のプロジェクトはGradleプロジェクトです。Mavenプロジェクトの場合は参考にならないと思うのでご了承ください。

詰まったところ

①そもそもビルドが通らない

これはJDKのバージョンが原因のことが多いです。
JavaFXはJDK11以降はJDKに含まれていないようです。
私の環境ではIntelliJ IDEAで使うJDKのバージョンを10にしたところ上手くいきました。
まずはOracleの公式からJDK10を入手しましょう
インストール後、IntelliJ IDEAで使うJDKのバージョンを選択しましょう
プロジェクトを開き、
File→ProjectStructure→Platform Settings→SDKsの画面までいき、+→JDKを選択し、
インストールしたJDKのあるフォルダを選択します。
Windows環境だと少し違うかもしれませんが、Macの場合は
Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
を選択すると上手くいきました。参考にしてください。
そのあと、再びProjectStructure画面で
ProjectSettings→Project→ProjectSDKまでいき、先ほど追加したJDK10を選択しましょう。

これでJavaFXプロジェクトのビルドが通るようになったはずです。

②IntelliJ IDEAのBuildArtifactsでJARを生成しても起動時にエラーが発生する

前提として、IntelliJ IDEAのBuildArtifactsという機能を使えばJARファイルをエクスポートすることができます。
こちらはアーティファクトの設定でJavaFX Applicationを選択することができます。
しかし、バージョンのせいなのかわかりませんが
私はこちらの機能ではどうしても正常に動くJARファイルをエクスポートすることができなかったので、諦めました。
ではどうすればいいのか、というのを次の項目で説明します。

解決法

プラグインを使ってfatJarファイルを生成する

fatJarというのは依存関係のあるライブラリを全て内包したJARファイルのことです。
実行するPCの環境に左右されることもありませんし、ライブラリのクラスパスをマニフェストで指定する必要もありません。
ただ、ライブラリを全て含んでいる分、ファイルサイズは大きくなります。

使ったプラグイン:Gradle Shadow
こちらの記事を参考にさせていただきました。
まずはbuild.gradleに以下を追記し、プラグインを使用できるようにします。

apply plugin: "com.github.johnrengelman.shadow"
...
buildscript {
    dependencies {
        classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0"
    }
}

次に、build.gradleに生成するjarの設定を追記します

jar {
    manifest {
        attributes ('Main-Class': 'MainKt', "Implementation-Title": "Gradle",
                "Implementation-Version": 1)
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

間違えやすいのが

'Main-Class': 'MainKt'

の部分です。
今回はメインクラスとして、「Main.kt」というファイルを作っています。
この場合は「MainKt」という書き方で指定しないと認識してくれないので注意してください。
Javaファイルの場合は「Main」で大丈夫です。ややこしいですね...

build.gradleの設定が完了したら、ターミナルを開き、アプリのルートディレクトリまで移動し、以下のコマンドを実行することでjarファイルが生成されます。

$ ./gradlew shadowJar

[アプリディレクトリ]/build/libs/に、
[アプリ名]-all.jarというファイルが生成されているはずです。
JavaFxアプリをfatJarで生成したので、これをダブルクリックすればそのまま動きます。

以上です。
アプリケーションの開発そのものより実行可能ファイルの生成に苦労するという、想定外の展開になりましたが、なんとかなりました。
同じところで詰まっている方は参考にしていただければ幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away