J2ME 遊戲/應用提交至行動平台 (如 Nokia、Siemens、Motorola 等運營商商店) 時,若直接使用 J2ME Wireless Toolkit (WTK) 或 IDE 內建打包:
Antenna 是專為 J2ME 設計的 Ant Task 库,封裝 WTK 的編譯、預驗證、打包、混淆、模擬器啟動等功能,實現**可重現、可配置、可整合 CI** 的自動化構建流程。
<?xml version="1.0" encoding="UTF-8"?>
<project name="LoveNote_S40" default="build" basedir=".">
<!-- 使用 classic 編譯器 (相容舊版 JDK) -->
<property name="build.compiler" value="classic"/>
<!-- WTK 安裝路徑 (關鍵:提供 bootclasspath、預驗證器、模擬器) -->
<property name="wtk.home" value="C:/WTK104"/>
<!-- 專案屬性 -->
<property name="midlet.name" value="LoveNote_S40"/>
<property name="midlet.home" value="."/>
<!-- 載入 Antenna Tasks -->
<taskdef resource="antenna.properties"/>
<target name="clean">
<delete failonerror="false" dir="classes"/>
<delete failonerror="false">
<fileset dir=".">
<exclude name="build.xml"/>
</fileset>
</delete>
</target>
<target name="build">
<!-- 1. 產生 JAD 檔 (含 MIDlet 資訊、圖示、類別名) -->
<wtkjad jadfile="${midlet.name}.jad"
jarfile="${midlet.name}.jar"
name="LoveNote"
vendor="websurf tech co., inc."
manifest="MANIFEST.MF"
version="1.0">
<midlet name="LoveNote" icon="/icons/icon.png" class="GameMidlet"/>
</wtkjad>
<!-- 2. 清理並建立編譯輸出目錄 -->
<delete dir="classes"/>
<mkdir dir="classes"/>
<!-- 3. 編譯 Java 原始碼 (不預驗證) -->
<wtkbuild srcdir="${midlet.home}"
destdir="classes"
preverify="false"
encoding="utf-8"/>
<!-- 4. 打包 JAR (含資源檔、混淆) -->
<wtkpackage jarfile="${midlet.name}.jar"
jadfile="${midlet.name}.jad"
manifest="MANIFEST.MF"
obfuscate="true">
<fileset dir="classes"/>
<fileset dir="res"/>
</wtkpackage>
<!-- 5. 預驗證 (關鍵步驟!) -->
<wtkpreverify jarfile="${midlet.name}.jar"
jadfile="${midlet.name}.jad"
bootclasspath="${wtk.home}/lib/midpapi.zip"
classpath="${wtk.home}/lib/ext/nokiaui.jar"/>
<!-- 6. (可選) 啟動模擬器測試 -->
<!--
<wtkrun jadfile="${midlet.name}.jad"
wait="false"
device="DefaultColorPhone"/>
-->
</target>
</project>
| Task | 功能 | 關鍵屬性 |
|---|---|---|
| `wtkjad` | 產生 JAD 描述檔 | `jadfile`、`jarfile`、`name`、`vendor`、`version`、`midlet` 子元素 |
| `wtkbuild` | 編譯 Java 源碼 | `srcdir`、`destdir`、`preverify` (建議 false,分步驟)、`bootclasspath`、`classpath` (廠商 API) |
| `wtkpackage` | 打包 JAR、可選混淆 | `jarfile`、`jadfile`、`manifest`、`obfuscate="true"`、嵌套 `fileset` |
| `wtkpreverify` | **CLDC 預驗證** (核心!) | `jarfile`、`jadfile`、`bootclasspath` (midpapi.zip)、`classpath` (廠商 API) |
| `wtkrun` | 啟動模擬器測試 | `jadfile`、`device`、`wait` |
構建完成後,`build.xml` 同目錄產生 `MANIFEST.MF`,建議**手工編輯 JAD** 補充平台要求屬性:
MicroEdition-Profile: MIDP-1.0
MicroEdition-Configuration: CLDC-1.0
Media-Price: 5元每次
Nokia-MIDlet-Category: Game
Nokia-MIDlet-Original-File-Name: LoveNote_S40.jar
...
將修改後的 JAD 替換進 JAR (或重新打包),可減小體積並通過平台審核。
J2ME 發布的核心痛點在於**平台碎片化**導致的 API 相容與預驗證要求。**Ant + Antenna** 提供標準化、自動化、可配置的構建流程,解決:
雖然 J2ME 時代已遠去,但**構建自動化、平台適配、預驗證/驗證機制**的工程思維,在 Android (Gradle + ProGuard/R8)、iOS (xcodebuild + Bitcode)、嵌入式交叉編譯等現代場景依然完全適用。