明明已经安装了scala,但是执行代码还是报错 “scalac 不是内部或外部命令,也不是可运行的程序 或批处理文件。”的问题解决

最近在做一个大数据相关的项目,其中有一个功能就是,通过页面输入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就能正常使用了。

其实是一个小问题,但是花了很长时间解决,主要还是自己的经验和知识不足,好记性不如烂笔头,记一下。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值