# 问题
在做 OJ 的时候,由于程序需要编译运行,出于安全性考虑,我选择利用类 ProcessBuilder ,一个通过命令行调用 Java 程序的类。
我在 Eclipse 中或者在 CMD 中执行利用类 ProcessBuilder 运行的程序都没有问题,然后利用 Tomcat 开启服务器厚,调用该程序一直报错。
提示:找不到或无法加载主类 Main。
# 排查
一般来说先排查输入参数有没有问题,显然能在 CMD 中可以执行的程序,参数不会有问题。
是不是包名的问题?也不是。在 CMD 中调用 OJ 保存下来的程序,是可以运行的。
这就很诡异了。其实那句报错提示很玄乎,因为它包括了两个方面:找不到主类Main,无法加载主类Main。
# 核心
什么情况下会无法加载主类 Main?CLASSPATH 不正确的情况是一种。
Tomcat 运行的时候,会自定义 CLASSPATH, 覆盖环境变量的 CLASSPATH。如下图,这是我修改之后的 CLASSPATH,原来的 CLASSPATH 可没有这么多。
# 解决
在 %TOMCAT_HOME%/bin/setenv.bat 中定义 CLASSPATH 即可。
例如:
SET JAVA_OPTS=-Duser.language=en SET CLASSPATH=.;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar;%APACHE_TOMCAT_HOME%libservlet-api.jar;%APACHE_TOMCAT_HOME%lib omcat-api.jar;C:apache-tomcat8.5.9webappsonlineJudgeWEB-INFclasses