最近在做一个大数据相关的项目,其中有一个功能就是,通过页面输入Spark代码(scala编写),然后后台编译打包上传文件到大数据服务器上,再去执行Spark程序,所有功能通过页面操作来实现。
讲讲碰到的一个问题,就是scala编译的问题,已将Spark代码(字符串),写成了.scala文件
之后的工作就是对tblAe57.scala这个文件进行编译,编译成.calss;因为是scala语言写的,所以就要安装scala。
实现编译主要是java.lang.ProcessBuilder类
try {
ProcessBuilder pb = new ProcessBuilder();
// TODO 待添加Linux环境编译
List<String> command = new ArrayList<String>();
// windows环境编译
// command.add("cmd.exe");
// command.add("/c");
// Linux环境编译
command.add("bash");
command.add("-c");
command.add("scalac");
command.add("-d");
command.add(targetPath);
if (StringUtils.isNotBlank(this.extlibdir)) {
command.add("-extdirs");
command.add(this.extlibdir);
}
// command.add("-g:source");
for (File srcfile : sourceList) {
command.add(srcfile.getAbsolutePath());
}
Process process = pb.command(command).start();
String errmsg = dumpInput(process.getErrorStream());
boolean status = errmsg.contains("error");
if (status) {
throw new BusinessException("代码有误,编译失败");
}
/* } */
} catch (IOException e) {
e.printStackTrace();
}
command集合结果是
cmd.exe /c scalac -d D:\Application\bdComputerEngine\WEB-INF\imprf\classes -extdirs D:\Application\bdComputerEngine\workspace\study-hadoop\lib\chd5.11 D:\Application\bdComputerEngine\WEB-INF\imprf\src\tblAe57.scala
cmd.exe /c scalac -d [编译后文件路径] -extdirs [外部引用的jar包] [所以编译的文件(.scala)]
先说说出现的问题,本地测试的时候,我并没有启动eclipse,先是安装了scala
然后启动eclipse,写程序,测试,也没出现问题,tblAe57.scala也是可以正常编译的,编译打包后的文件
本地测试很顺利,然后将项目放入到仿真环境,仿真环境是由weblogic来管理项目,没有安装scala,那就先安装scala,之后进行测试的时候就出现问题,编译打包后的结果只有一个jar包,没有.class文件
这个jar包里也没有.class文件
看了一下日志,
ERROR com.wondersgroup.sbpc.bdComputerEngine.complier.ScalaLanguageCompiler 134 dumpInput - 'scalac' 不是内部或外部命令,也不是可运行的程序或批处理文件。
起初是以为scala安装问题,改过配置,也重新安装过,scala -version都是能显示版本好的,那就是安装没问题,后来也改过代码,换过环境部署,linux环境换到了windows,相应代码也改过,weblogic上的项目也重启过,还是有问题。
后来想起来本地安装scala的时候java程序是没有起来的,安装完成后再启动java程序,而启动java是需要读取path,而scala安装也是需要配置path,那会不会跟这个先后顺序有关。后来我关闭了仿真上的weblogic,将相应的java程序都kill掉,然后再启动weblogic,在测试的时候,就没有问题了。
后来仔细想想明白了,启动java是根据path路径上的jdk配置启动的,之后如果安装scala,配置环境变量path,此时环境变量已经变更,但已经在运行的java无法实时读取环境变量,所以导致自己查看scala -version是会显示版本,因为每次敲这个代码都会去读取path,但是已启动的java程序无法识别环境变量变更,在java程序里就认为scala还未安装,如果要重新获取环境变量就要重启java程序。比例,本机环境下,启动eclipse,就会启动java程序,仿真或者生产环境,一般是weblogic方便管理项目,启动weblogic就会启动java程序,只要重启eclipse或者weblogic就可以重新读取环境变量,scala就能正常使用了。
其实是一个小问题,但是花了很长时间解决,主要还是自己的经验和知识不足,好记性不如烂笔头,记一下。