新人批处理编译教程

[转载于CSDN]
作者:cxc014

写了点批处理方面的东东,希望可以给那些对IDE使用不好、而又想写点什么的新人一点帮助吧。勿然下笔,不对之处,还望大家指正。
 首先我们需要建立一个工程目录,暂且建在D:\test下吧。然后在test下再建立源程序目录,资源目录,工具目录,这些都可以配置文件中指定。然后就是我们的三个批处理文件了。
注1:批处理文件都以bat为后缀

注2:很多批处理命令我都没多做解释,具体你可以在CMD窗口输入:命令 /?来查看帮助。

注3:如果你想直接用这个批处理的话,需要progaurd.jar 及kzip,7zip

注4: 如果有问题大家就跟在贴子后哈,我会尽量为你解答:)
==================env.bat===================================
REM 此env.bat为环境配置文件,请根据自身环境情况修改

REM REM表示此行为注释,既不显示也不执行
REM echo[打开或关闭命令回显功能,或显示消息。] @表示本行命令不被显示
@echo off

rem **************** environment dir **********
REM 设置JDK的目录[注:在等号左右不能有空格],引用变量值时为:%变量名%
set JDK=D:\j2sdk1.4.2
REM 设置WTK目录

set J2ME_WTK=D:\wtk22
REM 设置编译和混淆时需要的LIB包,一般在WTK的lib目录下,也可用其它包,比如Nokia的,根据机型而定
rem set J2ME_API=D:\Series_60_MIDP_SDK_2_1_Beta\lib\kmidp20.zip
set J2ME_API=%J2ME_WTK%\lib\cldcapi10.jar;%TOOL_DIR%\lib\midpapi20.jar

rem ******** work dir *********
REM 设置工作目录,%CD%表示当前目录
set PROJ_DIR=%cd%
REM src为源程序目录
set SCR_DIR=%PROJ_DIR%\src
REM res为资源目录
set RES_DIR=%PROJ_DIR%\res
REM  #release为打包结果目录
set RELEASE_DIR=%PROJ_DIR%\#release

rem ****** tools dir *********
REM 设置工具目录
set TOOL_DIR=%PROJ_DIR%\tools

echo on
========================================================
====================config.bat ========================
REM 配置文件,设置项目属性
@echo off
REM 项目名称,既你的jad/Jar包显示的名称
set PROJ_NAME=TestGame
REM 游戏名称,显示在jad的属性栏中,此两名称可以想同
set GAME_NAME=Test Game

REM 设置机型
set PHONE=Triplets
REM 语言
set LANG=%1
REM 这儿用到%1,在批处理的调用中也可以使用参数0~9,0为批处理本身。1~9为参数,用空格隔开。
REM 在批处理中通过%1 ~ %9来引用,如果没有参数则设置为EN
if "%1" == "" set LANG=EN
REM 设置版本号
set VER1=0
set VER2=0
set VER3=1
set VERSION=%VER1%.%VER2%.%VER3%
set PROJ_FULL_NAME=%PROJ_NAME%_%PHONE%
REM 设置Jad/Jar的包名
set ARCHIVE_NAME=%PROJ_FULL_NAME%_%LANG%_%VERSION%
REM 设置主类名称,在创建Jad和混淆时需要用到
set MAIN_CLASS=cMIDlet
set MANIFEST_NAME=Test Game
REM Jad中其它选项
set PROJ_DESCRIPTION=It’s a test project!!!
set VENDOR=Sun Co.
set CLDC=CLDC-1.0
set MIDP=MIDP-2.0

REM 设置是否使用混淆和是否使用压缩,这儿我用的kzip
set OBFUSCATE=true
set USE_KZIP=true
echo on
==================================================================

======================build.bat==================
@echo off

REM 调用配置文件
call env.bat
call config.bat %1

REM 在我们每次build时,可以查看下是否正确
Echo %PROJ_FULL_NAME%
Echo lang-%LANG%
Echo %VERSION%

rem ***************************
REM 我们需要建立一个临时的目录来保存预处理后(可编译的)的代码,如果没有使用到预处理则可以省去此目录
REM _make为我们Build过程中的临时目录,Build完成后删除,这样可保证每次都是build的最新文件
REM 批处理中也可以使用条件判断和括弧,[注:括弧和if/else 一定要在一行上]
REM 判断一个文件或是目录是否存在可以使用if exist或是if not exist
rem ***************************
if not exist tempsrc (
mkdir tempsrc
) else (
del /S/Q tempsrc\*.*
)
if exist _make (
rd _make /Q /S
)
if not exist %RELEASE_DIR% (
md %RELEASE_DIR%
)
REM 进入到_make目录
mkdir _make
cd _make

rem ******************************
REM 这儿我们使用Echo命令来创建Jad和Manifest文件。同样是为了每次的jad和MF都是最新版本的
REM 用>和>>流重定向符,使Echo输出到文件而非默认的显示器,>为新建,>>为追加
rem ******************************
ECHO Manifest-Version: 1.0>                               MANIFEST.MF
ECHO Created-By: 1.4.1_02 (Sun Microsystems Inc.)>>       MANIFEST.MF
ECHO MicroEdition-Configuration: %CLDC%>>                 MANIFEST.MF
ECHO MIDlet-Name: %GAME_NAME%>>                           MANIFEST.MF
ECHO MIDlet-Icon: %ICON%>>                                MANIFEST.MF
ECHO MIDlet-Vendor: %VENDOR%>>                            MANIFEST.MF
ECHO MIDlet-1: %GAME_NAME%, %ICON%, %MAIN_CLASS%>>  MANIFEST.MF
ECHO MIDlet-Version: %VERSION%>>                          MANIFEST.MF
ECHO MicroEdition-Profile: %MIDP%>>                       MANIFEST.MF

rem ******* Jad**************
ECHO MIDlet-Name: %GAME_NAME%>                             %ARCHIVE_NAME%.jad
ECHO MIDlet-Icon: %ICON%>>                                %ARCHIVE_NAME%.jad
ECHO MIDlet-Vendor: %VENDOR%>>                            %ARCHIVE_NAME%.jad
ECHO MIDlet-1: %GAME_NAME%, %ICON%, %MAIN_CLASS%>>  %ARCHIVE_NAME%.jad
ECHO MIDlet-Version: %VERSION%>>                          %ARCHIVE_NAME%.jad
ECHO MIDlet-Jar-URL: %ARCHIVE_NAME%.jar>>                 %ARCHIVE_NAME%.jad
REM 对jar-size这项目,可以使用工具在jar生成后来修改,如果没工具的话,只能手动了^_^
ECHO MIDlet-Jar-Size: >>                                  %ARCHIVE_NAME%.jad

rem ******************************
REM 混淆的选项配置,这儿我只列出了最基本的选项,如果还有其它需求,请查阅:http://proguard.sourceforge.net/
rem ******************************
REM 混淆时所要需要的API包
echo -libraryjars %J2ME_API% > %PROJ_FULL_NAME%.pro
REM 要被混淆的Jar包
echo -injars _%PROJ_FULL_NAME%.jar>> %PROJ_FULL_NAME%.pro
REM 混淆时输出文件
echo -outjar  %PROJ_FULL_NAME%.jar>> %PROJ_FULL_NAME%.pro
REM 让我们的主类名字保留,不然程序找不到入口了
echo -keep public class %MAIN_CLASS%>> %PROJ_FULL_NAME%.pro

rem ******************************
ECHO Compiling…
rem ******************************
md classes
REM 编译源程序到classes目录
"%JDK%\bin\javac"  -bootclasspath "%J2ME_API%" -classpath "%J2ME_API%" -g:none -d classes %SCR_DIR%\*.java

rem *****************************
ECHO Preverify….
rem *****************************
REM 校验[可不需要此步,一般来说要需要对包校验一次既可,也可对编译文件再多校验一次:) ]
"%J2ME_WTK%\bin\preverify.exe" -classpath "%J2ME_API%"; -d output classes
REM 如果校验成功或生成一个目录,由-d选项指定,如果没有-d选项,则默认为output
if not exist output (
REM 在批处理中可以使用GOTO语言,有时如果需要较复杂的循环的话,还是比较有用的
echo *** Error: stop building process by preverify.
pause
goto :end
)

rem ***  copy resources *************
REM 把我们资源目录下的所有东西COPY到output中,进行打包
copy %RES_DIR%\*.* output

rem ******************************
ECHO JAR….
rem ******************************
REM 打包;把tempsrc目录下所有文件,MANIFEST.MF为manifest文件(由m选项指定)打成一个jar包。具体查阅jar.exe /?
"%JDK%\bin\jar.exe" cvfm  _%PROJ_FULL_NAME%.jar MANIFEST.MF -C output .
if not exist _%PROJ_FULL_NAME%.jar (
echo *** Error: stop building process by jar.
pause
goto :end
)

rem ******************************
ECHO Obfuscate…..
rem ******************************
REM 混淆;这儿我们也可把前面的混淆选项依次列在后面,如果怕太长,可以用文件,记得加@
REM 如果不混淆则直接把jar包改名既可
if "%OBFUSCATE%"=="false" (
copy _%PROJ_FULL_NAME%.jar %PROJ_FULL_NAME%.jar > nul
) else (
"%JDK%\bin\java" -jar %TOOL_DIR%\proguard.jar @%PROJ_FULL_NAME%.pro
)

if not exist %PROJ_FULL_NAME%.jar (
echo *** Error: stop building process by Obfuscate.
pause
goto :end
)
rem *****************************
Echo Preverify…
rem *****************************
REM 再次较验,输出到tempJar中
"%J2ME_WTK%\bin\preverify.exe" -classpath "%J2ME_API%" -d tempJar %PROJ_FULL_NAME%.jar

if not exist tempJar\%PROJ_FULL_NAME%.jar (
echo *** Error: stop building process.
goto :end
)

rem ******************************
rem Compress…
rem ******************************
REM 进入tempJar目录,进行压缩
REM 如果不压缩直接改名
cd tempJar
if "%USE_KZIP%"=="true" (
echo **** compressing with Kzip ****
REM 用7za.exe解压,也可以用jar解压
"%TOOL_DIR%\7za.exe" x %PROJ_FULL_NAME%.jar -ozip > NUL
del %PROJ_FULL_NAME%.jar >NUL
cd zip
REM 使用kzip压缩&打包
"%TOOL_DIR%\kzip.exe" /r ..\..\%ARCHIVE_NAME%.jar *.*> NUL
cd ..
rd /s /q zip > NUL
) else (
copy %PROJ_FULL_NAME%.jar ..\%ARCHIVE_NAME%.jar
)
REM 返回到_make目录
cd ..
REM 既得到我们所需要的Jad和Jar包了,COPY到release目录去
copy %ARCHIVE_NAME%.ja* %RELEASE_DIR%\%ARCHIVE_NAME%.ja*
cd ..
REM 删除_make临时文件夹
rd /q /s _make

:end
cd %PROJ_DIR%
REM 如果出错,还是需要删除_make文件夹
if exist _make rd  /Q /S _make

Echo on
=============================================

包已经打成了,那再让我们建一个run来跑来看看效果吧
================================run===================
call env.bat
call config.bat
echo %RELEASE_DIR%\%ARCHIVE_NAME%.jad

%J2ME_WTK%\bin\emulator.exe -Xdevice:DefaultColorPhone -cp %J2ME_API% -Xdescriptor:%RELEASE_DIR%\%ARCHIVE_NAME%.jad