使用scala的REPL创建自己的命令行工具

使用scala的REPL创建自己的命令行工具专业的软件一般都会有自己的命令行工具,如mysql的client端,启动后就会有mysql> 提示符,然后可以输入sql语句并执行。python、spark也有同样的命令行工具。 大型的行业软件,有很多也会有自己的命令行工具,看上去都

大家好,欢迎来到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' } 

2. 在src/main/scala目录下新建MyPrjLoop 类

1) 覆盖prompt,填什么提示符就是什么样子了

2) 覆盖printWelcome,这里填上自己喜欢的欢迎界面就行,就像spark的命令行工具启动时提示spark那样。如果不覆盖,会提示scala版本信息。

3) initCmd是自定义变量,需要时填上自定义scala语句。

4) 覆盖createInterpreter方法,inp.quietRun(initCmd)。Inp是核心,首先解析initCmd中的scala语句。启动后通过命令行读入的语句也会交给它解析。

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打包: 
使用scala的REPL创建自己的命令行工具

使用scala的REPL创建自己的命令行工具

使用scala的REPL创建自己的命令行工具

 

然后就是build了,生成myproject_main.jar,然后执行$ java -cp myproject_main.jar Main

执行效果:

使用scala的REPL创建自己的命令行工具

使用scala的REPL创建自己的命令行工具

 

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. 重新打包执行

使用scala的REPL创建自己的命令行工具

如果出现feature的警告,在settings里面设置以下:

settings.feature.value = false 

是不是很好玩?^_^

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/86537.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信