2016-10-06 6 views
1

pg_dump 출력을 psql에 파이프하여 데이터베이스 데이터베이스로 데이터베이스 덤프를 가져 오려고합니다. 우리가 명령 줄에서 명령을 실행할 때 잘 작동하지만, 자바ProcessBuilder 내에서 pg_dump가 너무 많습니다.

이는 것 같습니다 어떻게의 ProcessBuilder 내부 실패 : 이것은 우리가 점점 오류가

ProcessBuilder processBuilder = new ProcessBuilder("pg_dump", "-h" + hostRemote, 
"-p" + portRemote, "-U" + usernameRemote, "-a", dbNameRemote, "|", 
"psql", "-h" + hostLocal, "-p" + portLocal, "-U" + usernameLocal, dbNameLocal); 

그리고 : pg_dump의를 : 너무 많은 명령 행 인수 (첫 번째 인수는 |).

우리가 보지 못하고있는 특별한 잡을만한 것이 있습니까? 어떤 도움을 주시면 감사하겠습니다.

편집 : 정리 별도의 토큰 :

ProcessBuilder processBuilder = new ProcessBuilder("pg_dump", "-h", hostRemote, 
"-p", Integer.toString(portRemote), "-U", usernameRemote, "-a", dbNameRemote, "|", 
"psql", "-h", hostLocal, "-p", Integer.toString(portLocal), 
"-U", usernameLocal, dbNameLocal); 
+0

배열 또는 목록을 작성하고 각 토큰을 목록 또는 배열의 고유 항목으로 만들어야합니다. –

+0

예를 들어, 문자열을 공백 문자와 연결하여이를 토큰으로 입력하면됩니다. 대신 String 토큰에 공백이없는 별도의 토큰으로 분리하십시오. '-h "+ hostRemote가 아니라''-h '', hostRemote,' –

+0

또한 스트림을 적절하게 캡처합니까? –

답변

1

뱀장어의 @Hovercraft 전체에서 코멘트 올바른 방향으로 나를 밀었다. ProcessBuilder은 상자에서 파이프를 지원하지 않습니다. ProcessBuilder으로 쉘을 생성 한 다음, 쉘에 명령을 제공하거나 두 개의 별도 프로세스를 생성 한 다음 pg_dump의 출력을 psql의 입력으로 리디렉션해야합니다. 우리는 후자를 선택했다.