2012-01-26 1 views
0

에 ProcessBuilder를 가진 EXE 파일을 실행할 수 없습니다 :는 이런 식으로 몇 가지 매개 변수를 설정하는 동안 내가 exe 파일을 실행하려고 자바

myExePath -ini myIniPath -x myConfigFilePath

나는 그것이 완벽하게 작동 명령 줄에서 실행합니다. 하지만 Java 코드에서 실행하려고하면 프로세스가 시작되지만 잠시 후 더 이상 응답하지 않으므로 강제로 닫아야합니다. 이 자바 코드를 사용하고 있습니다 :

List<String> parameters = new ArrayList<String>(); 
    parameters.add(myexePath); 
    parameters.add("-ini "); 
    parameters.add(myIniPath); 
    parameters.add("-x "); 
    parameters.add(myConfigPath 
    ProcessBuilder builder = new ProcessBuilder(parameters); 
    Process process = builder.start(); 

    try { 
     process.waitFor(); 
    } catch (InterruptedException e) { 
     System.err.println("Process was interrupted"); 
    } 

내가 뭘 잘못하고 있는거야?

+0

스택 추적을 붙여 넣을 수 있습니까? –

+0

waitFor()를 실행 한 후 프로세스가 응답하지 않고 작업 관리자에서 닫아야 만 Java 코드가 향상 될 수 있습니다. – schmimona

+0

myExePath 자식 프로세스가 차단되고있는 것처럼 보입니다. 그것은 무엇을합니까? 완료하는 데 오랜 시간이 걸리는 이유는 무엇입니까? 별도의 콘솔 입력이 필요합니까? 별도의 콘솔 출력이 필요합니까? 그럴 경우 상위 프로세스의 표준 I/O 핸들을 상속하지 않아야 상위 프로세스의 표준 I/O 핸들을 차단하지 않습니다. Windows에서 익명 파이프를 통해이 작업을 수행 할 수 있습니다. 이것이 Java 7에서 이제 지원된다고 생각합니다. 이전 Java 버전에서는 JNI 또는 JNA를 사용하여 익명 파이프가있는 자식 프로세스를 만들어야했습니다. – ecle

답변

0

도움이되는지 확실하지 않지만 공백을 사용하는 이유는 무엇입니까? 예 : parameters.add("-x "); 필요하지 않습니다.

여러분이 시도 할 수있는 것은 모든 매개 변수를 배열에 넣고 배열을 인수로 취하는 ProcessBuilder의 또 다른 생성자를 사용하는 것입니다.

+0

나는 경로와 함께, 그리고없이 배열 문자열 [] 및 목록에 ... 함께 작동하지 않는 공간과 함께 노력했다 – schmimona

+0

내 문제는 비슷한 기억 해요. 내 프로세스가 루프에서 실행 된 후 반복 횟수가 얼마입니까? 루프 또는 스레드를 사용합니까? 코드를 더 게시 할 수 있습니까? – ka3ak

+0

스레드 ... 작업 관리자에서 다시 확인한 후 명령 줄에서 EXE를 실행하면 하나만 시작됩니다. 스레드 및 Java 코드에서 실행할 때 2 스레드가 만들어집니다. 그 이유는 막힘에 대한 생각하지만 왜 2 스레드가 만들어집니다 이해가 안 돼요. – schmimona

1

exe는 stdout, stderr, stdin을 사용합니까? 당신은 항상 그들로부터 읽거나 닫아야한다. 구현 및 버퍼 크기에 따라 읽기가 차단되는 경우 차단이 발생할 수 있습니다.

+0

예제를 보려면이 페이지를 참조하십시오. http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page = 4 –

+0

이 보입니다. 이 예제에서 ... InputStream 부분을 추가하고 이제는 작동합니다. 그것은 왜 작동하는지 모르지만, 감사합니다 @ martiell – schmimona

+0

아마 기사의 나머지 부분에서 설명 할 것입니다; 나는 보지 않았다. 코드에 직접 연결하여 작업 속도를 높이는 데 도움이되기를 바랍니다. 그 생각은 버퍼의 크기가 제한되어 있으므로 읽지 않는다면 공간이 생길 때까지 기다려야한다는 것입니다. 그렇지 않으면 출력이 손실됩니다. –

0

먼저 Runtime에 대한 참조를 가져야합니다.

당신은 비트 포맷을해야 할 수있는 매개 변수 목록에서이
Runtime.getRuntime().exec(parameters.toString());

귀하의 문자열을 할 수 있습니다.