sitelink1 | http://egloos.zum.com/lempel/v/10961361 |
---|---|
sitelink2 | |
sitelink3 | |
sitelink4 | |
sitelink5 | |
sitelink6 |
도스커맨드를 java에서 실행하기 위한 방법으로 Runtime.getRuntime().exec() 와 java.lang.ProcessBuilder 클래스를 이용하는 방법이 있다
그리고 코드를 작성하여 실행하다보면 제목과 같은 오류가 심심치않게 발생한다
그것은 실행할 명령어의 매개변수들 사이의 공백이 구분자가 되기 때문이다
가령 디렉토리를 조회하기 위한 명령어 "dir" 의 정식 명령은 "cmd /c dir" 이다
이를 ProcessBuilder 를 이용하여 실행하려면 다음과 같은 command 매개변수로 변환해줘야 한다
String[] cmd = new String[] {"cmd", "/c", "dir"};
보다시피 명령어 사이의 공백들을 구분자로 배열에 분리하여 저장하고 있다
그렇지않고 명령어들을 하나로 묶게 되면 -> String[] command = new String[] {"cmd /c dir"};
"Cannot run program..." 이라는 오류 메세지를 만나게 된다
반드시 공백을 구분자로 배열에 분리 저장하여 ProcessBuilder 나 Runtime 클래스의 매개변수로 넘겨줘야 한다
java로 실행할 도스커맨드 명령어 ->
String cmd = "java -classpath \"d:/workspace/some project/lib/something.jar\" blah.blah.SomeClass arg1 arg2";
ProcessBuilder 용 List 형태 매개변수로 변환 후 실행 첫번째 ->
List<String> cmd = new ArrayList<String>();
cmd.add("java");
cmd.add("-classpath");
cmd.add("\"d:/workspace/some project/lib/something.jar\"");
cmd.add("blah.blah.SomeClass");
cmd.add("arg1");
cmd.add("arg2");
ProcessBuilder bld = new ProcessBuilder(cmd);
bld.directory(new File("d:/workspace/some project"));
bld.start();
ProcessBuilder 용 Array 형태 매개변수로 변환 후 실행 ->
String[] cmd = new String[] { "java"
,"-classpath"
,"\"d:/workspace/some project/lib/something.jar\""
,"blah.blah.SomeClass"
,"arg1"
,"arg2"
};
ProcessBuilder bld = new ProcessBuilder(cmd);
bld.directory(new File("d:/workspace/some project"));
bld.start();
※ 추가로 다음과 같이 스페이스 문자 자체가 값일때도 그냥 분리해주면 잘 돌아간다
- Command > git log --pretty=format:"%H %cn %cd"
- Code >
String[] command = new String[] {
"git"
,"log"
,"--pretty=format:\"%H"
,"%cn"
,"%cd\""
};
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
» | [java.lang.ProcessBuilder] “매개변수가 틀립니다” 혹은 ”Cannot run program” | 황제낙엽 | 2021.10.15 | 541 |
4 | 특정 경로에서 쉘 명령어 실행하기 (ProcessBuilder) | 황제낙엽 | 2021.10.08 | 408 |
3 | Runtime 클래스의 exec() 함수 실행시의 실행 결과 수집 | 황제낙엽 | 2020.03.26 | 359 |
2 | Runtime 클래스를 이용한 윈도우 프로그램 실행 예제 | 황제낙엽 | 2017.08.01 | 413 |
1 | OS 쉘 명령어(shell script) 실행하기 [ProcessBuilder, Runtime.getRuntime().exec()] | 황제낙엽 | 2012.02.22 | 923 |