24、Java脚本命令行工具:jrunscript与jjs的使用指南

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脚本开发中更加得心应手。

带开环升压转换器和逆变器的太阳能光伏系统 太阳能光伏系统驱动开环升压转换器和SPWM逆变器提供波形稳定、设计简单的交流电的模型 Simulink模型展示了一个完整的基于太阳能光伏的直流到交流电力转换系统,该系统由简单、透明、易于理解的模块构建而成。该系统从配置为提供真实直流输出电压的光伏阵列开始,然后由开环DC-DC升压转换器进行处理。升压转换器将光伏电压提高到适合为单相全桥逆变器供电的稳定直流链路电平。 逆变器使用正弦PWM(SPWM)开关来产生干净的交流输出波形,使该模型成为研究直流-交流转换基本操作的理想选择。该设计避免了闭环和MPPT的复杂性,使用户能够专注于光伏接口、升压转换和逆变器开关的核心概念。 此模型包含的主要功能: •太阳能光伏阵列在标准条件下产生~200V电压 •具有固定占空比操作的开环升压转换器 •直流链路电容器,用于平滑和稳定转换器输出 •单相全桥SPWM逆变器 •交流负载,用于观察实际输出行为 •显示光伏电压、升压输出、直流链路电压、逆变器交流波形和负载电流的组织良好的范围 •完全可编辑的结构,适合分析、实验和扩展 该模型旨在为太阳能直流-交流转换提供一个干净高效的仿真框架。布局简单明了,允许用户快速了解信号流,检查各个阶段,并根据需要修改参数。 系统架构有意保持模块化,因此可以轻松扩展,例如通过添加MPPT、动态负载行为、闭环升压控制或并网逆变器概念。该模型为进一步开发或整合到更大的可再生能源模拟中奠定了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值