擺脫 IDE 依賴,採用批處理腳本實現 J2ME 專案「一鍵構建、多機型發布、持續集成就緒」。本文提供生產級 env.bat、config.bat、build.bat、run.bat 四腳本體系,覆蓋環境隔離、項目配置、全流程構建與模擟器驗證。
D:\test\ ← 專案根目錄
├── src\ ← Java 源碼
├── res\ ← 資源文件 (圖片、配置、數據)
├── tools\ ← 構建工具
│ ├── proguard.jar ← 混淆器
│ ├── kzip.exe ← 最優壓縮
│ └── 7za.exe ← 7-Zip 解壓
├── #release\ ← 輸出目錄 (JAR/JAD)
├── env.bat ← 環境變量 (機器相關)
├── config.bat ← 項目配置 (專案相關)
├── build.bat ← 構建主流程
└── run.bat ← 模擟器運行驗證
@echo off
set JDK=D:\j2sdk1.4.2
set J2ME_WTK=D:\wtk22
set J2ME_API=%J2ME_WTK%\lib\cldcapi10.jar;%J2ME_WTK%\lib\midpapi20.jar
set PROJ_DIR=%CD%
set SCR_DIR=%PROJ_DIR%\src
set RES_DIR=%PROJ_DIR%\res
set RELEASE_DIR=%PROJ_DIR%\#release
set TOOL_DIR=%PROJ_DIR%\tools
echo on
原則:僅包含機器差異路徑,嚴禁項目業務配置,便於團隊成員按本機實際路徑修改。
@echo off
set PROJ_NAME=MyGame
set GAME_NAME=My Game
set PHONE=DefaultColorPhone
set LANG=%1
if "%1"=="" set LANG=EN
set VER1=1 & set VER2=0 & set VER3=0
set VERSION=%VER1%.%VER2%.%VER3%
set PROJ_FULL_NAME=%PROJ_NAME%_%PHONE%
set ARCHIVE_NAME=%PROJ_FULL_NAME%_%LANG%_%VERSION%
set MAIN_CLASS=com.game.MainMIDlet
set ICON=/icon.png
set VENDOR=MyCompany
set CLDC=CLDC-1.1
set MIDP=MIDP-2.0
set PROJ_DESCRIPTION=Awesome J2ME Game
set OBFUSCATE=true
set USE_KZIP=true
echo on
支持命令行參數:build.bat CN → LANG=CN,實現多語言包一鍵構建。
@echo off
call env.bat
call config.bat %1
REM 顯示關鍵信息確認
echo Building %PROJ_FULL_NAME% lang=%LANG% ver=%VERSION%
REM 清理/準備臨時目錄
if not exist tempsrc mkdir tempsrc
if exist _make rd /s /q _make
mkdir _make
cd _make
REM 生成 Manifest (每次構建最新)
echo Manifest-Version: 1.0 > MANIFEST.MF
echo MIDlet-Name: %GAME_NAME% >> MANIFEST.MF
echo MIDlet-Version: %VERSION% >> MANIFEST.MF
echo MIDlet-Vendor: %VENDOR% >> MANIFEST.MF
echo MIDlet-1: %GAME_NAME%,%ICON%,%MAIN_CLASS% >> MANIFEST.MF
echo MicroEdition-Profile: %MIDP% >> MANIFEST.MF
echo MicroEdition-Configuration: %CLDC% >> MANIFEST.MF
REM 生成 JAD
echo MIDlet-Name: %GAME_NAME% > %ARCHIVE_NAME%.jad
echo MIDlet-Version: %VERSION% >> %ARCHIVE_NAME%.jad
echo MIDlet-Vendor: %VENDOR% >> %ARCHIVE_NAME%.jad
echo MIDlet-1: %GAME_NAME%,%ICON%,%MAIN_CLASS% >> %ARCHIVE_NAME%.jad
echo MIDlet-Jar-URL: %ARCHIVE_NAME%.jar >> %ARCHIVE_NAME%.jad
echo MIDlet-Jar-Size: >> %ARCHIVE_NAME%.jad REM 稍後回填
echo MicroEdition-Profile: %MIDP% >> %ARCHIVE_NAME%.jad
echo MicroEdition-Configuration: %CLDC% >> %ARCHIVE_NAME%.jad
REM ProGuard 配置
echo -libraryjars %J2ME_API% > %PROJ_FULL_NAME%.pro
echo -injars _%PROJ_FULL_NAME%.jar >> %PROJ_FULL_NAME%.pro
echo -outjar %PROJ_FULL_NAME%.jar >> %PROJ_FULL_NAME%.pro
echo -keep public class %MAIN_CLASS% >> %PROJ_FULL_NAME%.pro
REM 1. 編譯
mkdir classes
"%JDK%\bin\javac" -bootclasspath "%J2ME_API%" -classpath "%J2ME_API%" -g:none -d classes %SCR_DIR%\*.java
REM 2. 預驗證
"%J2ME_WTK%\bin\preverify.exe" -classpath "%J2ME_API%" -d output classes
if not exist output goto :ERROR
REM 3. 複製資源
copy %RES_DIR%\*.* output
REM 4. 打包初版 JAR
"%JDK%\bin\jar.exe" cvfm _%PROJ_FULL_NAME%.jar MANIFEST.MF -C output .
if not exist _%PROJ_FULL_NAME%.jar goto :ERROR
REM 5. 混淆 (可選)
if "%OBFUSCATE%"=="true" (
"%JDK%\bin\java" -jar %TOOL_DIR%\proguard.jar @%PROJ_FULL_NAME%.pro
) else (
copy _%PROJ_FULL_NAME%.jar %PROJ_FULL_NAME%.jar > nul
)
if not exist %PROJ_FULL_NAME%.jar goto :ERROR
REM 6. 二次預驗證 (混淆後必須)
"%J2ME_WTK%\bin\preverify.exe" -classpath "%J2ME_API%" -d tempJar %PROJ_FULL_NAME%.jar
if not exist tempJar\%PROJ_FULL_NAME%.jar goto :ERROR
REM 7. 壓縮優化 (可選)
cd tempJar
if "%USE_KZIP%"=="true" (
%TOOL_DIR%\7za.exe x %PROJ_FULL_NAME%.jar -ozip > NUL
del %PROJ_FULL_NAME%.jar > NUL
cd zip
%TOOL_DIR%\kzip.exe /r ..\..\%ARCHIVE_NAME%.jar *.* > NUL
cd ..
rd /s /q zip > NUL
) else (
copy %PROJ_FULL_NAME%.jar ..\%ARCHIVE_NAME%.jar
)
cd ..
REM 8. 回填 JAR 大小到 JAD
REM 這裡需額外工具或手動,腳本簡化略過
REM 9. 輸出成品
copy %ARCHIVE_NAME%.ja* %RELEASE_DIR%\
cd ..
rd /s /q _make
goto :END
:ERROR
echo *** BUILD FAILED ***
pause
:END
cd %PROJ_DIR%
if exist _make rd /s /q _make
_make/ 構建中間產物,構建結束自動清理,保證幂等性if not exist ... goto :ERROR 防止產出殘缺包MAJOR.MINOR.PATCH 三段式,配合語言代碼生成唯一 ARCHIVE_NAME
call env.bat
call config.bat
"%J2ME_WTK%\bin\emulator.exe" -Xdevice:DefaultColorPhone -cp %J2ME_API% -Xdescriptor:%RELEASE_DIR%\%ARCHIVE_NAME%.jad
build.xml / pom.xml 替代批處理,獲得依賴管理、增量構建、CI 集成config.bat 參數化 PHONE、J2ME_API (廠商 SDK),循環調用構建多機型包emulator -Xautotest 運行單元測試 MIDletjadtool / jarsigner 實現可信套件簽名將構建邏輯腳本化、參數化、版本化,是從「手工作坊」邁向「工程化交付」的關鍵一步。