2. 安装 JBang

首先需要安装 JBang。我们可以使用操作系统自带的包管理器,或者通过通用的 curl/iex 命令下载。所有主流操作系统的安装指南可在 jbang.dev/download 查看。这里以通用方式为例:

在 Linux、Mac 或支持 bash 的 Windows 环境中,使用 curl:

curl -Ls https://sh.jbang.dev | bash -s - app setup

在 Windows PowerShell 中,使用 iex:

iex "& { $(iwr https://ps.jbang.dev) } app setup"

首次运行时,会看到类似以下输出:

$ curl -Ls https://sh.jbang.dev | bash -s - app setup
Downloading JBang...
Installing JBang...
Downloading JDK 11. Be patient, this can take several minutes...
Installing JDK 11...
[jbang] Default JDK set to 11
[jbang] Setting up Jbang environment...
Please start a new Shell for changes to take effect

注意:启动前无需安装 Java——JBang 会在需要时自动从 Eclipse Adoptium(原 AdoptOpenJDK)下载 JDK。

验证安装是否成功,重启终端后运行 jbang version

$ jbang version
0.83.1

现在可以开始使用 JBang 了。

3. 第一个 Java 脚本

使用 jbang init 创建第一个 Java 文件:

$ jbang init hello.java
[jbang] File initialized. You can now run it with 'jbang hello.java' or edit it using 'jbang edit --open=[editor] hello.java' where [editor] is your editor or IDE, e.g. 'netbeans'

通过 jbang hello.java./hello.java(如果 shell 支持)运行:

./hello.java
[jbang] Building jar...
Hello World
❯ ./hello.java
Hello World

搞定!无需配置构建工具或手动编译——JBang 全包了。注意首次运行会打印 "Building jar",第二次直接输出 "Hello World",因为 JBang 复用了已编译的 JAR。

来点刺激的:创建带外部依赖的 Java 文件。使用模板:

jbang init -t cli hellocli.java

cli 是默认模板之一。通过 jbang template list 查看可用模板:

$ jbang template list
agent = Agent template
cli = CLI template
hello = Basic Hello World template
hello.kt = Basic kotlin Hello World template
qcli = Quarkus CLI template
qmetrics = Quarkus Metrics template
qrest = Quarkus REST template

运行 hellocli.java 会自动拉取 Picocli 依赖并处理参数:

$ jbang hellocli.java Baeldung
[jbang] Resolving dependencies...
[jbang]     Resolving info.picocli:picocli:4.5.0...Done
[jbang] Dependencies resolved
[jbang] Building jar...
Hello Baeldung

第二次运行时,由于源码未修改,不会重复解析依赖。

4. JBang 注释

查看 hello.javahellocli.java 会发现只是个普通 Java 类:

///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS info.picocli:picocli:4.5.0

import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;

import java.util.concurrent.Callable;

@Command(name = "hellocli", mixinStandardHelpOptions = true, version = "hellocli 0.1",
        description = "hellocli made with jbang")
class hellocli implements Callable<Integer> {

    @Parameters(index = "0", description = "The greeting to print", defaultValue = "World!")
    private String greeting;

    public static void main(String... args) {
        int exitCode = new CommandLine(new hellocli()).execute(args);
        System.exit(exitCode);
    }

    @Override
    public Integer call() throws Exception { // your business logic goes here...
        System.out.println("Hello " + greeting);
        return 0;
    }
}

前两行以 // 开头,在 Java 中是注释:

  • ///usr/bin/env jbang "$0" "$@" ; exit $?
    在 bash/zsh 中允许直接通过 ./hellocli.java 运行文件。
  • //DEPS info.picocli:picocli:4.5.0
    JBang 识别的魔法标记,用于声明依赖。语法与 Gradle 等 Maven 构建工具的标准依赖格式一致。可多行声明多个依赖,JBang 会自动处理传递依赖,只需声明顶级依赖即可

其他魔法标记:

  • JAVA – 指定 Java 版本(如 JAVA 11+ 表示 11 或更高,JAVA 14 表示精确版本)
  • JAVA_OPTIONS – 添加到 Java 命令行,用于内存设置或系统属性
  • JAVAC_OPTIONS – 添加到 javac 编译命令,用于启用预览特性等

更多示例见 JBang 文档

5. 编辑

了解了 JBang 如何解析文件后,如何编辑 .java 文件并获得传统 IDE 的代码提示、重构等功能?

答案是 jbang edit。**jbang edit 会创建一个符号链接项目,现代 Java 编辑器均可打开**。运行 jbang edit hellocli.java 时,JBang 会询问是否下载配置 VSCodium 实现零设置。若偏好 Intellij IDEA(已加入 PATH),可运行:

jbang edit --open=idea hellocli.java

6. 多文件支持

目前只处理了单文件,多文件场景怎么办?JBang 支持多源文件和任意资源(如 .html 文件),通过 //SOURCES//FILES 声明:

  • 引入特定源文件://SOURCE myfile.java
  • 引入所有 Java 文件://SOURCE **/*.java
  • 资源语法://FILES <mountpoint>[=<sourcefile>]

示例:

//FILES resource.properties
//FILES META-INF/resources/index.html=index.html

完整多文件示例:

///usr/bin/env jbang "$0" "$@" ; exit $?
// Update the Quarkus version to what you want here or run jbang with
// `-Dquarkus.version=<version>` to override it.
//DEPS io.quarkus:quarkus-bom:${quarkus.version:2.4.0.Final}@pom
//DEPS io.quarkus:quarkus-resteasy
//JAVAC_OPTIONS -parameters

//FILES META-INF/resources/index.html=index.html

import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("/hello")
@ApplicationScoped
public class jbangquarkus {
    @GET
    public String sayHello() {
        return "Hello from Quarkus with jbang.dev";
    }
}

此例展示了 JBang 与 Quarkus 的集成。通过添加 Quarkus 依赖,可直接在 http://localhost:8080 访问首页,在 http://localhost:8080/hello 访问 REST 接口。

借助 JBang,既能写小型脚本,也能用任何 Java 框架构建完整的微服务甚至应用

7. 代码共享

现在可以编写、运行、编辑 JBang 应用,如何分享代码让他人运行?

使用 jbang export 生成可共享的 JAR 包。更便捷的方式是通过 GitHub、GitLab、BitBucket 等分享。

JBang 支持直接运行 URL 中的源码,并能自动识别托管服务类型。例如运行前面的 Quarkus 示例:

jbang https://github.com/eugenp/tutorials/blob/jbangguide/jbang/jbangquarkus.java

JBang 会自动下载、编译、运行所需的多文件,如同本地文件操作。

无需打包配置——JBang 天生支持便捷分享

7.1. 别名

URL 输入麻烦?可用别名简化:

jbang alias add https://github.com/eugenp/tutorials/blob/jbangguide/jbang/jbangquarkus.java

之后即可用 jbang jbangquarkus 运行。

默认别名全局安装,但通过 -f 可限定目录范围:

jbang alias add -f . https://github.com/eugenp/tutorials/blob/jbangguide/jbang/jbangquarkus.java

非常适合添加项目专属命令,且这些命令可共享,无需编写 Gradle/Maven 插件

别名存储在 jbang-catalog.json 文件中,可托管在任何位置。

7.2. 应用安装

别名引出了另一实用功能:安装脚本/应用(类似 npm install/pip install)。JBang 中称为 jbang app install,支持本地/远程脚本和 JAR。

安装本地 hello.java

jbang app install hello.java

现在 hello 命令已加入系统 PATH。

安装远程 jbangquarkus.java

jbang app install https://github.com/eugenp/tutorials/blob/jbangguide/jbang/jbangquarkus.java

运行后 jbangquarkus 命令将加入 PATH。

jbang app install 同样支持别名。

别名可托管在任何位置,因此 JBang 提供了官方应用商店:https://jbang.dev/appstore。可搜索通过 jbang-catalog.json 发布的脚本:

jbang appstore

创建 jbang-catalog.json 后,其内容会出现在商店中。尝试搜索 "eugenp" 可找到本文用到的脚本。

8. 总结

本文安装了 JBang,实现了创建、编辑、构建、运行、安装 Java 应用和脚本的极致便捷体验。无需 Maven/Gradle 基础即可上手 Java 开发。进阶时,JBang 支持通过 Maven 坐标获取依赖,可使用整个 Java 生态(包括 Spring/Quarkus 等运行时框架,甚至 JavaFX 等图形框架)。

JBang 兼容所有现代 IDE,支持多文件,能解析 URL 背后的内容,实现源码和别名的便捷发布与共享

JBang 文档和应用商店见其官网。本文示例代码在 GitHub 可查。


原始标题:Guide to JBang