Java脚本命令行工具:jrunscript与jjs的使用指南
在Java开发中,命令行工具是提高开发效率和灵活性的重要手段。本文将详细介绍两个实用的命令行工具:jrunscript和jjs,包括它们的基本功能、使用方法和相关示例。
1. jrunscript命令行工具
jrunscript是一个独立于脚本引擎的命令行工具,可用于在命令行或文件中评估脚本。它有以下特点:
-
创建别名
:为多个Java类创建别名,如
java.io.File
、
java.io.Reader
、
java.net.URL
等,可使用简单名称引用它们。
-
全局对象
:将一些对象作为全局对象暴露,可通过以下命令在命令行打印全局对象及其类型列表:
c:\>jrunscript
nashorn> for(var p in this) print(p, typeof this[p]);
engine object
JSInvoker function
jmap function
jlist function
inStream function
outStream function
streamClose function
javaByteArray function
pwd function
...
nashorn>exit()
c:\
1.1 使用模式
jrunscript支持三种使用模式:
-
单行模式
:使用
-e
选项执行一行脚本。
-
批处理模式
:使用
-f
选项执行存储在文件中的脚本。
-
交互模式
:不使用
-e
和
-f
选项,或使用
-f -
选项进入交互模式,可在命令行交互式执行脚本。
1.2 其他功能
-
列出可用脚本引擎
:使用
-q选项列出所有可用的脚本引擎,但需包含非Nashorn语言的脚本引擎JAR文件。 -
全局函数和对象
:提供了一些有用的全局函数和对象,如
cat()函数可用于打印文件或URL的内容,还可选择应用过滤器。
2. jjs命令行工具
JDK 8引入了名为jjs的新命令行工具,用于与Nashorn脚本引擎配合使用。它可运行文件中的脚本或在交互模式下在命令行输入的脚本,还可执行shell脚本。
2.1 语法
jjs命令的语法如下:
jjs [options] [script-files] [-- arguments]
其中:
-
[options]
:jjs命令的选项,多个选项用空格分隔。
-
[script-files]
:Nashorn引擎要解释的脚本文件列表。
-
[-- arguments]
:传递给脚本或交互式shell的参数列表,参数在双连字符后指定,可在脚本中使用
arguments
属性访问。
2.2 选项
jjs工具支持多种选项,部分选项有同义变体,如
-classpath
和
-cp
都用于设置CLASSPATH。可使用
jjs –xhelp
命令打印所有选项列表。以下是部分常用选项:
| 选项 | 描述 |
| ---- | ---- |
|
-D<name>=<value>
| 为Java运行时设置系统属性,可重复设置多个属性值。 |
|
-ccs=<size>
--class-cache-size=<size>
| 设置类缓存大小(以字节为单位),默认值为50字节,可使用k/K、m/M和g/G表示KB、MB和GB。 |
|
-classpath <path>
-cp <path>
| 指定CLASSPATH。 |
|
-co
--compile-only
| 编译脚本但不运行,默认编译并运行。 |
|
--const-as-var
| 将脚本中的
const
关键字替换为
var
,适用于使用
const
关键字但Nashorn不识别的脚本。 |
|
-d=<path>
--dump-debug-dir=<path>
| 指定用于转储脚本类文件的目标目录。 |
|
--debug-lines
| 在
.class
文件中生成行号表,默认启用。 |
|
--debug-locals
| 在
.class
文件中生成局部变量表,默认禁用。 |
|
-doe
--dump-on-error
| 打印错误的完整堆栈跟踪,默认打印简短错误消息。 |
3. jjs工具的使用示例
3.1 交互模式
若不指定任何选项或脚本文件运行jjs,将进入交互模式。示例如下:
c:\>jjs
jjs> "Hello Nashorn"
Hello Nashorn
jjs> "Hello".toLowerCase();
hello
jjs> var list = [1, 2, 3, 4, 5]
jjs> var sum = 0;
jjs> for each (x in list) { sum = sum + x};
15
jjs> quit()
c:\>
3.2 传递参数
可通过以下方式向jjs工具传递参数:
c:\>jjs -- 1 2 3 4 5
jjs> for each (x in arguments) print(x)
1
2
3
4
5
jjs> quit()
c:\>
以下是一个计算整数列表中奇数平方和的脚本示例(
stream.js
):
// stream.js
var list;
if (arguments.length == 0) {
list = [1, 2, 3, 4, 5];
}
else {
list = arguments;
}
print("List of numbers: " + list);
var sumOfSquaredOdds = list.filter(function(n) {return n % 2 == 1;})
.map(function(n) {return n * n;})
.reduce(function(sum, n) {return sum + n;}, 0);
print("Sum of the squares of odd numbers: " + sumOfSquaredOdds);
运行脚本:
c:\>jjs stream.js
List of numbers: 1,2,3,4,5
Sum of the squares of odd numbers: 35
c:\>jjs stream.js -- 10 11 12 13 14 15
List of numbers: 10,11,12,13,14,15
Sum of the squares of odd numbers: 515
c:\>
3.3 脚本模式
使用
-scripting
选项启动jjs工具的脚本模式,可运行shell命令。示例如下:
c:\>jjs -scripting
jjs> `date`
Wed Oct 15 15:27:07 CDT 2014
jjs> `ls -l`
total 3102
drwxr-xr-x 4 ksharan Administrators 0 Jan 11 2014 $AVG
drwxr-xr-x 5 ksharan Administrators 0 Jan 22 2014 $Recycle.Bin
-rw-r--r-- 1 ksharan Administrators 1 Jun 18 2013 BOOTNXT
-rw-r--r-- 1 ksharan Administrators 94 May 23 2013 DBAR_Ver.txt
More output goes here...
jjs> exit()
c:\>
在脚本模式下,Nashorn定义了多个全局对象和函数,如下表所示:
| 全局对象 | 描述 |
| ---- | ---- |
|
$ARG
| 存储传递给脚本的参数,与
arguments
作用相同。 |
|
$ENV
| 将所有环境变量映射到一个对象。 |
|
$EXEC(cmd, input)
| 用于在新进程中运行命令,并将输入传递给
cmd
。两个参数都可以是命令,此时
input
的输出将作为输入传递给
cmd
。 |
|
$OUT
| 存储进程的最新标准输出。 |
|
$ERR
| 存储进程的最新标准错误输出。 |
|
$EXIT
| 存储进程的退出代码,非零值表示进程失败。 |
|
echo(arg1, arg2,...)
| 与
print()
函数作用相同,但仅在脚本模式下可用。 |
|
readLine(prompt)
| 从标准输入读取一行输入,指定的参数作为提示显示,默认将读取的输入显示在标准输出,函数返回读取的输入。 |
|
readFully(filePath)
| 读取指定文件的全部内容,默认将内容显示在标准输出,可将函数返回值赋给变量。 |
4. 脚本模式下的其他特性
4.1 表达式替换
脚本模式允许在双引号括起来的字符串中进行表达式替换,表达式用
${expression}
指定,但单引号括起来的字符串不支持此功能。示例如下:
c:\ >jjs -scripting
jjs> var today = `date`
jjs> "Today is ${today}"
Today is Mon Jul 14 22:48:26 CDT 2014
jjs> 'Today is ${today}'
Today is ${today}
jjs> quit()
c:\>
4.2 heredoc支持
jjs工具支持在可在脚本模式下运行的脚本文件中使用heredoc(也称为here document、here-string或here-script),它是一种保留空格的多行字符串。heredoc以双尖括号(
<<
)和分隔标识符开头,通常使用
EOF
或
END
作为分隔标识符,也可使用其他未在脚本中用作标识符的标识符。示例如下:
var str = <<EOF
This is a multi-line string using the heredoc syntax.
Bye Heredoc!
EOF
以下是一个使用heredoc的脚本示例(
heredoc.js
):
// heredoc.js
var str = <<EOF
This is a multiline string.
Number of arguments passed to this
script is ${$ARG.length}
Arguments are ${$ARG}
Bye Heredoc!
EOF
print(str);
运行脚本:
c:\> jjs -scripting heredoc.js
This is a multi-line string.
Number of arguments passed to this
script is 0
Arguments are
Bye Heredoc!
c:\> jjs -scripting heredoc.js -- Kishori Sharan
This is a multi-line string.
Number of arguments passed to this
script is 2
Arguments are Kishori,Sharan
Bye Heredoc!
4.3 特殊注释
除了Nashorn支持的两种注释风格(
//
和
/* */
),jjs工具还支持以
#
开头的单行注释。如果脚本文件以
#
开头,jjs工具将自动启用脚本模式。示例如下(
jjscomments.js
):
# This script will run in scripting mode by the jjs tool
# because it starts with a number sign
// Set the current directory to C:\kishori
$ENV.PWD = "C:\\kishori";
// Get the list of files and directories in the current directory
var str = `ls -F`;
print(str);
运行脚本:
c:\>jjs jjscomments.js
books/
ejb/
hello.txt
important/
programs/
rmi.log
rmi.policy
scripts/
c:\>
4.4 shebang支持
在类Unix操作系统上,可在脚本文件开头使用shebang(
#!
)将其作为脚本可执行文件运行,需在shebang中包含jjs工具的路径,脚本文件将由jjs工具执行。示例如下:
#!/usr/bin/jjs
var str = `ls -F`;
print(str);
综上所述,jrunscript和jjs是Java开发中非常实用的命令行工具,通过灵活运用它们的各种功能和特性,可提高脚本开发和调试的效率。
Java脚本命令行工具:jrunscript与jjs的使用指南
5. 操作流程总结
为了让大家更清晰地了解如何使用jrunscript和jjs工具,下面分别给出它们的操作流程。
5.1 jrunscript操作流程
graph LR
A[启动jrunscript] --> B{选择模式}
B -->|单行模式| C[使用 -e 选项执行一行脚本]
B -->|批处理模式| D[使用 -f 选项执行文件中的脚本]
B -->|交互模式| E[不使用 -e 和 -f 选项或使用 -f - 进入交互模式]
C --> F[脚本执行完成]
D --> F
E --> G[在命令行输入脚本并执行]
G --> H{是否结束}
H -->|是| F
H -->|否| G
5.2 jjs操作流程
graph LR
A[启动jjs] --> B{选择模式}
B -->|交互模式| C[不指定选项和脚本文件进入交互模式]
B -->|带参数执行| D[使用 -- 传递参数]
B -->|脚本模式| E[使用 -scripting 选项启动脚本模式]
C --> F[在命令行输入脚本并执行]
F --> G{是否结束}
G -->|是| H[脚本执行完成]
G -->|否| F
D --> I[脚本接收并处理参数]
I --> H
E --> J[执行shell命令或脚本文件]
J --> H
6. 常见问题及解决方法
在使用jrunscript和jjs工具时,可能会遇到一些常见问题,下面为大家总结并给出解决方法。
| 问题 | 描述 | 解决方法 |
|---|---|---|
| 找不到脚本引擎 | 使用jrunscript的 -q 选项列出可用脚本引擎时,某些非Nashorn引擎未显示 | 确保包含非Nashorn语言的脚本引擎JAR文件 |
| 脚本编译错误 | 使用jjs的 -co 选项编译脚本时出现错误 | 检查脚本语法,使用 –debug-lines 和 –debug-locals 选项查看详细信息 |
| 不支持 const 关键字 | 脚本中使用 const 关键字,Nashorn不识别 | 使用 –const-as-var 选项将 const 替换为 var |
| 脚本模式下命令执行失败 | 在jjs的脚本模式下执行shell命令失败 | 检查命令语法,查看 $ERR 全局对象获取错误信息 |
7. 总结与建议
通过本文的介绍,我们了解了jrunscript和jjs这两个Java命令行工具的基本功能、使用方法和相关特性。jrunscript适用于多种脚本语言的评估,提供了一些方便的全局对象和函数;jjs则专门与Nashorn脚本引擎配合,功能更加丰富,支持多种选项和脚本模式。
在实际开发中,建议根据具体需求选择合适的工具。如果需要处理多种脚本语言,可优先考虑jrunscript;如果主要使用Nashorn脚本,jjs将是更好的选择。同时,要充分利用工具提供的各种选项和特性,如使用jjs的脚本模式执行shell命令、利用heredoc编写多行字符串等,以提高开发效率。
希望大家通过本文的学习,能够熟练掌握jrunscript和jjs工具的使用,在Java脚本开发中更加得心应手。
超级会员免费看
782

被折叠的 条评论
为什么被折叠?



