Java Web Start (JWS) 是 JSR-56 規範的參考實現,旨在解決「富客戶端應用一鍵部署、自動更新、脫離瀏覽器獨立運行」的難題。JDK 1.4+ 已內置 JWS,無需額外安裝。
| 特性 | JWS | Applet | 傳統桌面安裝 |
|---|---|---|---|
| 部署方式 | 點擊 .jnlp 鏈接,自動下載啟動 | 網頁嵌入 | 手動運行安裝包 |
| 緩存與更新 | 本地緩存,啟動時檢查服務器版本,增量更新 | 瀏覽器緩存,難控制 | 需手動檢查/推送更新 |
| JRE 隔離 | 每應用獨立 JVM,可指定 JRE 版本 | 共享瀏覽器 JVM | 需捆綁或依賴系統 JRE |
| 安全模型 | 簽名 JAR 授權訪問本地資源(I/O、網絡) | 沙箱嚴格受限 | 完全信任 |
| 桌面集成 | 生成桌面快捷方式/開始菜單,離線啟動 | 無 | 原生支持 |
import javax.swing.*;
import java.awt.*;
public class HelloJNLP extends JFrame {
public HelloJNLP() {
super("Hello JNLP");
String loadedFrom = this.getClass().getClassLoader().toString();
JLabel label = new JLabel("Loaded by: " + loadedFrom);
add(label);
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new HelloJNLP().setVisible(true));
}
}
javac HelloJNLP.java
jar cvf HelloJNLP.jar HelloJNLP.class
# 生成密鑰庫
keytool -genkey -keystore mykeystore -alias mysigner
# 簽名
jarsigner -keystore mykeystore HelloJNLP.jar mysigner
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="https://yourserver.com/apps/" href="HelloJNLP.jnlp">
<information>
<title>Hello JNLP Demo</title>
<vendor>Your Company</vendor>
<homepage href="https://yourserver.com"/>
<description>First JWS Application</description>
<icon href="icon.gif"/>
<offline-allowed/>
</information>
<security>
<all-permissions/> <!-- 需簽名 -->
</security>
<resources>
<j2se version="1.8+" href="https://java.sun.com/products/autodl/j2se"/>
<jar href="HelloJNLP.jar" main="true"/>
</resources>
<application-desc main-class="HelloJNLP"/>
</jnlp>
application/x-java-jnlp-file .jnlpcodebase 目錄下。在 <resources> 中標記 download="lazy" 的 JAR 將在首次使用時下載,適合插件模塊、大型數據文件。
<resources os="Windows" arch="x86_64">
<nativelib href="native-windows-amd64.jar"/>
</resources>
<application-desc main-class="com.example.Main">
<argument>arg1</argument>
<argument>arg2</argument>
</application-desc>
主類通過 String[] args 接收。
<shortcut online="true"/>:有網時檢查更新。<update check="background" policy="always"/>:後台靜默更新,下次啟動生效。href 建議包含版本(如 app-v1.2.jnlp),服務器端維護最新版本入口。<j2se version="1.8*" 支持通配,客戶端無合適 JRE 會自動引導下載。<information> 中聲明 <shortcut>,且用戶首次啟動時確認授權。JWS 為 Java 富客戶端提供了「Web 化部署、桌面級體驗」的最佳平衡。雖然 Java 9 起模塊化系統帶來新挑戰,且 Oracle 計劃長期移除 JWS(推遷移至 jlink/jpackage 或 Web 技術),但在存量系統維護、內網桌面應用分發場景,JWS 依然是成熟可靠的選擇。掌握 JNLP 結構、簽名發布、緩存更新機制,能讓你從容應對遷移前的運維需求。