新年快乐!
经常看到有人问,如何用javac编译多个子目录,现在呈上。
按习惯,不废话,直接上源码。
先说一下目录结构:
%CD%/src---------------------源码目录
/webroot/------------输出目录
/lib---------依赖的.jar
/classes---编译输出目录
主文件:build_compile_batch.cmd
@ECHO OFF
REM 生成自动编译的批处理文件名
SET BAT=_compile_auto.cmd
REM 包含运行
SET WITH_RUN=1
REM SETLOCAL enableDelayedExpansion
ECHO @ECHO OFF>%BAT%
REM 编译后要运行的主类
ECHO SET mainclass=org.mega.MyDemoProgram>>%BAT%
ECHO SETLOCAL enableDelayedExpansion>>%BAT%
ECHO.>>%BAT%
ECHO SET CUR=%%CD%%>>%BAT%
REM 输出目录
ECHO SET OUTPUT=%%CUR%%/webroot>>%BAT%
ECHO CD %%OUTPUT%%>>%BAT%
REM 编译的输出目录
ECHO REM RMDIR /s /q classes>>%BAT%
ECHO IF NOT EXIST classes MKDIR classes>>%BAT%
ECHO CD %%CUR%%>>%BAT%
ECHO.>>%BAT%
ECHO SET CP=%%OUTPUT%%/classes>>%BAT%
REM 准备源码的子目录(包)
ECHO FOR %%%%a IN ( %%OUTPUT%%/lib/*.jar ) DO SET CP=!CP!;%%%%a>>%BAT%
ECHO.>>%BAT%
ECHO SET OPT=-d %%OUTPUT%%/classes -cp %%CP%% -encoding utf-8>>%BAT%
FOR /d %%a IN ( src/*.* ) DO cmd /c build_compile_batch-sub.cmd %%a
ECHO.>>%BAT%
ECHO ECHO 正在编译...>>%BAT%
ECHO javac %%OPT%% %%JFILES%%>>%BAT%
ECHO.>>%BAT%
ECHO IF "%%errorlevel%%" equ "0" (>>%BAT%
ECHO ECHO 编译成功,正在拷贝资源文件...>>%BAT%
ECHO xcopy /i /y src/*.* %%OUTPUT%%/classes>>%BAT%
IF "%WITH_RUN%" EQU "1" (
ECHO SET CP=.;!CP!>>%BAT%
ECHO CD %%OUTPUT%%/classes>>%BAT%
ECHO cd>>%BAT%
ECHO REM ECHO !CP!>>%BAT%
ECHO ECHO 编译完成,正在运行...>>%BAT%
ECHO java -cp !CP! %%mainclass%%>>%BAT%
)
ECHO pause>>%BAT%
ECHO ) ELSE (>>%BAT%
ECHO pause>>%BAT%
ECHO )>>%BAT%
PAUSE
辅助文件:
build_compile_batch-sub.cmd
@ECHO OFF
IF "%1" NEQ "" (
echo %1
IF EXIST %1/*.java (
REM 如果有.java文件,则添加到编译列表
ECHO SET JFILES=%%JFILES%% %1/*.java>>%BAT%
)
REM 处理更深层的包
FOR /d %%b IN ( %1/*.* ) DO cmd /c "build_compile_batch-sub.cmd %%b"
)
执行 build_compile_batch.cmd 后,生成 _compile_auto.cmd。
再执行 _compile_auto.cmd,就进行编译、编译后自动运行程序。
稍修改一下 build_compile_batch.cmd 即可适合其它的项目。 希望有人会喜欢。