编译运行java工程的批处理文件写法

编译运行java工程最简单的命令使用javac Main.java将Main编译为Main.class,然后使用java Main可以执行Main.class。但工程稍微复杂一些,需要用到多个类,以及引用了外部jar包的时候,又没有必要构建一个工程,这时就可以利用javac和参数选项以及一些批处理命令,可以比较方便的编译工程,还可以做到仅编译成功时运行程序。

set packages=package/*;package/lib/*;package/ooxml-lib/*
set classout=./class/
erase /Q "%classout%"
javac -encoding utf-8 -d "%classout%" -cp "%packages%" Main.java dto/*.java
if %errorlevel% equ 0 (
java -cp "%classout%;%packages%" Main
)

这在javac的-cp参数就可以指定jar包。系统的环境变量CLASSPATH中可以定义之它,但如果不想整个系统通用它,也可以在javac的命令行参数中指定:
javac -cp PATH
其中PATH就是存放jar的路径,允许指定jar文件,也可以使用*通配符将路径下全部jar全部引入。PATH之间在windows下用;隔开,IOS下用:分隔。

如果编写run.bat是编译完成后也执行它,那么java命令中也会使用同样的路径,于是在bat中可以将PATH定义为常量,既增强了可读性又使命令变得简短:
set name=value
set以后的bat文件中,可以使用%name%来将设定好的name替换为value

javac的-d参数选项,是指定将.java文件编译完成后生成的.class文件的路径,默认值是与.java文件的路径相同。为了工程目录的整洁,可以指定一个路径将.class全部生成在指定路径中。若编译成功且要执行,则要在java命令中把生成class的路径也包含,不然java找不到生成的class文件。

在编译失败的情况下,java只会执行上次成功编译的内容。若只希望当编译成功时才执行,可以使用 if %errorlevel% equ 0 来判断编译是否成功。errorlevel的值是获得自上一句命令的执行的返回值(这也是为什么C/C++建议main返回int类型且正常结束返回0),javac如果编译成功时,errorlevel的值即是0。这样%errorlevel%则被替换为0,从而if后的java命令可顺利执行。

关于errorlevel,还有两个相似的命令:if errorlevel nif not errorlevel n,这分别表示errorlevel大于等于n时与errorlevel小于n时再执行。这两个命令所指的都是范围。例如if errorlevel 1 (echo pass)errorlevel是0时不执行,只有在errorlevel大于等于1时才有效。而if not errorlevel 0 (echo pass)errorlevel0时也不执行,只有errorlevel小于0时才有效。

还有shell版

mkdir ./bin

if [ -f $1/Main.java ]; then
        javac -d bin $1/Main.java
        if [ $? -eq 0 ]; then
                for FL in `ls $1/*.in`
                do
                        echo "|=========[ "$FL" ]=========|"
                        time java -cp bin Main < $FL
                        echo
                done
        fi
fi

rm -rf ./bin

Written by malic in All on 金 08 12月 2023. Tags: Windows操作