ProcessBuilder.start() não executa nem apresenta exception

11 respostas
R

Olá pessoal.

Desenvolvi um programa JAVA para facilitar a execução de um EXE que necessita de muitos parâmetros (não são os parâmetros o problema).
Para isso usei primeiro Runtime.getRuntime(command)…etc… que funcionou até certo ponto. Pois o programa EXE abria mas travava a execução na primeira tela, até que fosse fechado o meu JAVA… Aí o EXE continuava rodando normalmente.

Usei o ProcessBuilder que então funcionou 100%. Abro o JAR, clico em EXECUTAR ele encontra o EXE, e executa perfeitamente. Porém ele não está funcionando em meu cliente que usar Windows Vista e em outro que usa Windows Seven. Eu tenho o XP aqui.
O programa encontra o EXE em todos os casos, o problema é que a função simplesmente não funciona, não apresenta erro, exceção nem nada. Simplesmente não faz nada…

String command[] = new String[6];
        command[0]= "cmd";
        command[1]= "/C";
        command[2]= "start";
        command[3]= "\"QuickStart\"";
        command[4]= "/b";
        command[5]= " \"c:\\programa.exe\" ";

        ProcessBuilder builder = new ProcessBuilder();
        builder.command(command);
        Process myProcess = builder.start();
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(myProcess.getInputStream()));
        char[] buffer = new char[1024];
        int numRead;
        long numWritten = 0;
        while ((numRead = stdInput.read(buffer)) != -1) {
           //System.out.println(new String(buffer, 0, numRead));
           numWritten += numRead;
        }

Tanto faz se uso o start, cmd ou qualquer forma de comando válida. No meu computador funciona, mas no do cliente que usa Vista e do outro que usa Seven, não faz nada.
Alguém tem uma explicação? Como tratar essa incompatibilidade?
Ressalto que nenhum erro é apresentando e o EXE está no caminho certo.

Desde já agradeço.

11 Respostas

C

não sei adianta, mas ao invés de usar os “\” tenta o File.separator; mesmo se não funcionar deixa por padrão rs…

tenho um processo aqui, onde uso o Runtime.getRuntime().exec(command), funciona bem.

E

Você consegue instalar sua aplicação em uma máquina com Windows Vista ou 7?

(Dica: pode ser que o tal executável nem esteja iniciando nessas máquinas, ou esteja funcionando incorretamente e não gere nenhuma saída.

Por que é que ele não inicia é uma boa pergunta.

Vai que o tal programa executável só funciona no Windows XP, por exemplo, e para rodar no Vista ou 7, necessite de alguma correção ou atualização.

)

Só de olhar o SEU programa não estou vendo absolutamente nada de errado. Mas como não temos acesso ao seu .EXE (que provavelmente deve depender de outras coisas também) não temos como saber.

R

Obrigado pela dica.
De qualquer forma já tentei alterar com “/” ou “\”… De ambas maneiras funciona aqui comigo, mas com o cliente não :frowning:
O Runtime comigo funciona para iniciar o processo. Funciona bem com testes com notepad e calc… POrém esse programa, que é pesado, para na tela inicial e só funciona se fechar o JAR. Parece que ele fica esperando algo acontecer no JAR que eu não sei o que é. Então se fecho o EXE continua de onde tinha parado.

Mesmo assim, sendo com o ProcessBuilder ou Runtime aqui o EXE abre. Lá simplesmente não abre nem dá erro. Creio ser incompatibilidade…

E

Ricna:
Obrigado pela dica.
De qualquer forma já tentei alterar com “/” ou “\”… De ambas maneiras funciona aqui comigo, mas com o cliente não :(

Mas sua máquina é XP, e Vista e Windows 7 se comportam de maneiras diferentes para rodar programas devido ao tal do “UAC” (User Account Control), que é aquele recurso que alguns programas usam para poder assumir os poderes de administrador e assim poder ler e escrever de diretórios que normalmente são proibidos para o usuário.

Teste em uma máquina com Vista ou Windows 7. De preferência, se alguém desligou o UAC, ligue de novo,porque há muitos clientes que não mexem no Windows e deixam o UAC ligado, tal como veio da fábrica (eu mesmo faço isso - deixo o UAC sempre ligado. Só desenvolvedor preguiçoso é que desliga o UAC).
Provavelmente o tal programa não está rodando direito :frowning:

R

Você consegue instalar sua aplicação em uma máquina com Windows Vista ou 7?
Vai que o tal programa executável só funciona no Windows XP, por exemplo, e para rodar no Vista ou 7, necessite de alguma correção ou atualização.
)

Só de olhar o SEU programa não estou vendo absolutamente nada de errado. Mas como não temos acesso ao seu .EXE (que provavelmente deve depender de outras coisas também) não temos como saber.

Infelizmente, não tenho condições de testar em minha máquina com 7 ou Vista.
O EXE é um programa que é usado por essas pessoas e roda muito bem.
Se quiser te passo inclusive meu JAR que vai fazer o Download do EXE (caso não esteja instaldo) também (um programa para acessar mundo virtual). Inclusive tem opção para usar 4 programas diferente para o mesmo propósito…

Vou fazer um teste que ainda não fiz, manda o mesmo programa para eles testarem mas desta vez tentando executar o notepad…
Obrigado pela ajuda.

R

Deve ser esse troço mesmo. Vou ter que eu mesmo achar um Vista pra testar…aff. Bueno, muito obrigado pela dica. Mas caso for isso, como contornar o problema? Preciso executar arquivos do %ProgramFiles% e alterar outros em %AppData%… Aqui no XP tranquilo.

R

Novidade: Se executar o programa como administrador funciona! Mas se não for como administrador simplesmente não executa o EXE.
Como verificar e solicitar autorização de administrador para o JAR?

T

Pra saber o que está acontecendo vc tem que acessar o “errorStream”

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.PrintStream;

public class TestMe {

    public static final void main(String[] args) throws IOException {
        ProcessBuilder builder = new ProcessBuilder();

        //descomente pra executar
        //builder.command("notepad.exe");
        builder.command("esseProgramaNaeExiste.exe");

        Process myProcess = builder.start();

        try {
            String outStr = new java.util.Scanner(myProcess.getInputStream()).useDelimiter("\\A").next();
            System.out.println(outStr);
        } catch (Exception e) {
            //no-op
        }

        try {
            String errStr = new java.util.Scanner(myProcess.getErrorStream()).useDelimiter("\\A").next();
            System.out.println(errStr);
        } catch (Exception e) {
            //no-op
        }
    }

}

Vc deve estar com problema de acesso. Veja http://stackoverflow.com/questions/6231779/how-to-check-write-permissions-of-a-directory-in-java

E

Ricna:
Novidade: Se executar o programa como administrador funciona! Mas se não for como administrador simplesmente não executa o EXE.
Como verificar e solicitar autorização de administrador para o JAR?

  1. Você pode, em vez de executar o programa diretamente, tentar criar um link para esse programa, que tem aquela opção de compatibilidade “Rodar como administrador”, e tentar rodar via esse link. (Não sei se isso funciona para o ProcessBuilder)

  2. Se você pode mexer nas permissões dos diretórios que esse programa usa, tente ver se mexendo nas permissões é possível rodar sem ser administrador. (Nem sempre dá para fazer isso, porque pode ser que ele use mais algum recurso do sistema que não seja só arquivos e diretórios e precise de permissões especiais)

  3. Pegue o cara que escreveu o programa e dê um puxão de orelha nele, e faça-o ver que o programa não roda no Windows Vista ou 7 sem ser administrador. (Se esse cara for você mesmo então pegue o espelho e dê uns tapinhas no espelho, mas não com muita força senão você vai quebrar o vidro).

No caso de ser você o “rapaish” que escreveu o programa, e se ele for em C++ ou C, acho que você pode escrever um manifest (não é o mesmo manifest do Java) que é um arquivo XML que indica quais são as permissões que devem ser solicitadas para rodar o programa. Você precisa ver isso como é que se inclui esse manifest no executável final.

E

E é claro, tem a solução preguiçosa de desligar o UAC. Eu não recomendaria isso se na empresa a área de segurança for rigorosa sobre esse ponto.

R

Pessoal, estou voltando aqui (com atraso) para apresentar a ‘solução’… E na verdade o real problema.
Mesmo no XP consegui simular o problema, usando a conta convidado.

Após analisar com mais cuidado percebi que o problema não era na execução do EXE e sim algo que acontecia após tentar escrever um arquivo dentro de %ProgramFiles%… Mesmo assim não apresentando exception!? Só descobri isso após remover todas tentativas de fazer qualquer coisa fora executar. Depois fui colocando as escritas em %AppData% e quando finalmente ativei novamente escrita em %ProgramFiles% o executar também não funcionou.
Não consigo entender pois mesmo que não pudesse escrever, o código “continuava” e o comando era enviado. Deveria executar de qualquer forma. E o mais importante, uma exceção deveria ser gerada!

O fato é que a escrita pôde ser contornada com outras, feitas em AppData, assim tudo ficou funcionando. Mas se quisesse escrever em %ProgramFiles%, que neste caso seria quase indispensável, eu não saberia resolver, já que não é possível mudar as permissões de escrita se não for administrador. E o comando runas também não consegui usar corretamente, pois teria que capturar a senha, etc…

Então é isso.
Obrigado pela ajuda de todos!

Criado 28 de agosto de 2012
Ultima resposta 4 de set. de 2012
Respostas 11
Participantes 4