會寫這個主要是一時興起想挑戰用比較新的JavaFx寫一個拿來玩的應用程式,目前還沒想到具體要寫什麼,可能會試試看寫一個可以執行按鍵腳本或是自動連點器之類的小工具。
本來想說idea+maven應該可以很簡單做包檔匯出,實際做起來發現眉眉角角並不少(甚至連GUI程式本體都還沒開始研究…),於是有了這篇專門for IDEA上面包檔匯出JavaFx的GUI程式的筆記了。
JavaFx是什麼 🔗
簡單來說就是用來開發圖形化應用程式的新的API,就是可以寫出exe、jar檔甚至是安裝型應用程式的API。他的前輩是Java AWT與Java Swing,特色是可以配合JavaFX Scene Builder用fxml格式檔案描述物件配置並交由程式處理。
環境配置 🔗
JAVA相關:
- JDK21
- IDE:IntelliJ IDEA 2023.2.8
- JavaFx:21-ea+24 (IDEA自動生成)
- javapackager:1.7.6
其他環境中需要的應用(要加到環境變數Path底下):
- WiX Toolset v3.14:用來生成Windows的應用程式安裝檔 (.msi)。
- Inno Setup 6:一樣是生成安裝檔,但是exe檔案且方便支援安裝精靈GUI頁面(會問你路徑、桌面捷徑那些細節的安裝程序)。
注意上面兩個安裝完要加到環境變數Path裡面,不然後續安裝用的msi和exe不能順利產生,以我這邊為例:
- C:\Program Files (x86)\WiX Toolset v3.14\bin
- C:\Program Files (x86)\Inno Setup 6\
建立專案 🔗
開發環境IDE我使用的是2023.2.8的IDEA,在New Project裡面就可以選擇JavaFx的專案了。
這邊Artifact直接先用預設的demo來做後續示範。

設定打包的進入點 🔗
建立專案後,會有一個HelloApplication的進入點,但是很不幸的是javapackager打包直接設定他為進入會無法成功執行程式,所以我們需要再建一個打包進入點的類別Main.class:
package com.example.demo;
public class Main {
// 讓他去跑程式進入點(這邊是HelloApplication)的main方法
public static void main(String[] args){
HelloApplication.main(args);
}
}
這邊我還沒做好log導流所以無法提供會顯示的錯誤內容,但查GPT的是這樣說的:
🚫 JavaFX 的 Application.launch() 有個坑:
1. 在某些環境中(像打包成原生執行檔時),Application.launch() 會要求 不能從已經 subclass 的 Application 類別中啟動自己,會出 IllegalStateException。
2. 在某些版本的 JavaFX / jpackage 中,main() 方法甚至不會被觸發。
⚠️ 某些打包工具(例如 Launch4j、jpackage)會無法正確找到 main() 方法。
加入Plugin-javapackager 🔗
我這邊專案管理使用maven,把javapackager寫在專案目錄pom.xml的Plugins裡面然後Load Maven Changes:
<plugin>
<groupId>io.github.fvarrui</groupId>
<artifactId>javapackager</artifactId>
<version>1.7.6</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>package</goal>
</goals>
<configuration>
<mainClass>com.example.demo.Main</mainClass> <!-- 指向打包進入點的class -->
<bundleJre>true</bundleJre> <!-- 是否自己包含JRE,建議開true不然用戶電腦自己沒JRE就跑不了你的程式 -->
<generateInstaller>true</generateInstaller> <!-- 是否產生安裝型檔案 -->
<administratorRequired>false</administratorRequired> <!-- 是否需要系統管理員權限 -->
<platform>windows</platform> <!-- apple、linux的我這邊還沒研究 -->
<winConfig>
<generateSetup>true</generateSetup> <!-- 預設就是true,產生exe的安裝檔(需要Inno Setup) -->
<!-- 這些是Inno Setup安裝精靈頁面的設定,詳細文件可以看下面連結 -->
<!-- https://github.com/javapackager/JavaPackager/blob/master/docs/windows-specific-properties.md -->
<disableDirPage>false</disableDirPage>
<disableProgramGroupPage>false</disableProgramGroupPage>
<disableFinishedPage>false</disableFinishedPage>
<createDesktopIconTask>true</createDesktopIconTask>
</winConfig>
</configuration>
</execution>
</executions>
</plugin>
執行打包指令 🔗
這邊直接進行打包
mvn clean package
完成後,專案目錄下會生成target資料夾,有幾個值得注意的部分:
- demo/:這個是跟著artifact名稱的資料夾,裡面包含一個exe檔案和JRE、lib,基本上這個資料夾就是免安裝版的程式。
- demo_1.0-SNAPSHOT.exe:Inno Setup產生的安裝檔,由於上面有開一些安裝精靈流程,這邊這個exe會有比較詳細的安裝流程
- demo_1.0-SNAPSHOT.msi:WiX Toolset生成的windows應用安裝檔,預設不會有安裝精靈,執行就會直接安裝。
至此,我們得到免安裝版程式、安裝exe/msi,這大概就是包版的流程。

然後就可以邁向正式的GUI應用開發了,可喜可賀w,不過這個可能要等之後再說,有可能今年的itHome鐵人賽就拿這個來試試看參賽?