如何使用jshell执行java脚本?

2022-09-01 18:49:15

鉴于Java 9已经到来,我们终于可以有一个java REPL,我希望有一种方法可以在脚本中添加一个shebang并对其进行解释。jshelljshell

我尝试创建:test.jsh

#!/usr/bin/env jshell -s
System.out.println("Hello World")
/exit

然而,这给出了:

⚡ ./test.jsh
|  Error:
|  illegal character: '#'
|  #!/usr/bin/env jshell -s
|  ^
|  Error:
|  illegal start of expression
|  #!/usr/bin/env jshell -s
|    ^
Hello World

事实证明,在OpenJDK https://bugs.openjdk.java.net/browse/JDK-8167440 中有一个增强请求。

有没有其他方法可以做到这一点?


答案 1

//usr/bin/env jshell --show-version --execution local "$0" "$@"; exit $?

作为 的第一行。该脚本可能如下所示:test.jshtest.jsh

//usr/bin/env jshell --show-version "$0" "$@"; exit $?
System.out.println("Hello World")
/exit

当然,命令行选项是可选的,但会立即反馈该工具正在运行。--show-version

额外的命令行选项可防止生成另一个 VM。这加快了启动时间,如果脚本代码引发异常,本地 VM 将退出。--execution localjshell

有关更多选项,请参阅 和 的输出。jshell --helpjshell --help-extra

更新

另请查看 https://github.com/jbangdev/jbang 玩乐 Java 脚本,它为从命令行运行文件提供了一个整洁的包装器。.java


答案 2

事实证明,有一点诡计,有一种方法,尽管我还没有完全设法抑制解释的命令,但非常接近我想要的。

更改为:test.jsh

#!/usr/bin/env sh
tail -n +4 "$0" | jshell -s "$@"
exit $?
System.out.println("Hello World")
/exit

这给了我们:

⚡ ./test.jsh
-> System.out.println("Hello World")
Hello World
-> /exit

推荐