標準 JDK 不提供生成平台專屬執行檔工具,但實務上將 Java 應用程式打包為 Windows .exe 有多種成熟方案。本文比較四大主流方法:第三方打包工具、商業安裝程式、可執行 JAR、Java Web Start,助你依專案需求選型。
| 方案 | 適用場景 | 優點 | 缺點 | 代表工具 |
|---|---|---|---|---|
| 第三方打包工具 | 需單一 .exe、無安裝過程、客製化啟動圖示/參數 | 輸出真 .exe、可隱藏 Java 特徵、啟動快 | 多為收費、版本相容性需測試、偵錯較難 | JexePack, JSmooth, Launch4j, Excelsior JET |
| 商業安裝程式 | 企業級部署、需安裝精靈、捷徑、註冊表、自動更新 | 完整安裝體驗、支援複雜部署邏輯、跨平台 | 學習曲線陡、成本高、安裝包體積大 | InstallAnywhere, InstallShield, IzPack (開源) |
| 可執行 JAR | 跨平台部署、簡單分發、開發環境已有 JRE | 標準 Java 方式、無額外工具、極小體積 | 需用戶預裝 JRE、雙擊執行需關聯、無啟動圖示客製 | jar 命令, Maven Shade Plugin, Gradle Shadow Plugin |
| Java Web Start | 頻繁更新、企業內部分發、需自動版本管理、離線支援 | 自動更新/版本檢查、JRE 版本驗證、沙箱安全、離線快取 | Java 11 後移出 JDK、瀏覽器支援度下降、需 Web 伺服器 | JNLP, Java Web Start (JDK 8u/11 獨立包) |
<launch4jConfig>
<dontWrapJar>false</dontWrapJar>
<headerType>gui</headerType>
<jar>dist/myapp.jar</jar>
<outfile>dist/MyApp.exe</outfile>
<icon>src/main/resources/icon.ico</icon>
<jre>
<minVersion>1.8.0</minVersion>
<initialHeapSize>64</initialHeapSize>
<maxHeapSize>512</maxHeapSize>
</jre>
<versionInfo>
<fileVersion>1.0.0</fileVersion>
<productName>MyApp</productName>
<companyName>MyCompany</companyName>
</versionInfo>
</launch4jConfig>
Manifest-Version: 1.0
Main-Class: com.example.MainClass
Class-Path: lib/dependency1.jar lib/dependency2.jar
jar cvfm MyApp.jar MANIFEST.MF -C build/classes .java -jar MyApp.jar 或雙擊 (需關聯 javaw.exe)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
</execution>
</executions>
</plugin>
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="https://myapp.com/" href="launch.jnlp">
<information>
<title>My Enterprise App</title>
<vendor>MyCompany</vendor>
<homepage href="https://myapp.com/"/>
<description>Enterprise Application</description>
<icon href="icon.png"/>
<offline-allowed/>
</information>
<security>
<all-permissions/> <!-- 需簽名 JAR -->
</security>
<resources>
<j2se version="1.8+" href="https://java.sun.com/products/autodl/j2se"/>
<jar href="MyApp.jar" main="true"/>
<jar href="lib/dependency.jar"/>
</resources>
<application-desc main-class="com.example.MainClass"/>
</jnlp>
開始
│
├─ 需單一 .exe、無安裝程式、極致簡單分發?
│ ├─ 是 → Launch4j / jpackage (含 JRE)
│ └─ 否
│
├─ 需自動更新、版本管理、企業內部分發?
│ ├─ 是 → Java Web Start (OpenWebStart) / 自建更新器
│ └─ 否
│
├─ 需跨平台、標準 Java、用戶已裝 JRE?
│ ├─ 是 → 可執行 JAR (Maven Shade/Gradle Shadow)
│ └─ 否
│
├─ 需完整安裝精靈、系統整合、企業級部署?
│ ├─ 是 → InstallAnywhere / IzPack / jpackage (原生安裝包)
│ └─ 否
│
└─ 極致效能、微服務、Serverless、原生互操作?
└─ 是 → GraalVM Native Image
jpackage (JDK 14+) 產生原生安裝包,含 JRE、啟動器、系統整合Launch4j + Maven Shade 產生獨立 .exeDocker 容器映像 (非 .exe,但為標準部署單元)GraalVM Native ImageOpenWebStart 維護 JNLP 方案「打包為 .exe」非單一答案,而是依分發模式、目標環境、更新策略、平台支援選型。現代專案首推 jpackage (官方標準) 或 Launch4j (成熟開源);企業級部署用 InstallAnywhere/IzPack;雲原生直接用 容器映像;極致效能考慮 GraalVM。理解各方案本質取捨,才能做出最適架構決策。