java - 如何构建可执行 jar 以将字符串返回给 shell 脚本

标签 java shell return-value executable-jar return-type

我必须从 shell 脚本运行可执行 jar 文件以获取字符串值。可执行 jar 无法返回值,因为 main 返回 void。我不能使用 System.exit(int),因为 jar 必须返回 String 类型的值。

请提出建议。

最佳答案

此数据应写入标准输出(Java 中的System.out),并使用$(命令扩展) 捕获。

这是所有优秀的 Unix 公民(以及为数不多的 Java 程序)确保要做的事情:

  • 将程序结果写入标准输出(System.out)
  • 将错误信息和调试写入stderr (System.err)
  • 使用 System.exit(0) 表示成功(如果没有使用 System.exit,这也是默认设置)
  • 使用 System.exit(1)(或更高,最多 255)来指示失败

下面是演示 Java 和 shell 脚本之间相互作用的完整示例:

$ cat Foo.java
class Foo {
  public static void main(String[] args) {
    System.out.println("This data should be captured");
    System.err.println("This is other unrelated data.");
    System.exit(0);
  }
}

一个非常基本的 list :

$ cat manifest
Main-Class: Foo

一个简单的shell脚本:

#!/bin/sh
if var=$(java -jar foo.jar)
then
  echo "The program exited with success."
  echo "Here's what it said: $var"
else
  echo "The program failed with System.exit($?)"
  echo "Look at the errors above. The failing output was: $var"
fi

现在让我们编译并构建 jar 并使脚本可执行:

$ javac Foo.java
$ jar cfm foo.jar manifest Foo.class
$ chmod +x myscript

现在运行它:

$ ./myscript
This is other unrelated data.
The program exited with success.
Here's what it said: This data should be captured

关于java - 如何构建可执行 jar 以将字符串返回给 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41580301/

相关文章:

C++ microshell,输入命令并使用 fork()、dup()、pipe() 将其通过管道传输到进程。只是我没有得到我想要的结果

java - 如何在 Jelastic Tomcat 中引用 DLL 文件

java - 如何禁用 Jersey 的 JacksonJsonProvider 自动注册以便我使用自己的?

linux - Imagemagick 添加空白

javascript - 数组 forEach 不返回 bool 值

javascript - JS vue中如何将返回值放入另一个返回值中

rust - 如何从函数返回具有 String 类型字段的结构 Vec?

java - @Provides 和@Named 不适用于父类(super class)型声明的变量

java - 矩阵列和java

Linux "missing"错误