2013-05-23 4 views
3

나는이 어리석은 알 수없는 동작이 있습니다. 내 응용 프로그램에서는 일부 작업을 실행하기 위해 Java 프로세스를 시작해야합니다. 그래서 아래에 :경로에 공백이있는 이상한 동작

1a) String[] ls = {"cmd", 
       "/C", 
       "\"C:\\t e m p\\run time\\jre\\bin\\java.exe\"", 
       "-jar", 
       "Canon.jar"}; 
ProcessBuilder p = new ProcessBuilder(ls); 
p.redirectErrorStream(); 
Process pp = p.start(); 

위의 작품은 완벽하게 작동합니다. 하지만 Canon.jar의 전체 경로에 공백이 있으면 작동하지 않습니다. 기본적으로 Canon.jar 경로 주변에 quotes을 추가해야합니다. 즉

1b) String[] ls = {"cmd","/C", 
       "\"C:\\Prac\\t e m p\\run time\\jre\\bin\\java.exe\"","-jar", 
       "\"C:\\Prac\\t e m p\\Canon.jar\""}; 

위의 내용은 따옴표를 포함 한 후에도 작동하지 않습니다. 그것은 말한다 :

종료 'C : 사용자 \ \ Jatin \ 문서가 Prac \ T는 \'는 내부 또는 외부 명령, 실행할 수있는 프로그램, 또는 배치 파일이 아닙니다.

가장 큰 문제이며, 또한 아래는 작동하지 않습니다

1c) String[] ls = {"cmd","/C", 
       "\"C:\\Prac\\t e m p\\run time\\jre\\bin\\java.exe\"","-jar", 
       "\"C:\\Prac\\temp\\Canon.jar\""};//contains no white space. 

을 여전히 같은 오류를 말한다. Canon.jar의 경로에 공백이 포함되어 있지 않으면 어떻게 될까요? 1a이 작동했을 때 java.exe 경로에서 문제가 발생하는 이유는 무엇입니까?

+0

왜 경로에 공백이 있습니까? 또한 1c에서도 java.exe 경로에 공백이 있습니다. – Ankit

+0

'\\ t '의'\ t'가 탭 문자로 이스케이프되고 있습니까? 그냥 추측 해. –

+0

@Ankit 테스트 용 - 공백입니다. '1c'에서 정확히 요점은, 만약'1a'에서 작동한다면'1c'에서 실패 할 것입니다. – Jatin

답변

2

cmd이 정말로 필요합니까? 제거를 고려하십시오.

ProcessBuilder p = new ProcessBuilder(new String[]{"C:\\Prac\\t e m p\\run time\\jre\\bin\\java.exe","-jar", 
       "C:\\Prac\\t e m p\\Canon.jar"}; 
+0

효과가있었습니다. 'cmd'는 여기서 무엇을 얻게됩니까? 정교하게 주시겠습니까? – Jatin

+1

'cmd'를 제거하는 것 외에도, 경로 이름에 대한 불필요한 따옴표는 없어졌습니다. 그 자체로 충분할 것입니다. 오류 메시지의 전체 경로는 종을 울립니다. – devnull

+0

java.exe는 일반적으로 ** path ** 환경 변수에 있으므로 java.exe 만 사용할 수 있습니다. 마찬가지로 jar 파일은 ** classpath **에 속하므로 Canon.jar 만 사용할 수 있습니다. 이것은 완전한 경로 이름으로 모든 문제를 제거합니다. – Marichyasana