InfoQ Homepage News Scripting Java with a jBang
Scripting Java with a jBang
This item in japanese
Lire ce contenu en français
Oct 10, 2020 3 min read
by
Write for InfoQ
Feed your curiosity. Help 550k+ globalsenior developers
each month stay ahead.Get in touch
JBang provides a way of running Java code as a script, similar to JShell. However, unlike JShell, JBang works great on Java 8 and can be used to automatically download dependent libraries as well. In fact, JBang can even run without Java being installed -- it will simply download an appropriate JVM if needed.
JBang is a launcher script, written in bash and powershell, that can discover or download a JVM, and then (down)load the Java script given in an argument. The implementation of JBang is a Java JAR archive, which it then launches to execute further commands.
JBang can run jsh or java files; the latter is a standard Java class with a main() method. However, unlike JShell, comments at the top of JBang allow dependencies to be automatically downloaded and set up on the classpath. JShell allows adding JARs to the classpath at launch, but any (recursive) dependencies have to be added manually.
For example, to run a Java application that prints big text using the (GPL) jfiglef dependency, you can execute the following script with JBang:
//usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS com.github.lalyos:jfiglet:0.0.8
import com.github.lalyos.jfiglet.FigletFont;
class hello {
public static void main(String... args) throws Exception {
System.out.println(FigletFont.convertOneLine("Hello InfoQ"));
}
}
After installing jbang with sdkman or by downloading it, running jbang run hello.java InfoQ will print:
_ _ _ _ ___ __ ___ | | | | ___ | | | | ___ |_ _| _ __ / _| ___ / _ \ | |_| | / _ \ | | | | / _ \ | | | '_ \ | |_ / _ \ | | | | | _ | | __/ | | | | | (_) | | | | | | | | _| | (_) | | |_| | |_| |_| \___| |_| |_| \___/ |___| |_| |_| |_| \___/ \__\_\
The benefit of using jBang is that it will download the dependencies based on the //DEPS comment at the top of the file from the jcenter repository; it will then follow recursive dependencies to ensure that everything that is required for runtime is on the classpath. This allows for more complex applications to be scripted from the command line. In addition, dependencies can also be specified as direct links to GitHub repositories, either as a branch or as a tagged release. For internal uses, it's possible to specify additional repositories using the //REPOS comment, such as //REPOS mavenCentral,artifactory=https://example.com/repository
Multiple versions of Java are supported, and can be required with a //JAVA 8 or //JAVA 11+ comment which will use exactly Java 8 or Java 11 and above respectively. JVMs are downloaded from the AdoptOpenJDK site for the operating system that the command is being run on. Amongst other things, this allows very easy testing fo applications against Java 11, 14, 15 etc. because the jbang script has a --java option that allows execution of the script using the specified version; so you can run jbang run --java 11 hello.java or jbang run --java 14 hello.java to run the same script under both JVM versions.
You don't even need to have the script checked out, as the code can be downloaded from a remote source. Running the above example can be done simply by pointing at the URL that contains the script:
$ jbang run --java 15 https://github.com/jbangdev/jbang-replit-demo/blob/master/hello.java InfoQ _ _ _ _ ___ __ ___ | | | | ___ | | | | ___ |_ _| _ __ / _| ___ / _ \ | |_| | / _ \ | | | | / _ \ | | | '_ \ | |_ / _ \ | | | | | _ | | __/ | | | | | (_) | | | | | | | | _| | (_) | | |_| | |_| |_| \___| |_| |_| \___/ |___| |_| |_| |_| \___/ \__\_\
Finally, you can even run jbang without jbang being installed; a launcher script is available (for both Bash scripts and PowerShell scripts):
$ curl -Ls https://sh.jbang.dev | bash -s - https://github.com/jbangdev/jbang-replit-demo/blob/master/hello.java InfoQ
PS C:> iex "& { $(iwr https://ps.jbang.dev) } https://github.com/jbangdev/jbang-replit-demo/blob/master/hello.java InfoQ
For more information on jbang, see its homepage at https://jbang.dev or the GitHub repository at https://github.com/jbangdev/jbang.
-
Related Editorial
-
Related Sponsors
-
Popular across InfoQ
-
ArrowJS Reaches 1.0, Recast as the First UI Framework for the Agentic Era
-
Anthropic Releases and Temporarily Suspends Claude Fable 5
-
Anthropic Explains How Claude Builds Its Own Execution Harnesses
-
Spring Boot 4.1 Adds gRPC Auto-Configuration, SSRF Mitigation, and Kotlin 2.3 Support
-
Increasing Users' Data Agency: From BlueSky's AT Protocol to the Local-First Software Movement
-
Coinbase Postmortem Reveals How a Localized AWS Failure Triggered a Multi-Hour Trading Outage
-
The InfoQ Newsletter
A round-up of last week’s content on InfoQ sent out every Tuesday. Join a community of over 250,000 senior developers. View an example
