如何使用 jshell 执行 java 脚本?
How to execute a java script with jshell?
考虑到 Java 9 即将到来,我们终于可以使用 java REPL 和 jshell
我希望有一种方法可以将 shebang 添加到脚本中并拥有jshell
解读一下。
我尝试创建 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。
还有其他方法吗?
事实证明,通过一些技巧,有一种方法,虽然我还没有完全设法抑制解释的命令,但非常接近我想要的。
将test.jsh
更改为:
#!/usr/bin/env sh
tail -n +4 "[=10=]" | jshell -s "$@"
exit $?
System.out.println("Hello World")
/exit
这给了我们:
⚡ ./test.jsh
-> System.out.println("Hello World")
Hello World
-> /exit
使用
//usr/bin/env jshell --show-version --execution local "[=11=]" "$@"; exit $?
作为test.jsh
的第一行。 test.jsh
脚本可能如下所示:
//usr/bin/env jshell --show-version "[=10=]" "$@"; exit $?
System.out.println("Hello World")
/exit
命令行选项 --show-version
当然是可选的,但会立即反馈该工具是 运行。
extra 命令行选项 --execution local
阻止 jshell
生成另一个 VM。这加快了启动时间,如果您的脚本代码抛出异常,本地 VM 将退出。
请参阅 jshell --help
和 jshell --help-extra
的输出以获取更多选项。
更新
另请参阅 https://github.com/jbangdev/jbang 玩得开心 Java 脚本编写,它提供了 运行 [=19= 的简洁包装] 来自命令行的文件。
受 steiny 答案的启发,我想出了一个更通用的解决方案
https://gist.github.com/ffissore/012d7e32a096fde5266f49038c93dcaf
本质上:jshell-wrapper
将删除脚本的第一行(应该是 shebang)并在脚本末尾添加一个 /exit
以下也适用;将其放入 someScript.jsh
文件并 运行 与 ./someScript.jsh
。 someScript.jsh
收到的所有参数都将转到 String[] args
。
#!/home/gigi/.sdkman/candidates/java/current/bin/java --source 11
import java.util.Arrays;
import ro.go.adrhc.*; // example of using your classes, e.g. App below
public class X {
public static void main(String[] args) {
// do whatever you want here, e.g.:
// System.out.println("Hello World");
// or
// use a class:
// App.main(args);
// e.g. from ro.go.adrhc package, by running:
// CLASSPATH="/path-to-ro.go.adrhc-classes" ./someScript.jsh
}
}
包装 class 的用法,此处 X
是实现此功能的必要技巧。
灵感来自 https://blog.codefx.org/java/scripting-java-shebang/.
考虑到 Java 9 即将到来,我们终于可以使用 java REPL 和 jshell
我希望有一种方法可以将 shebang 添加到脚本中并拥有jshell
解读一下。
我尝试创建 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。
还有其他方法吗?
事实证明,通过一些技巧,有一种方法,虽然我还没有完全设法抑制解释的命令,但非常接近我想要的。
将test.jsh
更改为:
#!/usr/bin/env sh
tail -n +4 "[=10=]" | jshell -s "$@"
exit $?
System.out.println("Hello World")
/exit
这给了我们:
⚡ ./test.jsh
-> System.out.println("Hello World")
Hello World
-> /exit
使用
//usr/bin/env jshell --show-version --execution local "[=11=]" "$@"; exit $?
作为test.jsh
的第一行。 test.jsh
脚本可能如下所示:
//usr/bin/env jshell --show-version "[=10=]" "$@"; exit $?
System.out.println("Hello World")
/exit
命令行选项 --show-version
当然是可选的,但会立即反馈该工具是 运行。
extra 命令行选项 --execution local
阻止 jshell
生成另一个 VM。这加快了启动时间,如果您的脚本代码抛出异常,本地 VM 将退出。
请参阅 jshell --help
和 jshell --help-extra
的输出以获取更多选项。
更新
另请参阅 https://github.com/jbangdev/jbang 玩得开心 Java 脚本编写,它提供了 运行 [=19= 的简洁包装] 来自命令行的文件。
受 steiny 答案的启发,我想出了一个更通用的解决方案
https://gist.github.com/ffissore/012d7e32a096fde5266f49038c93dcaf
本质上:jshell-wrapper
将删除脚本的第一行(应该是 shebang)并在脚本末尾添加一个 /exit
以下也适用;将其放入 someScript.jsh
文件并 运行 与 ./someScript.jsh
。 someScript.jsh
收到的所有参数都将转到 String[] args
。
#!/home/gigi/.sdkman/candidates/java/current/bin/java --source 11
import java.util.Arrays;
import ro.go.adrhc.*; // example of using your classes, e.g. App below
public class X {
public static void main(String[] args) {
// do whatever you want here, e.g.:
// System.out.println("Hello World");
// or
// use a class:
// App.main(args);
// e.g. from ro.go.adrhc package, by running:
// CLASSPATH="/path-to-ro.go.adrhc-classes" ./someScript.jsh
}
}
包装 class 的用法,此处 X
是实现此功能的必要技巧。
灵感来自 https://blog.codefx.org/java/scripting-java-shebang/.