欢迎大家来到IT世界,在知识的湖畔探索吧!
专业的软件一般都会有自己的命令行工具,如mysql的client端,启动后就会有mysql> 提示符,然后可以输入sql语句并执行。python、spark也有同样的命令行工具。 大型的行业软件,有很多也会有自己的命令行工具,看上去都挺高大上的。其中spark就是用scala的REPL实现的。
REPL就是Read Eval Print Loop,一般翻译成交互式解析器,而我非专业的说法就是一个命令行工具。网上也有不少介绍spark的REPL原理,但是看上去都有点复杂,其实我们通过scala实现自己的命令行工具,非常简单。
下面就说一下实现步骤,还是用gradle做构建工具:
1. 设置build.gradle,需要引用scala-compiler库
group 'com.mycompany' version '1.0-SNAPSHOT' apply plugin: 'scala' sourceCompatibility = 1.8 repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } } dependencies { compile group: 'org.scala-lang', name: 'scala-library', version: '2.12.7' compile group: 'org.scala-lang', name: 'scala-reflect', version: '2.12.7' compile group: 'org.scala-lang', name: 'scala-compiler', version: '2.12.7' }
欢迎大家来到IT世界,在知识的湖畔探索吧!
2. 在src/main/scala目录下新建MyPrjLoop 类
1) 覆盖prompt,填什么提示符就是什么样子了
2) 覆盖printWelcome,这里填上自己喜欢的欢迎界面就行,就像spark的命令行工具启动时提示spark那样。如果不覆盖,会提示scala版本信息。
3) initCmd是自定义变量,需要时填上自定义scala语句。
4) 覆盖createInterpreter方法,inp.quietRun(initCmd)。Inp是核心,首先解析initCmd中的scala语句。启动后通过命令行读入的语句也会交给它解析。
欢迎大家来到IT世界,在知识的湖畔探索吧!class MyPrjLoop extends ILoop{ override def prompt: String = "==>" override def printWelcome(): Unit = { echo("") } private val initCmd = """ """ override def createInterpreter(): Unit = { super.createInterpreter intp.quietRun(initCmd) } }
3. 创建入口类Main的Object类
1) 创建settings实例,设置settings.usejavacp.value,使用java classpath。
2) 执行MyPrjLoop的process方法。
object Main extends App{ val settings = new Settings settings.usejavacp.value = true new MyPrjLoop().process(settings) } 主要工作就这三步,这个基本的命令行工具已经完成了,下面只要打包就行了。 通过idea的artifacts打包:
欢迎大家来到IT世界,在知识的湖畔探索吧!
然后就是build了,生成myproject_main.jar,然后执行$ java -cp myproject_main.jar Main
执行效果:
println是scala自带的方法,下面我们增加一个自定义的方法:
4. 创建com.mycompany.myprj包,在这个包下创建city类。
定义list方法:
package com.mycompay.myprj object city { val cityList = List("beijing","shanghai","shenzhen","guangzhou") def list = { cityList.foreach(println) } } 修改以下前面的initCmd常量: private val initCmd = """ import com.mycompay.myprj._ """
5. 重新打包执行
如果出现feature的警告,在settings里面设置以下:
settings.feature.value = false
是不是很好玩?^_^
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/76073.html