LoginSignup
2
1

More than 3 years have passed since last update.

TornadoFXで書いたアプリをJARファイルにまとめる

Last updated at Posted at 2019-05-15

※別の方法をこちらでまとめました。

前置き

TornadoFXでアプリを作成したあと、JARファイルを生成する手段をまとめます。Javaでの業務経験がないままいきなりKotlinを触っている人間が書いているので、間違いやあたりまえの内容が書かれているかもしれません。

環境

  • Windows10 Pro ver1809
  • IntelliJ IDEA Ultimate 2019.1.2
    • Kotlin v1.3.31-release-IJ2019.1-1
    • TornadoFX v1.7.17.2
  • openjdk version "1.8.0_202"
    • OpenJDK Runtime Environment Corretto-8.202.08.2 (build 1.8.0_202-b08)
    • OpenJDK 64-Bit Server VM Corretto-8.202.08.2 (build 25.202-b08, mixed mode)

先に結論

FXLauncherというGradleプラグインを使うことで可能でした。インストーラーまで作成できるのですが、手元の環境ではインストーラーでインストールしたアプリケーションが起動できませんでした。MacOSは未検証です。

手順1

まずはIntelliJでTornadoFXのプロジェクトを作ります。今回はProject SDK 1.8でtornadofx-gradle-projectで進めます。そのままビルドすれば簡単なHello Worldアプリとなっています。

なお、プロジェクト作成後に”Could not determine java version from '11.0.2'.”などと怒られる場合は、こちらの記事のgradle-wrapper.propertiesを参考に手を入れると解決しました。

手順2

FXLauncherを導入します。Quick Startbuild.gradleを参考に自身のbuild.gradleを編集します。


buildscript {
    ext.kotlin_version = "1.2.60"
    ext.tornadofx_version = "1.7.17"
    ext.junit_version = "5.1.0"

    repositories {
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.junit.platform:junit-platform-gradle-plugin:1.1.0"
        classpath 'no.tornado:fxlauncher-gradle-plugin:1.0.20'
    }
}

apply plugin: "kotlin"
apply plugin: "application"
apply plugin: "org.junit.platform.gradle.plugin"
apply plugin: 'java'
apply plugin: 'no.tornado.fxlauncher'

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

repositories {
    mavenLocal()
    mavenCentral()
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots/"
    }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

    compile "no.tornado:tornadofx:$tornadofx_version"
    compile 'org.controlsfx:controlsfx:8.40.12'

    testCompile "org.junit.jupiter:junit-jupiter-api:$junit_version"
    testRuntime "org.junit.jupiter:junit-jupiter-engine:$junit_version"
}

mainClassName = "com.example.demo.app.MyApp"

fxlauncher {
    applicationVendor 'My Company'
    // Base URL where you will host the application artifacts
    applicationUrl 'http://localhost.localdomain/'
    applicationMainClass mainClassName
    acceptDowngrade false
    // Optional scp target for application artifacts hosted at the above url
    //deployTarget 'w48839@fxldemo.tornado.no:fxldemo'
}


jar {
    manifest {
        attributes(
                "Class-Path": configurations.compile.collect { it.getName() }.join(" "),
                "Main-Class": mainClassName
        )
    }
    from(configurations.compile.collect { entry -> zipTree(entry) }) {
        exclude "META-INF/MANIFEST.MF"
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
}

version = "1.0.0" // これが無いと gradle generateNativeInstaller で怒られる

手順3

コンソールで以下を実行します。

gradle generateNativeInstaller

無事成功すると"project root/build/fxlauncher/"にjarファイルが出来上がります。インストーラーを作成したい場合はコンソール上で指定されたアプリケーションを別途インストールし、パスを通す必要があります。

なお、Inno Setupはバージョン5でないとビルド時にエラーが出るようでした。

前述しましたが、無事インストーラーが出来てもそのインストーラーでインストールしたアプリケーションは以下のようなエラーを吐いて起動しません。

java.lang.ClassNotFoundException: com.example.demo.app.MyApp
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at fxlauncher.AbstractLauncher.createApplicationEnvironment(AbstractLauncher.java:170)
    at fxlauncher.Launcher.lambda$start$0(Launcher.java:152)
    at java.lang.Thread.run(Thread.java:748)

メインクラスが見つけられていないようなので、何かしらの設定ミスかとは思いますが、まだ解消できていません。"build/fxlauncher/"に出来上がったjarファイル自体は起動できるので、インストーラーのビルドで上手くいっていないようです。ドキュメントを熟読する必要がありますね。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1