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

                };