4

これはstackoverflowに関する私の最初の質問なので、簡潔で関連性のあるものにしようと思います.

現在、システム上にある外部プログラムを呼び出そうとする Java プログラムを作成していますが、これを行うには、関連するライブラリへのリンクを設定するシェル スクリプトを呼び出して、システムがリンクされていることを確認する必要があります。外部プログラムが実行される前に、これらに。

当面の問題は、Java を介してシェル スクリプトを呼び出すことができないことです。高低を調査し、ProcessBuilder クラスの使用などの代替方法を認識しています。残念ながら、私は Java を介してコマンド ライン ステートメントを呼び出そうとする世界にまったく慣れていないため、回答が得られずに困っています。

私が使用しているコードの例を以下に示します。

private void analyse_JButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                

// Get project path for copying of Fortran program to folder and execution

String projectPath =  Newproject_GUI.getProjectPath();


String sourcePath [] = {"/bin/sh ", "-c ","source ~/set_env_WRF_gnu.sh"} ;



Runtime fortranAnalyser = Runtime.getRuntime();

try {
        Process p = fortranAnalyser.exec("cp main.exe " + projectPath);
        Process k = fortranAnalyser.exec(sourcePath);



        BufferedReader is = new BufferedReader(new InputStreamReader(k.getInputStream()));
        String line;
        while ((line = is.readLine()) != null) {

            System.out.println(line); 
        } 


    } catch (IOException ex) {
        Logger.getLogger(Analyser_GUI.class.getName()).log(Level.SEVERE, null, ex);
      }

}

プロセス p は正常に動作し、メソッドが呼び出されたときに実際に main.exe を目的のディレクトリにコピーします。ただし、プロセス k はそうではなく、これが問題の場所です。

前もって感謝します。

4

1 に答える 1

3

問題は、「ソース」がBASHの内部コマンドであることです(「sh」を使用していますが、それは簡易モードのBASHです)。だからあなたがすることは次のとおりです:

  • 新しいプロセス「sh」を生成し、そこに何かをソースします(いくつかの変数を設定すると思います)
  • プロセスが終了し、すべての変数が失われます
  • 別のプロセスを生成しますが、VARIABLES は既になくなっています

これらの変数を後で使用するかどうかはわかりませんが、スクリプト名によると、おそらくいくつかを設定しています。こんなことしないで。

ちなみに、スクリプトをbashで実行したいだけなら、sourceする必要はありません。副作用を得るには、次のように実行します。

String sourcePath [] = {"/bin/sh ", "/home/XYZ/set_env_WRF_gnu.sh"} ;

~ は使用できないことに注意してください。この場合、Java を使用してホーム ディレクトリを取得してください。

于 2012-07-03T14:12:49.963 に答える