De Runtime.exec(String) para argumentos de ProcessBuilder
Inicie processos com uma lista de argumentos explícita e a configuração do ProcessBuilder.
Process process = Runtime.getRuntime()
.exec("git show " + revision);
Process process = new ProcessBuilder(
"git", "show", revision)
.redirectErrorStream(true)
.start();
Argumentos exatos
Cada argumento do processo permanece um valor distinto, sem tokenização da string de comando.
Configuração explícita
Ambiente, diretório, redirecionamentos e tratamento de erros são configurados em conjunto.
Fronteiras mais seguras
Evita construir uma string de comando semelhante a um shell a partir de valores dinâmicos.
Amplamente disponível desde o JDK 5 (setembro de 2004)
Runtime.exec(String) aplica a tokenização de strings de comando do Java, que é fácil de interpretar errado quando os argumentos contêm espaços ou aspas. O ProcessBuilder aceita os argumentos do programa como valores distintos e expõe explicitamente o diretório de trabalho, o ambiente, os redirecionamentos de entrada/saída e a política do fluxo de erro. Ele não invoca um shell a menos que a aplicação o inicie deliberadamente.