This is a little trick to turn an executable Java jar.
It works on all unixy like systems including Linux, MacOS, Cygwin, and Windows Linux subsystem.
$ ls
hello.jar
$ java -jar hello.jar
Hello from Java
Add a shell script to the header of the jar, rename to anything, and make it executable
$ (echo '#!/bin/sh' && echo 'exec java -jar $0 "$@"' && cat hello.jar) > hello
$ chmod +x hello
$ rm hello.jar
$ ls
hello
$ ./hello
Hello from Java
This single file can be copied to a server. The only dependency is it expects to find a java
JVM in the PATH
.
This relies on a little known trick about the Zip format allowing arbitrary data to be prepended/appended around the main zip file.
So:
- The file looks like a shell script. Executing it will run it
- The shell script calls
exec java -jar [myfilename] [args...]
replacing the current process - The Java VM loads, loads the same script as a Jar and happily ignores the initial shell script because Zip allows that
Yep. This makes it much simpler to distribute Python tools without having to worry about pip, virtual-env, or Conda. Just ship a single self-contained executable.
In Python you use .pex
files, which like .jar
files are just Zips. See PEP-441.
Create a Zip containing all your Python files (and dependencies). Include __main__.py
as the entry point. Prepend #!/usr/bin/env python
to the Zip, make executable, remove the .zip
suffix. This is easy to script, but if you want something out of the box there's an existing tool