java runtime.getRuntime () 불법 인수 예외
-
13-09-2019 - |
문제
.getRuntime.exec ()를 제대로 작동시키기 위해 문제가 있습니다. 다음은 해당 부분을 다루는 코드입니다.
while (line != null)
{
String name = line;
String commandFull = commandFirst + name + commandLast;
String[] fullCommand = new String[] {commandFirst, name, commandLast};
for(int i=0;i<3;i++)
{
System.out.print(fullCommand[i]);
}
Runtime runner = Runtime.getRuntime();
Process p = runner.exec(fullCommand);
outFile.println(fullCommand);
line = inFile.readLine();
}
그것은 명령을보아야한다. 프로그램을 실행할 때 여기에서 출력이 있습니다.
adfind -b dc=stuff,dc=com -f "cn=user" |find "displayName" >> fullList.txt
Exception in thread "main" java.lang.IllegalArgumentException
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at lookup.main(lookup.java:41)
해결책
쉘없이 쉘 명령을 실행하려고합니다.
즉, 쉘이 해석 할 무언가를 실행하려고합니다 (특히 파이프 '|'
그리고 추가 '>>'
). 이를 해결하려면 Java가 쉘 인스턴스를 실행하고 전체 명령을 쉘에 전달하도록하십시오. 이것이 어떻게 작동하는지는 플랫폼에 따라 다릅니다.
예를 들어 Linux에서 :
String fullCommand = {"/bin/sh", "-c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};
또는 Windows에서 :
String fullCommand = {"cmd.exe", "/c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};
다른 팁
리디렉션과 파이프는 작동하지 않습니다. 명령의 일부는 아니지만 예를 들어 CMD.exe 창 에서이 라인을 실행할 때 평가 될 기본 쉘에 의존합니다.
exec () 메소드에서 얻은 프로세스 개체의 입력 및 출력 스트림을 사용해야합니다.
주된 관심사가 특정 쿼리 도구를 사용하지 않고 Active Directory를 쿼리하는 것이라면 All-Java 솔루션을 고려해야합니다. 예를 들어 LDAP 디렉토리 (Active Directory도)에 액세스하는 방법에는 여러 가지가 있습니다.
http://developer.novell.com/wiki/index.php/jldap
나는 아직 그것을 스스로 사용하지 않았지만 2008 년부터 릴리스가 있기 때문에 버려지는 것처럼 보이지 않습니다.
"부록"(>>)과 "파이프"(|)는 허용되지 않는 것 같습니다.
각 항목을 배열의 장소에 제공하여 시도 할 수 있습니다.
String [] command = {"adfind" "-b" "dc=stuff,dc=com" "-f" "cn=user" "|" "find" "displayName" ">>" "fullList.tx" }
그리고 무슨 일이 일어나는지보십시오.
다른 사람들이 지적했듯이 쉘이 없기 때문에 쉘 지침을 통해 STDOUT/ERR 리디렉션을 수행 할 수 없습니다.
차단을 방지하려면 별도의 스레드로 stdout/stderr를 소비해야합니다. 보다 이 답변 자세한 내용은.
결국 (예, 이것은 약간 빠르고 더러운 방법이었습니다) 나는 명령을 실행하고 파이프와 리디렉션을 사용하는 .bat 파일을 호출하게되었습니다. 나는 그것이 최선의 솔루션이 아니라고 확신하지만 그것은 내가 필요한 것에 효과가 있습니다.