【问题标题】:Execute java in shell and wait until i get the return code在 shell 中执行 java 并等到我得到返回码
【发布时间】:2017-01-16 07:01:06
【问题描述】:

我现在正在执行 java 一个这样的 java 程序:

package com.test;

public class Test {

    public static void main(String[] args){
        execute();
    }

    public static String  execute(){
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "a";
    }
}

我想在 linux shell 脚本中执行 Test.execute() 方法,等到方法返回并获取返回码。但是 main() 方法的返回是 void ,那我该怎么做才能从中获取返回码或返回 msg 呢?

有什么建议吗?


我找到了解决办法:

package com.test;

public class Test {

    public static void main(String[] args){
          execute();
    }

    public static String  execute(){
        try {
            System.out.println("sleeping");;
            Thread.sleep(5000);
            Runtime.getRuntime().exit(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "a";
    }
}

然后是我的外壳:

#!/bin/bash
java -cp test.jar com.test.Test
echo "The return code of the java application is $?"

我可以得到Runtime.getRuntime().exit(n)中的值n;

【问题讨论】:

  • 你卡在哪一部分了?
  • 什么“返回码”?您没有在上面设置任何内容。
  • 什么外壳?重击? Windows cmd?
  • 通常调用System.exit() 而不是Runtime.getRunTime().exit() 请查看此处的文档docs.oracle.com/javase/8/docs/api/java/lang/…

标签: java shell return-value


【解决方案1】:

首先在您的代码示例中更改main 方法的签名:

public static void main()public static void main(String[] args)

然后,不要只从main 调用execute 方法,而是尝试使用System.out.println 打印结果:

System.out.println(execute());

然后在 linux shell 中您可以使用以下方法获取返回值:

> set out   = `java com.test.Test`
> echo $out

【讨论】:

    【解决方案2】:

    shell 脚本必须调用java com.test.Test。这将调用主要方法,而该方法又正在调用执行。 您必须从 shell 脚本启动 JVM,而 JVM 总是以 Main 方法启动。 至于返回码,您可以使用$? shell 变量访问它。 所以基本上你的 shell 脚本会是这样的:

    #!/bin/bash
    java -cp . com.test.Test
    echo "The return code of the java application is $?"
    

    您还需要指定所有相关类所在的类路径。在上面的示例中,我将当前目录作为类路径。

    JVM 将在所有非守护线程完成时以退出代码 0 终止。如果您想在发生错误时返回特定的退出代码,您可以使用System.exit(<codehere>)。请注意,调用System.exit() 会导致JVM 关闭,即使还有其他非守护线程正在运行。

    编辑: 添加了“-cp”。到基于 cmets 的命令。 添加了一些退出代码细节

    【讨论】:

    • $?保持上一个命令的状态。在您的情况下,它将保留返回值。
    • 保留返回值?但是java main()方法的返回值应该是void。那我该怎么办呢?
    • JVM如何知道类路径?
    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多