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\""
};