在 J2ME 遊戲開發中,將遊戲移植到不同手機型號向來是開發者的痛點。螢幕解析度、色深、支援的 JSR 擴展包、記憶體限制……每款裝置都有獨特的硬體規格與 API 差異。傳統做法往往需要維護多套原始碼,或是用大量 if-else 判斷散落在業務邏輯中,維護成本極高。
NetBeans IDE(早期版本)透過 Project Configuration(專案配置) 機制,提供了一套優雅的解決方案:將「裝置差異」抽象為「配置屬性」,並在建構過程中自動進行程式碼裁剪與資源打包。本文詳細拆解此機制的核心概念與實戰用法。
每一個 Configuration 代表一個目標裝置群組(例如「Nokia S40 系列 240x320」或「Sony Ericsson MIDP 2.0 176x220」),包含以下五大屬性面向:
bootclasspath 與預驗證目標自訂鍵值對屬性,供前置處理器判斷使用。常見範例:
ScreenSize="176x220"ScreenColorDepth=16HasTouchScreen=falseMaxJarSize=65536SupportJSR184=true這些屬性純粹由開發者定義,NetBeans 不解釋其語義,僅在前置處理時作為條件判斷依據。
以 Ant 模式匹配決定哪些 .java 檔案參與編譯。典型用法:
**/common/** — 所有配置共用的核心邏輯**/nokia/** — 僅 Nokia 配置編譯的專用類別**/ui/** — 通用 UI,但可再搭配子資料夾細分若將圖片、音效等資源同置於 src 目錄下,同樣可用此機制控制資源打包。
res/nokia/、res/sony/),解決不同裝置需不同解析度圖片、不同音效格式的問題MyGame-${cfg.name}.jarMIDlet-Name、MIDlet-Vendor、MicroEdition-Profile 等)在原始碼中使用 //#if、//#elif、//#endif 註解指示符,NetBeans 建構時會依據 Active Configuration 的 Abilities 屬性,自動將不符合條件的程式碼區塊「註解化」,只編譯目標裝置需要的邏輯。
//#if ScreenSize == "128x160"
int tileWidth = 12;
//#elif ScreenSize == "176x208"
int tileWidth = 16;
//#elif ScreenSize == "240x320"
int tileWidth = 20;
//#else
int tileWidth = 12; // 預設回落
//#endif
關鍵優勢:
點選專案右鍵 → Build All Project Configurations,NetBeans 會依序對每個 Configuration 執行完整建構流程,並在 dist/ 目錄下產生以配置命名的子資料夾:
dist/
├── Nokia_S40_240x320/
│ ├── MyGame.jad
│ └── MyGame.jar
├── SE_MIDP2_176x220/
│ ├── MyGame.jad
│ └── MyGame.jar
└── Generic_MIDP1_128x128/
├── MyGame.jad
└── MyGame.jar
此功能極適合 CI/CD 整合,一次提交即可產出全機種安裝包。
ScreenWidth、ScreenHeight、HeapSizeKB),避免同義詞混亂。common/,平台相關介面定義於 api/,具體實作於各配置專屬套件。res/common/,差異資源放 res/${cfg.name}/,建構腳本自動合併。ant build-all-configs,自動發布至測試平台。NetBeans 的 Configuration 機制將「裝置碎片化」轉化為「可配置的建構參數」,配合前置處理器實現編譯期程式碼裁剪,是 J2ME 時代極具前瞻性的工程化方案。雖然 J2ME 已淡出主流舞台,但這套「配置驅動建構、條件編譯、多產出物」的思維,在現代 Android Flavor、iOS Target、Webpack Multi-Compiler、Flutter Flavor 等跨平台建構體系中依然熠熠生輝。