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.java
或 hellocli.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-catalog.json
后,其内容会出现在商店中。尝试搜索 "eugenp" 可找到本文用到的脚本。
8. 总结
本文安装了 JBang,实现了创建、编辑、构建、运行、安装 Java 应用和脚本的极致便捷体验。无需 Maven/Gradle 基础即可上手 Java 开发。进阶时,JBang 支持通过 Maven 坐标获取依赖,可使用整个 Java 生态(包括 Spring/Quarkus 等运行时框架,甚至 JavaFX 等图形框架)。
JBang 兼容所有现代 IDE,支持多文件,能解析 URL 背后的内容,实现源码和别名的便捷发布与共享。