Scala开发之2:使用 REPL 命令行工具
1 scala自带的命令行工具
scala安装好之后,输入scala就进入了scala自带的REPL. 如果不能进入,确定路径配置是否正确。如下是我的配置:
export JAVA_TOOL_OPTIONS="-Xmx512m -Xms64m -Dfile.encoding=UTF-8"
export SCALA_HOME=/usr/local/java/scala
export JAVA_HOME=/usr/local/java/java8
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$SCALA_HOME/bin
scala 和 java 是可以互操作的。如果一个 jar 包在 scala 的 classpath 中,那么可以直接在 scala 命令中使用如下的语法:
scala > import java.util.Properties
如果 jar 文件不在这个 scala 的运行时环境中,就要手动添加进来。例如下面引入测试类报错:
$ scala
scala> import org.scalatest.funsuite.AnyFunSuite
<console>:11: error: object scalatest is not a member of package org
import org.scalatest.funsuite.AnyFunSuite
^
因为 scalatest 这个 jar 包是要额外下载的,我已经下载并放到下面的位置:
/root/.m2/repository/org/scalatest/scalatest-funsuite_2.12/3.2.2-M2/scalatest-funsuite_2.12-3.2.2-M2.jar
重新运行:
$ scala -classpath /root/.m2/repository/org/scalatest/scalatest-funsuite_2.12/3.2.2-M2/scalatest-funsuite_2.12-3.2.2-M2.jar
Picked up JAVA_TOOL_OPTIONS: -Xmx512m -Xms64m -Dfile.encoding=UTF-8
Welcome to Scala 2.12.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_152).
Type in expressions for evaluation. Or try :help.
scala> import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.funsuite.AnyFunSuite
scala>:quit
也可以用 :require 命令添加,例如:
$ scala
Picked up JAVA_TOOL_OPTIONS: -Xmx512m -Xms64m -Dfile.encoding=UTF-8
Welcome to Scala 2.12.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_152).
Type in expressions for evaluation. Or try :help.
scala> :require /root/.m2/repository/org/scalatest/scalatest-funsuite_2.12/3.2.2-M2/scalatest-funsuite_2.12-3.2.2-M2.jar
Added '/root/.m2/repository/org/scalatest/scalatest-funsuite_2.12/3.2.2-M2/scalatest-funsuite_2.12-3.2.2-M2.jar' to classpath.
scala> import scalatest.funsuite.AnyFunSuite
<console>:11: error: not found: value scalatest
import scalatest.funsuite.AnyFunSuite
^
scala> import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.funsuite.AnyFunSuite
scala> :quit
2 ammonite REPL
这个是lihaoyi写的命令行工具。非常强大,反应速度快。
$ amm
Picked up JAVA_TOOL_OPTIONS: -Xmx512m -Xms64m -Dfile.encoding=UTF-8
Loading...
Welcome to the Ammonite Repl 2.2.0 (Scala 2.12.12 Java 1.8.0_152)
@ import java.util.Properties
import java.util.Properties
@ exit
对于外部的java类,引入报错:
@ import org.scalatest._
cmd1.sc:1: object scalatest is not a member of package org
import org.scalatest._
^
Compilation Failed
按下面的方式载入 jar 文件:
@amm interp.load.cp(os.Path("/root/.m2/repository/org/scalatest/scalatest-funsuite_2.12/3.2.2-M2/scalatest-funsuite_2.12-3.2.2-M2.jar"))
@ import scalatest.funsuite.AnyFunSuite
cmd1.sc:1: not found: value scalatest
import scalatest.funsuite.AnyFunSuite
^
Compilation Failed
@ import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.funsuite.AnyFunSuite
@ exit
参考:http://ammonite.io
总结
本文总结了2种 scala 的命令行工具如何引入外部 jar 包。方便用来学习写 scala。如果编程方式使用 scala,通常是混合 java 一起开发。我喜欢用 maven 来搭建 java 和 scala 一体的项目平台。对于开发而言测试是非常必要的,如果想快速了解如何测试 scala 工程,下面这个链接能提供一些思路:
https://github.com/scalatest/scalatest-maven-plugin
对于 scala-2.12 ,《Scala 编程(第3版)》P260页存在错误(org.scalatest.FunSuite)。现在应该是:
org.scalatest.funsuite.AnyFunSuite
接下来的文章我会演示如何整合 java,scala, maven 来做一个完整的工程范例。