23

鉴于 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中有一个增强请求。

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

4

4 回答 4

30

采用

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

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

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

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

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

jshell --help查阅和的输出以jshell --help-extra获取更多选项。

更新

还可以查看https://github.com/maxandersen/jbang 玩转 Java 脚本,它提供了.java从命令行运行文件的简洁包装器。

于 2017-07-05T11:51:39.673 回答
4

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

更改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
于 2017-07-05T03:36:25.180 回答
2

受到 steiny answer 的启发,我想出了一个更通用的解决方案

https://gist.github.com/ffissore/012d7e32a096fde5266f49038c93dcaf

本质上:jshell-wrapper将删除脚本的第一行(应该是 shebang)并/exit在脚本末尾添加 a

于 2017-11-17T13:09:26.883 回答
1

以下也适用;将其放入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 
    }
}

包装类的使用,here X,是它工作的一个强制性技巧。
灵感来自https://blog.codefx.org/java/scripting-java-shebang/

于 2020-04-30T07:37:43.567 回答