编译运行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 n
和if not errorlevel n
,这分别表示errorlevel
大于等于n
时与errorlevel
小于n
时再执行。这两个命令所指的都是范围。例如if errorlevel 1 (echo pass)
在errorlevel
是0时不执行,只有在errorlevel
大于等于1时才有效。而if not errorlevel 0 (echo pass)
在errorlevel
为0
时也不执行,只有errorlevel小于0时才有效。
- 【Java入門】classpathを指定して実行する方法(確認の方法も解説) | 侍エンジニアブログ (sejuku.net)
- errorlevelの値から分岐処理を行う (jj-blues.com)
还有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