2014-01-21 2 views
2

Java 프로그래밍 클래스 용 자동 학습 프로그램을 만들려고합니다. 이번 학기를 가르칩니다. Autograder의 기본 아이디어는 내 테스터의 .class 파일 사본을 학생들의 회전판과 동일한 위치 (각자의 폴더에 있음)에 배치한다는 것입니다. 결과를 텍스트 파일로보고하고 데이터를 다시 제공합니다.ProcessBuilder를 사용하여 여러 프로그램 실행

내가 붙어있는 문제는 내 테스터 클래스를 실행하기 위해 ProcessBuilder를 가져올 수 없다는 것이고, 명령을 입력하는 다양한 방법을 시도했지만 올바른 명령이 무엇인지 잘 모르겠습니다. . 여기에 코드입니다 :

public...main(String[] args){ 
///Code not relevant ommitted 
    Runtime runtime = Runtime.getRuntime(); 

    for (String person : uniqueIds) { 
     File currentLoc = new File(HW_ID + "/" + person); 
     ProcessBuilder g = new ProcessBuilder("bash", "-c", 
       "java", " -cp ", currentLoc.getAbsolutePath(), 
       " Grader"); 
     Process process = g.start(); 
     process.waitFor(); 
    } 
} 

"uniqueIds는"숙제가에있는 걸까요 폴더의 이름입니다 각 학생의 UNIQUEID가 포함 된 문자열 배열입니다. "HW_ID"는 모든 학생에 대해 설정 한 폴더의 이름 인 상수입니다. 파일 구조는 다음과 같습니다. HW_ID/uniqueID/

"등급"은 내 프로그램의 이름입니다. turnins를 갈아 치울 것입니다. ProcessBuilder를 사용하여 지정된 파일 위치에있는 그레이더 프로그램을 시작하려면 어떻게해야합니까?

EDIT : 저는 Mac을 사용하고 있지만 Windows 용 코드가 다르면 둘 다 기재하십시오. 감사!

+0

어떤 오류를 겪었습니까? – A4L

+0

다섯 번째 줄은 필요없고 중복되지 않습니다. currentLoc = 새로운 파일 (currentLoc.getAbsolutePath()); ProcessBuilder를 사용하여 자바 프로그램을 실행하려면 ProcessBuilder ("java.exe", "- cp", currentLoc.getAbsolutePath())와 같은 것을 시도해보십시오. – Alan

+0

@ A4L 오류가보고되지 않았습니다. 코드는 실행되지만 Grader를 실행하여 만들어야하는 텍스트 파일이 없으므로 Grader에 대한 호출이 올바르게 수행되지 않았 음을 나타냅니다. – db4soundman

답변

2

+를 사용하는 대신 프로세스 인수를 쉼표로 구분해야합니다. 그렇지 않으면 단일 매개 변수 "java-cp"가됩니다. ...

... g = 새 ProcessBuilder ("bash", "-c", "java", "-cp", ...)

+0

"currentLoc.toString() ..... person"의 부분은 실행해야하는 프로그램에 대한 파일 경로이기 때문에 여전히 + 기호가 있어야합니다. – db4soundman

+0

솔직히 말하면, -cp는 자바 클래스 나 jar가 들어있는 디렉토리처럼 보이지 않으므로 말하기 어렵습니다. 하지만 File 객체 자체에 경로 매개 변수를 전달하고 currentLoc을 사용해야합니다.getPath() 또는 getAbsolutePath()와 같은 것을 cp 매개 변수로 사용할 수 있습니다 (경로의 특정 플랫폼 관련 문제에 도움이 될 수도 있음). 따라서 for 루프 내에서 File을 이동하는 것이 좋습니다. –

+0

해당 제안을 반영하도록 코드를 편집했습니다. 아직도 작동하지 않는 것 같습니다. 콘솔 출력이 없어도 텍스트 파일 만 있어도 InputStreams 및 BufferedReader를 사용해야 할 가능성이 있습니까? – db4soundman

0

실행하려는 프로그램이 Java 프로그램이고 동일한 현재 디렉토리에 있다고 가정하면 여기에 Tester.java라는 다른 프로그램에서 SerialNumber.java라는 프로그램을 어떻게 실행할 수 있는지 예가 나와 있습니다.

SerialNumber.java :

import java.io.*; 

public class SerialNumber 
{ 
    public static void main(String[] args) 
    { 
    try{ 
     SerialNumber sn = new SerialNumber(); 
     System.out.println(sn.executeVolCommand()); 
    } 
    catch(Exception e){e.printStackTrace();} 
    } 

    public String executeVolCommand() 
    { 
    String NEWLINE = System.getProperty("line.separator"); 
    StringBuffer buffer = new StringBuffer(); 
    try{ 

     Process pb = new ProcessBuilder("cmd","/c", "vol").start(); 
     InputStream in = pb.getInputStream(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String line; 
     while ((line = br.readLine()) != null) { 
     buffer.append(line + NEWLINE); 
     } 
    } 
    catch(Exception e){e.printStackTrace();} 
    return buffer.toString(); 
    } 
} 

Tester.java :

import java.io.*; 

public class Tester 
{ 
    public static void main(String[] args) 
    { 
    try{ 
     File currentLoc = new File("SerialNumber"); 
     System.out.println(currentLoc.getAbsolutePath()); 
     ProcessBuilder pb = new ProcessBuilder("java.exe",currentLoc.getName()); 
     Process p = pb.start(); 

     //Read out dir output 
     InputStream is = p.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 

     while ((line = br.readLine()) != null) { 
     System.out.println(line); 
     } 
    } 
    catch(Exception e){e.printStackTrace();} 
    } 
} 

희망이 있습니다.

+0

내 상황을이 예제와 비교하기 위해 SerialNumber.java 파일 (내 그레이더)은 사용자가 원하는 것보다 디렉토리의 두 폴더 레벨에 위치합니다 Tester.java를 실행해야합니다. – db4soundman

+0

File 객체를 선언 할 때 프로그램 위치를 결정하고 설정합니다. File currentLoc = new File ("folder1"+ File.separator + "folder2"+ File.separator + "SerialNumber"); 귀하의 경우에는 문자열 리터럴 folder1과 folder2를 명령 줄에서 오는 값으로 대체 할 수 있습니다. 파일 currentLoc = new File (args [0] + File.separator + args [1] + File.separator + "SerialNumber "); – Alan