javashebangjava-9jshell

How to execute a java script with jshell?


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 interpret it.

I tried creating test.jsh:

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

However that gives:

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

It turns out there is an enhancement request for this in OpenJDK https://bugs.openjdk.java.net/browse/JDK-8167440.

Is there any other way to do this?


Solution

  • 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/jbangdev/jbang Having fun with Java scripting, which offers a neat wrapper around running .java files from the command line.