How to execute a javascript with jshell?

后端 未结 4 999
自闭症患者
自闭症患者 2020-12-08 08:07

Given that Java 9 is upon us and we can finally have a java REPL with jshell I was hoping there was a way to add a shebang to a script and have jshell

相关标签:
4条回答
  • 2020-12-08 08:35

    The below works too; put it into a someScript.jsh file and run it with ./someScript.jsh. All arguments received by someScript.jsh will go to 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 
        }
    }
    

    The usage of the wrapping class, here X, is a mandatory trick for this to work.
    Inspired by https://blog.codefx.org/java/scripting-java-shebang/.

    0 讨论(0)
  • 2020-12-08 08:43

    Inspired by steiny answer, I came up with a more generic solution

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

    In essence: jshell-wrapper will strip the first line of the script (which is supposed to be the shebang) and will add a /exit at the end of the script

    0 讨论(0)
  • 2020-12-08 08:50

    Use

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

    as the first line of test.jsh. The test.jsh script could look like:

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

    The command line option --show-version is optional, of course, but gives immediate feedback that the tool is running.

    The extra command line option --execution local prevents jshell to spawn another VM. This speeds up launch time and if an exception is thrown by your script code, the local VM will exit.

    Consult the output of jshell --help and jshell --help-extra for more options.

    Update

    Also take a look at https://github.com/maxandersen/jbang Having fun with Java scripting, which offers a neat wrapper around running .java files from the command line.

    0 讨论(0)
  • 2020-12-08 08:56

    It turns out that with a bit of trickery there is a way, although I haven't fully managed to suppress the interpreted commands but pretty close to what I want.

    Change test.jsh to:

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

    Which gives us:

    ⚡ ./test.jsh
    -> System.out.println("Hello World")
    Hello World
    -> /exit
    
    0 讨论(0)
提交回复
热议问题