2017-03-03 160 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

是的,我试图运行代码 –

相关问题