jjs 的 -Scripting 选项

jjs shell 是一个不错的方法来测试一些基本的 JavaScript,或者于不太熟悉的 JavaScript包进行交互(主要是指 javax.script)的方式,然而,在即时预览功能下,它缺乏多行输入和其他先进的功能,通常会在开发中稍微受限。

相反,在非交互的情境下使用 jjs 更加合适,例如运行一个用 JavaScript 写的后台守护进程,就可以这样使用:

$ jjs -scripting my_script.js

这使我们能够利用 jjs 的增强功能,这些包括一些有用的扩展,而其中的一些扩展对熟悉脚本程序员来说更加容易。

脚本注释

在Unix脚本语言中,使用“#”来注释一行的代码,在 Nashorn 里同样适用:

#!/usr/bin/jjs
# A perfectly legal comment in scripting mode
print("After the comment");

执行内置命令

此功能通常被称为“反撇号”由经验丰富的Unix程序员来使用。所以,我们可以利用Unix curl命令用来从谷歌点击下载内容:

echo "Google says: " `curl http://www.google.co.uk

我们也可以在 Nashorn 环境下执行相同功能的 Unix 命令:

print("Google says: "+ `curl http://www.google.co.uk`);

字符串插值

字符串插值是一种特殊的语法,允许程序员直接包含一个变量而不使用字符串连接。在Nashorn中,我们可以使用语法${} 插在字符串变量。例如,上一个下载网页的例子可以用这样的插值来重写:

var url = "www.google.co.uk";
var pageContents = `curl http://${url}`;
print("Google says: ${pageContents}");

特殊变量

Nashorn 也提供了一些特殊的全局变量和函数,特别有助于脚本和正常情况下不可用的JavaScript 中。例如,一个脚本的参数可以通过变量 $ARG 来访问。这个参数用“--”来约定,像这样:

jjs test1.jjs -- aa bbb cccc

然后这些参数可以在下面的例子中访问:

print($ARG);

for(var i=0; i < $ARG.length; i++) {
print("${i}: "+ $ARG[i]);
}

注意:

变量 $ARG 是 JavaScript 数组。对于来自其他语言的程序员(例如 Perl )来说,这个语法可能有点混乱,其中 $ 符号通常表示标量变量。

下一个特殊的全局变量,是 $ENV,提供对当前的环境变量的一个接口。例如,打印当前用户的主目录:

print("HOME = "+ $ENV.HOME); # Prints /home/ben for me

Nashorn 中也提供了一个特殊的全局函数称为 exec()。这就像我们刚才遇到的反撇号的用法,如本例所示:

var execOutput = $EXEC("echo Print this on stdout");
print(execOutput);

你可能已经注意到,当我们使用反撇号或 \(exec() 执行的命令的输出并没有打印出来,而是最终作为函数的返回值。这是为了防止在脚本的输出时打印一些无用的信息。
Nashorn 提供了其他两个特殊的变量供程序员使用,从脚本中执行命令的输出工作:\)OUT 和 $ERR,用于捕获从脚本中执行的命令的输出和任何错误消息。例如:

$EXEC("echo Print this on stdout");
// Code that doesn't change stdout
var saveOut = $OUT;
print("- - - - - - -");
print(saveOut);

内联文档

JavaScript,Java 并不支持字符串在同一个引号内分行书写,但是 Nashorn 在脚本模式下是支持的,在脚本预言中,可以使用这样的语法:<<END_TOKEN,来标识字符串的开始,一直到表示结束的标识符,这个标识符可以是任意的字符串,不过通常来使用END, END_DOC, END_STR, EOF, 和 EOSTR这样意义明显的字符串,在结束标识符结束以后,脚本语言恢复正常,看下面的例子:

var hw = "Hello World!";
var output = <<EOSTR;
This is a multiline string
It can interpolate too - ${hw}
EOSTR
print(output);

Nashorn 的辅助功能

Nashorn 还提供了一些辅助功能,让开发人员可以完成常见的任务,使执行的shell脚本更加容易:

  • print() / echo()

    我们一直在许多实例中使用 print() 方法,这些方法通常用来验证程序的预期行为。它会打印传递给它的字符串,后跟一个换行符。
  • quit() / exit()

    这两个方法完全相等,它们都会导致脚本退出。它们可以使用一个整数参数,该参数将用作脚本进程的返回代码。如果没有提供参数,按照惯例为Unix 惯例,默认使用0。
  • readLine()

    从标准输入读取一行输入(通常是键盘)。默认情况下,它将在标准输出下打印一行,但如果 readline() 返回值赋值给一个变量,输入的数据会被变量里的值替换掉,如下面的例子:
print("Please enter your name: ");
var name = readLine();
print("Please enter your age: ");
var age = readLine();
print(<<EOREC);
Student Record
-+-+-+-+-+-+-+-
Name: ${name}
Age: ${age}
EOREC
  • readFully()

    不是从标准输入读取,readfully() 加载一个文件的所有内容。与 readline() 一样,打印内容到标准输出,或赋给一个变量:
var contents = readFully("input.txt");
  • load()

    此方法用来加载和评估(通过 JavaScript 的eval)脚本。脚本可以由本地路径或URL定位。或者,它可以使用 JavaScript 的脚本对象标识定义为一个字符串。

注意:

当使用 load() 来加载其他脚本,可能会发生意外的错误。JavaScript 支持的形式使用 try-catch 块的异常处理,那么你在加载代码应该使用它。

这里是一个简单的例子,如何从 Nashorn 负载D3可视化图形库:

try {
load("http://d3js.org/d3.v3.min.js");
} catch (e) {
print("Something went wrong, probably that we're not a web browser");
}
  • loadWithNewGlobal()

    当我们使用 load() 方法,它是基于当前 JavaScript 上下文脚本。有时我们想把脚本放到自己的,干净的上下文。在这些情况下,使用loadwithnewglobal() 来开始一个全新和全局的上下文。

表达式语法

这些特性使 jjs 成为一个很好的选择,就像 shell,Perl 或是其它脚本语言一样利于书写。而表达式语法这一终极特性,使得在 Nashorn 下建立书写脚本语言成为可能。

注意:

如果一个可执行的脚本的第一行以#!开头,接下来是路径的可执行文件,则 Unix 操作系统将路径指向一个解释器,能够处理这种类型的脚本。如果脚本被执行,操作系统将执行解释器并将其传递给需要处理的脚本文件。

在这种情况下,为 Nashorn 建立一个软连接会是一个非常不错的实践。我们可以吧 jjs 库的实际位置(通常是 $JAVA_HOME/bin/jjs)软连接到 /usr/bin/jjs (或 /usr/local/bin/jjs),然后脚本语言就可以这样写啦!

#!/usr/bin/jjs
# ... rest of script

对于更高级的使用情况(例如,长时间运行的守护进程),甚至可以兼容 Node.js。这是由 Avatar 项目下的 avatar.js 来实现的。

我们看到,Nashorn 使 JavaScript 代码可以直接运行在命令行工具下,但在许多情况下,我们需要在 Java 代码中执行 JavaScript,这时候我们就需要 javax.script java 这个包下的 API 了。

Java Nashorn--Part 3的更多相关文章

  1. Java 7 可执行的 Nashorn,取代 Rhino

    惊现有人把 OpenJDK 上的 Nashorn dump 下来,使得 Java 7 都能够使用.源代码在 https://bitbucket.org/ramonza/nashorn-backport ...

  2. Learning Java 8 Syntax (Java in a Nutshell 6th)

    Java is using Unicode set Java is case sensitive Comments, C/C++ style abstract, const, final, int, ...

  3. Atitit。Js调用后台语言 java c#  php swing android  swt的方法大总结

    Atitit.Js调用后台语言 java c#  php swing android  swt的方法大总结 1. Js调用后台语言有三种方法1 2. Swt  BrowserFunction 绑定方法 ...

  4. JS代码检查工具ESLint

    前面的话 ESLint是一个JavaScript代码静态检查工具,可以检查JavaScript的语法错误,提示潜在的bug,可以有效提高代码质量,维持前端团队高度一致的编码风格.ESLint不但提供一 ...

  5. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  6. Java 8 的 Nashorn 脚本引擎教程

    本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子. Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Goog ...

  7. Nashorn 在JDK 8中融合Java与JavaScript之力

    从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调 ...

  8. Nashorn——在JDK 8中融合Java与JavaScript之力

      从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript ...

  9. java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api

    移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...

  10. Java 8 Nashorn JavaScript

    转自:https://www.runoob.com/java/java8-nashorn-javascript.html Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Na ...

随机推荐

  1. 牛客网-《剑指offer》-二进制中1的个数

    题目:http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8 C++ 负数需要特殊处理,因为负数右移会补1(符号位) cla ...

  2. uni - 使用npm

    一.使用 1. 在当前根目录初始化package.json npm init -y 2. 安装(自动生成node_modules文件夹) npm i packageName yarn add pack ...

  3. vSphere Data Protection – a new backup product included with vSphere 5.1

    August 27, 2012 By Vladan SEGET This new backup product replaces VMware Data Recovery, which has bee ...

  4. JAVA的CLASS文件详解

    一.事例 1.1 Test.java public class Test { public static void main(String[] args) { System.out.println(& ...

  5. python 爬虫资料

    API Requests PyQuery http://www.tuicool.com/articles/UZrmUb2 http://blog.csdn.net/cnmilan/article/de ...

  6. CentOS下Crontab安装使用详细说明(转)

    来自:http://www.centoscn.com/CentOS/help/2014/1220/4346.html crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的 ...

  7. 再玩 DevStack(Mitaka版)- 基于 trystack.cn 源

    曾经就写过一篇关于DevStack安装OpenStack的文章< 使用 DevStack 高速部署 OpenStack 开发环境 >,时过境迁,如今有更好的方式来实现.想到曾经的复杂性,认 ...

  8. Java Netty (2)

    通过一个实例来说明Netty的使用.用1个服务器连接5个客户端线程,客户端连接上服务器以后就向服务器发送消息,服务器接收到消息后向客户端返回消息,客户端接收到消息以后,等待随机的时间,再向服务端发送消 ...

  9. JdbcTemplate应用学习

    一.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...

  10. 批处理/命令行合并js,递归合并子目录js文件

    for /r %%i in (*.js) do type "%%i">>xxx-all.js java -jar yuicompressor.jar --type js ...