2016-10-06 3 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 : слишком много аргументов командной строки (первый - это |).

Есть ли какой-то особый улов, который мы не видим? Любая помощь будет оценена по достоинству.

EDIT: Вымытый отдельные лексемы:

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

Вам нужно создать свой массив или List и каждый маркер будет его собственным элементом в списке или массиве. –

+0

, например, вы объединяете строки с пробелами и подаете их в качестве токена - не делайте этого - вместо этого разделите их как отдельные токены без пробелов в ваших токенах String. Поэтому не '' -h "+ hostRemote, а скорее:' "-h", hostRemote, ' –

+0

Кроме того, вы захватываете потоки соответствующим образом? –

ответ

1

Комментарий от @Hovercraft Full Of Угри толкнул меня в правильном направлении. ProcessBuilder не поддерживает трубку из коробки. Нам нужно либо вызвать оболочку с помощью ProcessBuilder, а затем передать команду в оболочку или создать два отдельных процесса, а затем перенаправить вывод pg_dump на вход psql! Мы выбрали последний.