如何构建可执行JAR以将字符串返回到外壳脚本

我必须从外壳脚本运行可执行JAR文件才能获得字符串值。可执行JAR不能返回值,因为Main返回空。我无法使用System.exit(Int),因为JAR必须返回字符串类型的值。

请提出建议。


解决方案

此数据应写入标准输出(在JAVA中为System.out),并使用$(command expansion)捕获。

以下是所有优秀的Unix公民(以及太少的Java程序)应该确保做的事情:

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

这里有一个完整的示例来演示Java和外壳脚本之间的相互作用:

$ 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);
  }
}

一个非常基本的清单:

$ cat manifest
Main-Class: Foo

一个简单的外壳脚本:

#!/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

相关文章