前回の続き。JavaFXの強みとして、各OSのNativeアプリにビルドできることがある。
Windows用にビルドしたときの備忘録。
wannabe-jellyfish.hatenablog.com
JavaFXのでビルドできる形式
形式 | インストール場所(デフォルトは太字) | OS | 事前に必要なソフトウェア |
---|---|---|---|
EXE | user : %LOCALAPPDATA% System: %ProgramFiles% |
Windows | Inno Setup 5 or later |
MSI | user: %LOCALAPPDATA% System: %ProgramFiles% |
Windows | WiX 3.0 or later |
DMG | user: デスクトップフォルダ System: /Applications |
OS X | |
PKG | user: デスクトップフォルダ System: /Applications |
OS X | |
RPM | user: unsupported System: /opt |
Linux | RPMBuild |
DEB | user: unsupported System: /opt |
Linux | Debian packaging tools |
ほかにもFatJarとか、WebページやJNLPなどにもパッケージングができる!
refs: Self-Contained Application Packaging
JavaFXでのビルドのやり方
JavaFXでのビルドの方法は2通りある
build.fxbuild
というビルドファイルを作成し、ビルドする方法javafx-maven-plugin
のjfx:native
ゴールで、ビルドする方法
今回はMavenプロジェクトでのビルドについて。
javafx-maven-plugin
のjfx:native
を使ってビルドしてみる
Windows用のインストーラを作成するためには、上記の表の「事前に必要なソフトウェア」をインストール必要がある。
とりあえず、実行してみて、以下のようなエラーが出ると、必要なソフトウェアが足りてないので、確認してみるとよい。
- Inno Setup(jrsoftware.org // Jordan Russell's Software)がなくて、EXEが作れない
[iscc.exe]バージョン0が検出されましたが、バージョン5が必要です。 構成の問題のため、バンドラEXEインストーラがスキップされました: Inno Setupコンパイラ(iscc.exe)が見つかりません。 次の修正を行ってください: Inno Setup 5以降をhttp://www.jrsoftware.orgからダウンロードし、PATHに追加します。
- WiX(WiX Toolset)が足りなくて、IMSが作れない
構成の問題のため、バンドラMSIインストーラがスキップされました: WiXツール(light.exe、candle.exe)が見つかりません。 次の修正を行ってください: WiX 3.0以降をhttp://wix.sf.netからダウンロードし、PATHに追加します。
ビルド時の注意
JavaFXのビルド自体の仕様として、ビルド時のJAVA_HOMEは、JDK内のJREでなければならない。
そのため、Maven実行時に、JDK内のJREのパスを指定したjava.home
パラメタを渡す必要がある。
Eclipseだとこんな感じ。
ちなみに、ちゃんと指定していないとこんなエラーメッセージが出る
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
インストーラ関連の設定もろもろ
アイコンを変える
インストーラのアイコンはsrc/main/deploy/package/windows/java-fx-sample.ico
に入っている。
これを別のに差し替えればOK
ビルドする形式をEXEだけにする
プラグインの設定で変更。「<bundler>exe</bundler>
を追加すればOK
デフォルトではAll
になっているので、MSIも出力されている感じ
<plugin> <groupId>com.zenjava</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>8.2.0</version> <configuration> <mainClass>jp.sample.javafx.App</mainClass> <bundler>exe</bundler> </configuration> </plugin>
クラスパスを変更する
プラグインの設定で変更。「<bundleArguments/><classpath/>
を追加すればOK
ただし、<bundleArguments>
を追加する際は、併せて<mainJar>
も追加する必要がある。
デフォルトでは、dependencyにあるライブラリへのクラスパスになっている。
以下は、クラスパスを「.」に変更するサンプル
<plugin> <groupId>com.zenjava</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>8.2.0</version> <configuration> <mainClass>jp.sample.javafx.App</mainClass> <bundleArguments> <mainJar>javafx-sample-jfx.jar</mainJar> <classpath>.</classpath> </bundleArguments> </configuration> </plugin>
ビルド時のログを出す。
プラグインの設定で変更。「<verbose>true</verbose>
を追加すればOK
ビルド時のエラーなどがいろいろ見れるので、デバッグが捗る
<plugin> <groupId>com.zenjava</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>8.2.0</version> <configuration> <mainClass>jp.sample.javafx.App</mainClass> <verbose>true</verbose> </configuration> </plugin>
リソースファイルを追加する
プラグインの設定で変更。「<additionalAppResources/>
を追加すればOK
指定したディレクトリの中身がすべて、作成されたJarと同じ場所に配置される。
プロパティファイルなど、jarに含めたくないファイルを扱うときに便利。
ただし、デフォルトのクラスパスには、「.」が含まれないので、クラスパスの変更も必要。
<plugin> <groupId>com.zenjava</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>8.2.0</version> <configuration> <mainClass>jp.sample.javafx.App</mainClass> <additionalAppResources>${project.basedir}/additionalResources</additionalAppResources> </configuration> </plugin>
プラグインで設定できる項目を調べる
jfx:list-bundlers
ゴールで調べることができる。ただし、プラグインのバージョン8.2.0以降
[INFO] --- javafx-maven-plugin:8.2.0:list-bundlers (default-cli) @ sound-commic-vierwer --- [INFO] Available bundlers: [INFO] ------------------- [INFO] ID: windows.app [INFO] Name: Windows Application Image [INFO] Description: A Directory based image of a windows Application with an optionally co-bundled JRE. Used as a base for the Installer bundlers [INFO] Available bundle arguments: [INFO] Argument ID: name [INFO] Argument Type: java.lang.String [INFO] Argument Name: App Name [INFO] Argument Description: The name of the application. [INFO] [INFO] Argument ID: appResources [INFO] Argument Type: com.oracle.tools.packager.RelativeFileSet [INFO] Argument Name: Resources [INFO] Argument Description: All of the files to place in the resources directory. Including all needed jars as assets. [INFO] [INFO] Argument ID: arguments [INFO] Argument Type: java.util.List [INFO] Argument Name: Command Line Arguments [INFO] Argument Description: Command Line Arguments to be passed to the main class if no arguments are specified by the launcher. [INFO] [INFO] Argument ID: classpath [INFO] Argument Type: java.lang.String [INFO] Argument Name: Main Jar Classpath [INFO] Argument Description: The classpath from the main jar of the application, relative to the assembled application directory. [INFO] [INFO] Argument ID: icon.ico [INFO] Argument Type: java.io.File [INFO] Argument Name: .ico Icon [INFO] Argument Description: Icon for the application, in ICO format. [INFO] [INFO] Argument ID: jvmOptions [INFO] Argument Type: java.util.List [INFO] Argument Name: JVM Options [INFO] Argument Description: JVM flags and options to be passed in. [INFO] [INFO] Argument ID: jvmProperties [INFO] Argument Type: java.util.Map [INFO] Argument Name: JVM System Properties [INFO] Argument Description: JVM System Properties (of the -Dname=value variety). [INFO] [INFO] Argument ID: applicationClass [INFO] Argument Type: java.lang.String [INFO] Argument Name: Main Class [INFO] Argument Description: The main class for the application. Either a javafx.application.Application instance or a java class with a main method. [INFO] [INFO] Argument ID: mainJar [INFO] Argument Type: com.oracle.tools.packager.RelativeFileSet [INFO] Argument Name: Main Jar [INFO] Argument Description: The main jar of the application. This jar should have the main-class, and is relative to the assembled application dir. [INFO] [INFO] Argument ID: preferencesID [INFO] Argument Type: java.lang.String [INFO] Argument Name: Preferences ID [INFO] Argument Description: The preferences node to search for User JVM Options. The format be a slash delimited version of the main package name, such as "com/example/myapplication". [INFO] [INFO] Argument ID: preloader [INFO] Argument Type: java.lang.String [INFO] Argument Name: JavaFX Preloader Class Name [INFO] Argument Description: For JavaFX applications only, this is the Fully Qualified Class Name of the preloader class. This class needs to exist in the classpath, preferably early in the path. [INFO] [INFO] Argument ID: userJvmOptions [INFO] Argument Type: java.util.Map [INFO] Argument Name: User JVM Options [INFO] Argument Description: JVM Options the user may override, along with their default values. [INFO] [INFO] Argument ID: appVersion [INFO] Argument Type: java.lang.String [INFO] Argument Name: Version [INFO] Argument Description: The version of this application. [INFO] [INFO] Argument ID: runtime [INFO] Argument Type: com.oracle.tools.packager.RelativeFileSet [INFO] Argument Name: JRE [INFO] Argument Description: The Java Runtime to co-bundle. The default value is the current JRE running the bundler. A value of null will cause no JRE to be co-bundled and the system JRE will be used to launch the application. [INFO] [INFO] ------------------- [INFO] ID: exe [INFO] Name: EXEインストーラ [INFO] Description: InnoIDEを使用したMicrosoft Windows EXEインストーラ。 [INFO] Available bundle arguments: [INFO] Argument ID: name [INFO] Argument Type: java.lang.String [INFO] Argument Name: App Name [INFO] Argument Description: The name of the application. [INFO] [INFO] Argument ID: appResources [INFO] Argument Type: com.oracle.tools.packager.RelativeFileSet [INFO] Argument Name: Resources [INFO] Argument Description: All of the files to place in the resources directory. Including all needed jars as assets. [INFO] [INFO] Argument ID: arguments [INFO] Argument Type: java.util.List [INFO] Argument Name: Command Line Arguments [INFO] Argument Description: Command Line Arguments to be passed to the main class if no arguments are specified by the launcher. [INFO] [INFO] Argument ID: classpath [INFO] Argument Type: java.lang.String [INFO] Argument Name: Main Jar Classpath [INFO] Argument Description: The classpath from the main jar of the application, relative to the assembled application directory. [INFO] [INFO] Argument ID: icon.ico [INFO] Argument Type: java.io.File [INFO] Argument Name: .ico Icon [INFO] Argument Description: Icon for the application, in ICO format. [INFO] [INFO] Argument ID: jvmOptions [INFO] Argument Type: java.util.List [INFO] Argument Name: JVM Options [INFO] Argument Description: JVM flags and options to be passed in. [INFO] [INFO] Argument ID: jvmProperties [INFO] Argument Type: java.util.Map [INFO] Argument Name: JVM System Properties [INFO] Argument Description: JVM System Properties (of the -Dname=value variety). [INFO] [INFO] Argument ID: applicationClass [INFO] Argument Type: java.lang.String [INFO] Argument Name: Main Class [INFO] Argument Description: The main class for the application. Either a javafx.application.Application instance or a java class with a main method. [INFO] [INFO] Argument ID: mainJar [INFO] Argument Type: com.oracle.tools.packager.RelativeFileSet [INFO] Argument Name: Main Jar [INFO] Argument Description: The main jar of the application. This jar should have the main-class, and is relative to the assembled application dir. [INFO] [INFO] Argument ID: preferencesID [INFO] Argument Type: java.lang.String [INFO] Argument Name: Preferences ID [INFO] Argument Description: The preferences node to search for User JVM Options. The format be a slash delimited version of the main package name, such as "com/example/myapplication". [INFO] [INFO] Argument ID: preloader [INFO] Argument Type: java.lang.String [INFO] Argument Name: JavaFX Preloader Class Name [INFO] Argument Description: For JavaFX applications only, this is the Fully Qualified Class Name of the preloader class. This class needs to exist in the classpath, preferably early in the path. [INFO] [INFO] Argument ID: userJvmOptions [INFO] Argument Type: java.util.Map [INFO] Argument Name: User JVM Options [INFO] Argument Description: JVM Options the user may override, along with their default values. [INFO] [INFO] Argument ID: appVersion [INFO] Argument Type: java.lang.String [INFO] Argument Name: Version [INFO] Argument Description: The version of this application. [INFO] [INFO] Argument ID: runtime [INFO] Argument Type: com.oracle.tools.packager.RelativeFileSet [INFO] Argument Name: JRE [INFO] Argument Description: The Java Runtime to co-bundle. The default value is the current JRE running the bundler. A value of null will cause no JRE to be co-bundled and the system JRE will be used to launch the application. [INFO] [INFO] Argument ID: description [INFO] Argument Type: java.lang.String [INFO] Argument Name: Description [INFO] Argument Description: A longer description of the application [INFO] [INFO] Argument ID: copyright [INFO] Argument Type: java.lang.String [INFO] Argument Name: Copyright [INFO] Argument Description: The copyright for the application. [INFO] [INFO] Argument ID: licenseFile [INFO] Argument Type: java.util.List [INFO] Argument Name: License [INFO] Argument Description: The license file, relative to the assembled application directory. [INFO] [INFO] Argument ID: win.menuGroup [INFO] Argument Type: java.lang.String [INFO] Argument Name: Menu Group [INFO] Argument Description: The Start Menu group this application should be placed in [INFO] [INFO] Argument ID: menuHint [INFO] Argument Type: java.lang.Boolean [INFO] Argument Name: Menu Hint [INFO] Argument Description: If the bundler can add the application to the system menu, should it? [INFO] [INFO] Argument ID: shortcutHint [INFO] Argument Type: java.lang.Boolean [INFO] Argument Name: Shortcut Hint [INFO] Argument Description: If the bundler can create desktop shortcuts, should it make one? [INFO] [INFO] Argument ID: systemWide [INFO] Argument Type: java.lang.Boolean [INFO] Argument Name: System Wide [INFO] Argument Description: Should this application attempt to install itself system wide, or only for each user? Null means use the system default. [INFO] [INFO] Argument ID: title [INFO] Argument Type: java.lang.String [INFO] Argument Name: Title [INFO] Argument Description: A title for the application. [INFO] [INFO] Argument ID: vendor [INFO] Argument Type: java.lang.String [INFO] Argument Name: Vendor [INFO] Argument Description: The vendor of the application. [INFO] [INFO] Argument ID: installdirChooser [INFO] Argument Type: java.lang.Boolean [INFO] Argument Name: Install Directory Chooser [INFO] Argument Description: Adds a dialog to let the user choose a directory where the product will be installed. [INFO] [INFO] ------------------- [INFO] ID: msi [INFO] Name: MSIインストーラ [INFO] Description: WiXを使用したMicrosoft Windows MSIインストーラ。 [INFO] Available bundle arguments: [INFO] Argument ID: name [INFO] Argument Type: java.lang.String [INFO] Argument Name: App Name [INFO] Argument Description: The name of the application. [INFO] [INFO] Argument ID: appResources [INFO] Argument Type: com.oracle.tools.packager.RelativeFileSet [INFO] Argument Name: Resources [INFO] Argument Description: All of the files to place in the resources directory. Including all needed jars as assets. [INFO] [INFO] Argument ID: arguments [INFO] Argument Type: java.util.List [INFO] Argument Name: Command Line Arguments [INFO] Argument Description: Command Line Arguments to be passed to the main class if no arguments are specified by the launcher. [INFO] [INFO] Argument ID: classpath [INFO] Argument Type: java.lang.String [INFO] Argument Name: Main Jar Classpath [INFO] Argument Description: The classpath from the main jar of the application, relative to the assembled application directory. [INFO] [INFO] Argument ID: icon.ico [INFO] Argument Type: java.io.File [INFO] Argument Name: .ico Icon [INFO] Argument Description: Icon for the application, in ICO format. [INFO] [INFO] Argument ID: jvmOptions [INFO] Argument Type: java.util.List [INFO] Argument Name: JVM Options [INFO] Argument Description: JVM flags and options to be passed in. [INFO] [INFO] Argument ID: jvmProperties [INFO] Argument Type: java.util.Map [INFO] Argument Name: JVM System Properties [INFO] Argument Description: JVM System Properties (of the -Dname=value variety). [INFO] [INFO] Argument ID: applicationClass [INFO] Argument Type: java.lang.String [INFO] Argument Name: Main Class [INFO] Argument Description: The main class for the application. Either a javafx.application.Application instance or a java class with a main method. [INFO] [INFO] Argument ID: mainJar [INFO] Argument Type: com.oracle.tools.packager.RelativeFileSet [INFO] Argument Name: Main Jar [INFO] Argument Description: The main jar of the application. This jar should have the main-class, and is relative to the assembled application dir. [INFO] [INFO] Argument ID: preferencesID [INFO] Argument Type: java.lang.String [INFO] Argument Name: Preferences ID [INFO] Argument Description: The preferences node to search for User JVM Options. The format be a slash delimited version of the main package name, such as "com/example/myapplication". [INFO] [INFO] Argument ID: preloader [INFO] Argument Type: java.lang.String [INFO] Argument Name: JavaFX Preloader Class Name [INFO] Argument Description: For JavaFX applications only, this is the Fully Qualified Class Name of the preloader class. This class needs to exist in the classpath, preferably early in the path. [INFO] [INFO] Argument ID: userJvmOptions [INFO] Argument Type: java.util.Map [INFO] Argument Name: User JVM Options [INFO] Argument Description: JVM Options the user may override, along with their default values. [INFO] [INFO] Argument ID: appVersion [INFO] Argument Type: java.lang.String [INFO] Argument Name: Version [INFO] Argument Description: The version of this application. [INFO] [INFO] Argument ID: runtime [INFO] Argument Type: com.oracle.tools.packager.RelativeFileSet [INFO] Argument Name: JRE [INFO] Argument Description: The Java Runtime to co-bundle. The default value is the current JRE running the bundler. A value of null will cause no JRE to be co-bundled and the system JRE will be used to launch the application. [INFO] [INFO] Argument ID: description [INFO] Argument Type: java.lang.String [INFO] Argument Name: Description [INFO] Argument Description: A longer description of the application [INFO] [INFO] Argument ID: win.menuGroup [INFO] Argument Type: java.lang.String [INFO] Argument Name: Menu Group [INFO] Argument Description: The Start Menu group this application should be placed in [INFO] [INFO] Argument ID: menuHint [INFO] Argument Type: java.lang.Boolean [INFO] Argument Name: Menu Hint [INFO] Argument Description: If the bundler can add the application to the system menu, should it? [INFO] [INFO] Argument ID: win.msi.productVersion [INFO] Argument Type: java.lang.String [INFO] Argument Name: 製品バージョン [INFO] Argument Description: WindowsおよびMSIに表示されるアプリケーションのバージョン(形式は"1.2.3") [INFO] [INFO] Argument ID: shortcutHint [INFO] Argument Type: java.lang.Boolean [INFO] Argument Name: Shortcut Hint [INFO] Argument Description: If the bundler can create desktop shortcuts, should it make one? [INFO] [INFO] Argument ID: systemWide [INFO] Argument Type: java.lang.Boolean [INFO] Argument Name: System Wide [INFO] Argument Description: Should this application attempt to install itself system wide, or only for each user? Null means use the system default. [INFO] [INFO] Argument ID: vendor [INFO] Argument Type: java.lang.String [INFO] Argument Name: Vendor [INFO] Argument Description: The vendor of the application. [INFO] [INFO] Argument ID: licenseFile [INFO] Argument Type: java.util.List [INFO] Argument Name: License [INFO] Argument Description: The license file, relative to the assembled application directory. [INFO] [INFO] Argument ID: installdirChooser [INFO] Argument Type: java.lang.Boolean [INFO] Argument Name: Install Directory Chooser [INFO] Argument Description: Adds a dialog to let the user choose a directory where the product will be installed. [INFO] [INFO] ------------------- [INFO] ID: jnlp [INFO] Name: WebStart JNLP Bundler [INFO] Description: Creates JNLP files and directory layout for WebStart invocation of the application. [INFO] -------------------