2017-01-16 3 views
1

を取得するまで、私は今、JavaのこのようなJavaプログラムを実行しています待つ:待って、私はLinuxのシェルスクリプトでTest.execute()メソッドを実行したいはシェルで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"; 
    } 
} 

をメソッドが戻り、戻りコードを取得するまで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 $?" 

私はRuntime.getRuntime().exit(n)である値nを取得することができます。

+0

あなたはどこにいるのですか? – shmosel

+0

「返品コード」とは何ですか?上記を設定していません。 –

+0

どのようなシェルですか? bash? Windowsのcmd? –

答えて

0

シェルスクリプトは、java com.test.Testを呼び出す必要があります。これはinturnが現在実行しているmainメソッドを呼び出します。 シェルスクリプトから、JVMを起動しなければならず、JVMは常にMainメソッドで始まります。 リターンコードについては、$?シェル変数を使用してリターンコードにアクセスできます。 だから基本的にはあなたのシェルスクリプトは、このようなものになるだろう:

#!/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」が追加されました。コメントに基づいてコマンドに追加します。 は、いくつかの終了コードの詳細を追加しました

+0

$?前のコマンドのステータスを保持します。あなたの場合は戻り値を保持します。 – ASR

+0

戻り値を保持しますか? javaのmain()メソッドの戻り値はvoidでなければなりません。じゃあどうすればいい? – 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()); 

次にシェルではfollを使用できます戻り値を得るために:

> set out = `java com.test.Test` 
> echo $out 
関連する問題