写点什么

JBang Jash 为 Java 带来了简化的进程执行流程

  • 2025-05-19
    北京
  • 本文字数:1491 字

    阅读完需:约 5 分钟

大小:278.59K时长:01:35
JBang Jash为Java带来了简化的进程执行流程

JBang团队推出了JBang Jash(发音为 Jazz),这是一个 Java 库,旨在通过流畅且可预测的 API 简化外部进程和 shell 命令的执行,从而解决开发人员在使用标准 Java API(如 ProcessBuilderRuntime 中定义的重载 exec() 方法)执行这些任务时面临的常见复杂性和样板代码问题。

 

JBang Jash 旨在促进直观且可链式的进程执行,自动处理底层的输入/输出流管理。默认情况下,非零退出代码会被视为异常,这种行为是可以自定义的。它还支持在管道中传递命令,消除了手动流转发的需求,并且还能根据操作系统自动检测相应的 shell 环境,如 Bash、CMD 或 Powershell。


以下是一个使用纯 Java 的 shell 示例,需要手动处理流并进行显式错误检查。该示例运行"git status"并捕获输出:

 

// 没有使用JashProcessBuilder builder = new ProcessBuilder("git", "status");builder.redirectErrorStream(true);Process process = builder.start();BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {    System.out.println(line);}int exitCode = process.waitFor();if (exitCode != 0) {    throw new RuntimeException("Process exited with error code " + exitCode);}
复制代码


使用 Jash:

 

Jash.start("git", "status").stream().forEach(System.out::println);
复制代码

 

让我们再看一个如何在 Java 中管道化命令的示例,其中将小写文本转换为大写文本,并通过管道化 echo 命令的输出到 tr 命令中:

 

// 没有使用JashProcessBuilder echoBuilder = new ProcessBuilder("echo", "hello world");Process echoProcess = echoBuilder.start();ProcessBuilder trBuilder = new ProcessBuilder("tr", "a-z", "A-Z");Process trProcess = trBuilder.start();try (BufferedReader reader = new BufferedReader(new InputStreamReader(echoProcess.getInputStream()));     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(trProcess.getOutputStream()))) {    String line;    while ((line = reader.readLine()) != null) {        writer.write(line);        writer.newLine();    }    writer.flush();    trProcess.getOutputStream().close(); // 向tr发送EOF信号}int echoExit = echoProcess.waitFor();int trExit = trProcess.waitFor();if (echoExit != 0) {    throw new RuntimeException("echo failed with code " + echoExit);}try (BufferedReader resultReader = new BufferedReader(new InputStreamReader(trProcess.getInputStream()))) {    String line;    while ((line = resultReader.readLine()) != null) {        System.out.println(line); // 预期:HELLO WORLD    }}if (trExit != 0) {    throw new RuntimeException("tr failed with code " + trExit);}
复制代码


使用 Jash:

 

String result = Jash.start("echo", "hello world")    .pipe("tr", "a-z", "A-Z")    .get();System.out.println(result.trim()); // 输出:HELLO WORLD
复制代码

 

JBang Jash 基于 OnGres,Inc.在 2020 年发布的一个名为"fluent-process"的项目。该项目已经多年没有发布官方版本了,但在 2025 年被分支并重命名为"jash"(Java 和 Shell 的缩写),以反映其专注于为 shell 进程和流提供更符合 Java 17+接口的工作。

 

需要注意的是,Jash 可以集成到任何 Java 项目中,无需使用 JBang CLI 工具。

 

更多关于 JBang Jash 的示例和详细信息,请访问其GitHub仓库。

 

原文链接:

https://www.infoq.com/news/2025/05/jbang-jash/

2025-05-19 18:004002

评论

发布
暂无评论

三步法解析Express源码

执鸢者

面试 大前端 Node Express

如何设计大型互联网系统架构

天天向上

极客大学架构师训练营

迭代开发中的微服务拆分

码猿外

架构 微服务 架构演进

架构师训练营第四周学习总结

吴传禹

极客大学架构师训练营

架构师训练营第四周作业

吴传禹

极客大学架构师训练营

Linux的信号

菜鸟小sailor 🐕

c++

手把手教你分析Mysql死锁问题

捡田螺的小男孩

MySQL 死锁

十五、深入Python输入和输出

刘润森

Python

Flink时间服务和计时器-6-5

小知识点

scala 大数据 flink

第11周总结

Vincent

极客时间 极客大学

每天都要写吗?

Nydia

区块链要如何解决供应链金融痛点?

CECBC

区块链 金融

马化腾的区块链理想

CECBC

区块链 马化腾

架构师训练营第四周作业

我是谁

极客大学架构师训练营

一次用户故事地图之旅

Bruce Talk

敏捷开发 用户故事 Product Owner 用户故事地图

用Python绘制地理图

计算机与AI

Python 绘图

架构师训练营第四周课后作业

Gosling

极客大学架构师训练营

Week 3命题作业

balsamspear

极客大学架构师训练营

Week 3学习总结

balsamspear

极客大学架构师训练营

第11周作业

Vincent

极客时间 极客大学

大型互联网系统常用的技术方案

天天向上

极客大学架构师训练营

第四周总结

Geek_ac4080

自学编程,看书还是视频?

沉默王二

程序员 读书 自学编程 视频

第四课系统架构课后作业

Geek_michael

极客大学架构师训练营

职场求生攻略答疑篇之 4 —— 社会有多真实,人心就有多虚伪

臧萌

职场 职场成长

大区块链的必然性

CECBC

区块链技术

甲方日常 32

句子

随笔杂谈

给新入职工程师的10条建议

supernova

管理 职场 工作方式

架构师训练营第四周学习总结

Gosling

极客大学架构师训练营

十六、深入Python字符串

刘润森

Python

典型的大型互联网应用方案

garlic

极客大学架构师训练营

JBang Jash为Java带来了简化的进程执行流程_后端_AICon 全球人工智能开发与应用大会_InfoQ精选文章