2017-01-16 52 views
1

我現在執行Java的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()方法的返回是無效的,所以我能做些什麼來獲取返回碼或從中返回味精?

有什麼建議嗎?


我找到一個解決方案:

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 $?" 

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

+0

你卡在哪個部分? – shmosel

+0

什麼「返回碼」?你沒有設置任何上面。 –

+0

什麼外殼?慶典? Windows cmd? –

回答

0

shell腳本必須調用java com.test.Test。這將調用inturn當前調用的主要方法execute。 從shell腳本中,您必須啓動JVM,並且JVM始終以Main方法啓動。 至於返回代碼,您可以使用$? shell變量來訪問它。 所以基本上你的shell腳本會是這樣的:

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

你也需要指定所有你相關的類所在的類路徑。在上面的例子中,我將當前的dir作爲類路徑。

完成所有非守護程序線程後,JVM將以退出代碼0結束。如果您想要在出現錯誤時返回特定的退出碼,您可以使用System.exit(<codehere>)。請注意,即使有其他正在運行的非守護程序線程,調用System.exit()也會導致JVM關閉。編號: 已添加「-cp」。到基於評論的命令。 增加了一些退出代碼細節

+0

$?保持前一個命令的狀態。在你的情況下,它會保持返回值。 – ASR

+0

保持返回值?但是java main()方法的返回值應該是無效的。那麼我能做什麼? – wuchang

+0

JVM如何知道類路徑? – rkosegi

0

首先改變main方法在你的代碼示例簽名:

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

然後,而不是從main只是調用execute方法,嘗試使用打印結果System.out.println

System.out.println(execute()); 

然後在linux shell中可以使用foll由於得到了返回值:

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