Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。
Scala 运行在Java虚拟机上,并兼容现有的Java程序。
Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库.
在实际的项目工作中,确实能感受到Scala的强大,简洁和函数式编程的魅力,同时Scala也可以以脚本的形式来运行.
1.原生方式执行Scala脚本
创建Scala脚本demo.scala,内容如下:
println("execute script..")
def makeDir(path:String):Unit = {
import java.io.{File,FileOutputStream}
val file = new File(path)
if(!file.exists())file.createNewFile()
val out = new FileOutputStream(file)
out.write(97)
out.close()
println("finish..")
}
makeDir("test.txt")
打开cmd,执行以下命令
scala demo.scala

同时脚本同级目录出现test.txt文件,文本内容为"a"
jdk版本在1.4之上不再需要设置classpath环境变量,默认的class path的值为“.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;”,程序执行所导入的类都在默认的classpath上,所以执行不会出现异常,下面改造一下脚本,增加一个不在默认class path上的类.
println("execute script..")
def makeDir(path:String):Unit = {
import java.io.{File,FileOutputStream}
import com.google.gson.Gson
val file = new File(path)
if(!file.exists())file.createNewFile()
val out = new FileOutputStream(file)
out.write(97)
out.close()
println("finish..")
val gson = new Gson()
val arr = Array(1,2,3,4)
println(gson.toJson(arr))
}
makeDir("test.txt")
打开cmd,直接执行命令
scala demo.scala
出现异常报错信息

将gson-2.8.5.jar放入到脚本同目录下,同时指定classpath,修改命令如下

下面介绍一个执行Scala脚本的框架,ammonite,借助该框架可以直接集成到代码里面执行脚本文件并返回结果给程序处理
增加依赖如下:
<dependency>
<groupId>com.lihaoyi</groupId>
<artifactId>ammonite_2.12.8</artifactId>
<version>1.6.6-7-5e5461b</version>
</dependency>
注意需要的Scala版本.
改造一下上面的脚本文件:
import ammonite.main.Router.main
@main
def makeDir(path:String):String= {
import java.io.{File,FileOutputStream}
import com.google.gson.Gson
val file = new File(path)
if(!file.exists())file.createNewFile()
val out = new FileOutputStream(file)
out.write(97)
out.close()
println("finish..")
val gson = new Gson()
val arr = Array(1,2,3,4)
gson.toJson(arr)
}
修改成接受一个参数,同时返回一个结果.
编写Scala代码调用该脚本
object Handler{
def main(args: Array[String]): Unit = {
val arg = Seq(("path", Some("a.txt")))
val res: (Res[Any], Seq[(Path, Long)]) = ammonite.Main().runScript(Path("C:\\codes\\initials\\demo.scala"), arg)//Path的参数为脚本的绝对路径
val result = (res._1 match {
case Success(x) => Some(x.asInstanceOf[String])
case Failure(msg) => println(s"$msg"); None
case Exception(msg, e) => println(s"$msg", e); None
}) match{
case Some(x) => x
case None => ()
}
println(result)
}
}
执行结果:

由以上输出可以看出,执行程序较脚本时首先进行编译,再执行,脚本中需要jar包必须在运行程序的classpath上.同时在脚本中的println都会转化为脚本的执行输出.
网友评论