Java使用Aviator表达式 记录(一)

2,365 阅读2分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

概述

AviatorScript 是一门寄生在 JVM  (Hosted on the JVM)上的语言,类似 clojure/scala/kotlin 等等。我们先从一个 hello world 例子开始。 Java依赖

Java中使用Aviator

  • 添加依赖
<dependency>
    <groupId>com.googlecode.aviator</groupId> 
    <artifactId>aviator</artifactId> 
    <version>{version}</version> 
</dependency>
  • version 版本可以在 maven 找到,本指南编写的版本面向 5.0.0 及以上版本, 5.0 以下请参考老版本的用户指南

接下来编写你的第一个 AviatorScript 脚本,放到项目的根目录下的 examples 子目录

 examples/hello.av 
 println("hello, AviatorScript!");
  • 其中 ## examples/hello.av 是注释,说明例子所在的文件(后续的例子都将带上这个说明,你可以在 examples 目录找到所有的例子。

这段代码非常简单,调用 println 函数,打印字符串 hello, AviatorScript! 。

  • 其次,编写一个类来运行测试脚本:
import com.googlecode.aviator.AviatorEvaluator; 
import com.googlecode.aviator.Expression; 
import com.googlecode.aviator.Options; 
/** * Run a script under examples folder.
* * @author dennis(killme2008@gmail.com) * */
public class RunScriptExample { 
public static void main(final String[] args) throws Exception { 
// Compile the script into a Expression instance. 
Expression exp = AviatorEvaluator.getInstance().compileScript("examples/hello.av"); 
// Run the exprssion. 
exp.execute();
} 
}

其实你可以直接 clone aviator 的仓库 github.com/killme2008/… ,运行其中的 RunScriptExample 就可以测试 examples  目录下的所有例子。

这段代码逻辑很简单:

  1. 使用 AviatorEvaluatorInstance#compileScript 方法编译脚本到 Expression 对象
  2. 调用 Expression#execute() 方法执行

输出:

hello, AviatorScript!

aviator 命令行

AviatorScript 还提供了一个命令行工具,方便地直接执行脚本。

安装和执行

  1. 安装,请下载 aviator 文件,保存到某个在系统 PATH 路径里的目录(比如 ~/bin ):

$ wget https://raw.githubusercontent.com/killme2008/aviator/master/bin/aviator
--2020-04-26 21:41:04-https://raw.githubusercontent.com/killme2008/aviator/master/bin/aviator 
Resolving localhost (localhost)... ::1, 127.0.0.1 
Connecting to localhost (localhost)|::1|:1081... failed:
Connection refused. Connecting to localhost (localhost)|127.0.0.1|:1081... connected.
Proxy request sent, awaiting response... 200 OK
Length: 5289 (5.2K) [text/plain] 
Saving to: ‘aviator’
  1. 修改为可执行:
$ chmod u+x aviator
  1. 执行命令,会自动下载并安装 aviator jar 文件到 ~/.aviatorscript 目录下:
$ aviator Downloading AviatorScript now...
% Total % Received % Xferd Average Speed Time Time Time Current 
Dload Upload Total Spent Left Speed 100 153 100 153 0 0 94 0 0:00:01 0:00:01 --:--:-- 94 100 505k 100 505k 0 0 199k 0 0:00:02 0:00:02 --:--:-- 663k Usage: java com.googlecode.aviator.Main [file] [args] : 
java com.googlecode.aviator.Main -e 
[script] : java com.googlecode.aviator.Main -v
  1. 将下列脚本保存为文件  hello.av :
p('Hello, AviatorScript!');
  1. 执行脚本:
$ aviator hello.av Hello, AviatorScript!
  1. 也可以直接在命令行执行一段脚本,通过 -e 选项:
$ aviator -e "p('Hello, AviatorScript!');"
Hello, AviatorScript!
null

最后的 null 是整个表达式的执行结果。

命令行参数

在脚本中可以通过 ARGV 数组来访问到:

p("ARGV count is: " + count(ARGV));

for arg in ARGV {
  p(arg);
}

p("ARGV[0] = "  + ARGV[0]);

保存为 test.av 并执行:

$ aviator test.av 1 2 3
ARGV count is: 3
1
2
3
ARGV[0] = 1

我们传入了命令行参数 1 2 3 ,因此 count(ARGV) 返回 3,通过 for 循环迭代了数组并打印,最终我们还单独打印了 ARGV[0] ,也就是第一个命令行参数。