Java SE 6 Update 10 引入的下一代 Java Plug-in 技術,徹底重寫 Applet 執行架構,引入 JNLP (Java Network Launching Protocol) 原生支援,解決舊版 Applet 可靠性差、啟動慢、JS 互操作弱等痛點。本文深度解析新架構、關鍵參數、兼容策略,並以 NASA World Wind Applet 為例展示企業級 3D 地球可視化應用部署實戰。

separate_jvm=true 獨立隔離。新插件直接解析 JNLP 文件啟動 Applet,複用 Java Web Start 成熟生態:
<applet width="500" height="500">
<param name="jnlp_href" value="my_applet.jnlp"/>
</applet>
<resources> 聲明 JAR、原生庫、屬性、JRE 版本、OS/架構過濾。<extension> 引用共享庫(如 JOGL、World Wind),多 Applet 共享下載、緩存、版本管理。<update check="background"/> 後台檢查更新,啟動即用緩存版本。<param> 合併 HTML <param>,HTML 同名參數優先(除 java_arguments/java_version)。| 參數 | 作用 | 示例 |
|---|---|---|
| jnlp_href | 指定 JNLP 描述符 URL,啟用新架構 | my_app.jnlp |
| java_arguments | JVM 啟動參數(堆大小、GC、系統屬性) | -Xmx256m -Dsun.java2d.noddraw=true |
| java_version | 請求特定 JRE 版本(JNLP 中 <j2se version="1.7+"> 同效) | 1.6.0_10+ |
| separate_jvm | true=獨立 JVM 隔離,false=共享 JVM(預設) | true |
| image | 載入中顯示的圖片(支援動畫 GIF) | loading.gif |
| boxborder | false=隱藏載入區域 1px 邊框,避免閃爍 | false |
| centerimage | true=載入圖片居中顯示 | true |
<applet archive="app.jar" code="Main" width="300" height="300">
<param name="java_arguments" value="-Xmx256m -Dsun.java2d.noddraw=true"/>
</applet>
-Dsun.java2d.noddraw=true 禁用 DirectDraw,解決 Windows 上 OpenGL (JOGL) 與 Java 2D 驅動衝突,3D Applet 必加。
舊版 JRE 忽略 jnlp_href,使用傳統 archive/code 啟動;新插件忽略 archive/code,專用 JNLP。單一 HTML 同時支援新舊環境:
<applet id="wwjApplet" width="600" height="380"
code="gov.nasa.worldwind.examples.applet.WWJApplet"
archive="BackwardCompatibility.jar">
<param name="jnlp_href" value="WWJApplet.jnlp"/>
</applet>
BackwardCompatibility.jar 內含極簡啟動類,僅提示用戶更新 JRE;新環境直接走 JNLP 載入完整應用。

<jnlp href="WWJApplet.jnlp">
<resources os="Windows">
<property name="sun.java2d.noddraw" value="true"/>
</resources>
<resources>
<j2se version="1.4+" href="https://java.sun.com/products/autodl/j2se"/>
<jar href="worldwind.jar" main="true"/>
<extension name="jogl" href="https://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp"/>
</resources>
<applet-desc name="WWJ Applet"
main-class="gov.nasa.worldwind.examples.applet.WWJApplet"
width="100" height="100"/> <!-- 寬高由 HTML 覆蓋 -->
</jnlp>
worldwind.jar 設為 main="true",理想情況應發佈為 JNLP 擴展 (<extension name="worldwind" href="..."/>),多應用共享下載。-Dsun.java2d.noddraw=true 避免驅動衝突。<a href="javascript:gotoLocation(MOUNT_RAINIER);">Mount Rainier</a>
function gotoLocation(locStr) {
var params = locStr.split(';');
if (params.length == 3) {
getWWJApplet().gotoLatLon(parseFloat(params[1]), parseFloat(params[2]));
}
}
JS 調用 Applet 公開方法 gotoLatLon(lat, lon),Applet 在獨立執行緒執行動畫飛行,JS 立即返回不阻塞 UI。新插件 JS-Java 橋接效能顯著提升,支援基本類型、陣列、Java 物件自動轉換。
<extension name="worldwind" href="https://worldwind.arc.nasa.gov/java/0.4.1/webstart/worldwind.jnlp"/>
<extension name="jogl" href=".../jogl.jnlp"/>
主 JNLP 僅引用擴展,自有 MyWWJApplet extends WWJApplet {} 打包為獨立 JAR 設為 main="true",符合 JNLP 語義要求主類在主 JNLP 定義。
Java SE 6u10 隨附 Deployment Toolkit (deployJava.js),自動檢測 JRE 版本、生成最佳 <applet>/<object> 標籤、提示安裝/更新,簡化跨瀏覽器部署:
<script src="https://java.com/js/deployJava.js"></script>
<script>
deployJava.runApplet({
jnlp: "WWJApplet.jnlp",
width: "600", height: "380"
}, { version: "1.6.0_10+" }, {});
</script>
下一代 Java Plug-in 以 JNLP 為核心,實現 Applet 與 Web Start 統一分發模型,架構重設計帶來可靠性、效能、隔離性質變。雖然瀏覽器插件技術已隨 NPAPI 淘汰退出歷史舞台,但其設計思想(獨立進程、聲明式資源、沙箱安全、JS 深度互操作)深刻影響後續 Java Web 技術演進(JavaFX、JWebSocket、GraalVM 瀏覽器運行時等)。