2017-03-03 35 views
1

我想通過Eclipse通過腳本執行以下命令。如何通過Eclipse IDE運行具有Java命令的腳本,以便查看輸出並與程序交互?

java -cp /home/pallavi/KeplereeWorkspace/trace/target/classes:/home/pallavi/git/thesis-2016/Soot_Instrumentation/sootOutput org.employee.Employee 

我運行它喜歡:

Runtime.getRuntime().exec("./src/main/resources/Intrumentation_Execution.sh"); 

程序「僱員」是一個交互程序,這意味着用戶需要選擇選項和不同的輸出/可能發生的過程。如果我使用BufferedReader,我只看到最初的printlines,並且沒有用戶輸入。當我從終端運行Intrumentation_Execution.sh時,一切正常。但是,我需要通過另一個Java程序來運行它。

另請注意,我不能在我的執行類中調用Employee的主要方法,因爲我正在構建一個自動化工具,其中Employee僅僅是一個測試用例。

回答

1

創建一個橋樑來與從shell腳本啓動的Java進程通信。喜歡的東西下面:

startreader.sh

#!/bin/bash 
echo "" > inputbridge.txt 
tailf inputbridge.txt | java SampleRead 

SampleRead.java

import java.util.Scanner; 

public class SampleRead { 
    public static void main(String [] args) { 
     Scanner scanner = new Scanner(System.in); 
     int readValue = 0; 
     while((readValue = scanner.nextInt()) != 5) { 
      System.out.println("Send me something other than " + readValue); 
     } 
     System.out.println("Good job. Bye"); 
    } 
} 

NumberGenerator.java

import java.io.FileWriter; 
import java.io.IOException; 
import java.util.Scanner; 
public class NumberGenerator { 
    public static void main(String [] args) throws IOException { 
     ProcessBuilder processBuilder = new ProcessBuilder("./startreader.sh"); 
     Process process = processBuilder.start(); 
     Scanner processStreamReader = new Scanner(process.getInputStream()); 
     String processInputString = null; 
     do { 
      try(FileWriter fileWriter = new FileWriter("inputbridge.txt", true)) { 
       fileWriter.write(((int)(Math.random() * ((10 - 1) + 1)) + 1) + "\n"); 
      } catch(IOException e) { 
       e.printStackTrace(); 
      } 
      processInputString = processStreamReader.nextLine(); 
      System.out.println(processInputString); 

     } while(processInputString.startsWith("Send me something other than")); 
    } 
} 

步驟來運行:

  1. 編譯SampleRead.javaNumberGenerator.java
  2. 提供startreader.sh
  3. 運行java NumberGenerator

輸出

[[email protected] java]$ java NumberGenerator 
Send me something other than 1 
Send me something other than 6 
Send me something other than 8 
Send me something other than 4 
Good job. Bye 
[[email protected] java]$ cat inputbridge.txt 

1 
6 
8 
4 
5 
執行權限

這是如何工作: 橋的NumberGeneratorSampleRead之間是通過startreader.sh產生inputbridge.txt文件。當NumberGenerator運行時,它會執行startreader.sh,它會生成inputbridge.txt並清空它。 startreader.sh的下一個階段是在inputbridge.txt文件上做tailf。寫入此文件的任何新行將通過tailf進程成爲SampleRead的輸入。

NumberGenerator隨機選擇一個號碼,通過寫inputbridge.txt發送到SampleRead,它就會通過SampleRead收到,檢​​查它是否是值5。除值5將輸出「送我的東西......」這是讀通過NumberGenerator通過ProcessInputStream

這種做法應該與支票java進程存在執行shell腳本後得到加強。而且,tailf進程在手動終止之前不會退出。因此,tailf可以替換爲另一個代理java應用程序,它具有與NumberGenerator類型的應用程序通信的協議,以瞭解何時結束執行。如果開發Java代理應用程序,您可以考慮使用Sockets而不是文件。

+0

嗨,對不起,遲到的迴應。但我無法獲得與您指示的相同的輸出。我的輸出只是一個空白屏幕,如果我輸入任何數字,它都不會顯示任何內容。請讓我知道我要出錯的地方 –

+0

您是否想要運行示例代碼? –

+0

是的,我試圖運行代碼 –

相關問題