Dificuldade executar cmd java -jar no Linux via Applicação

4 respostas
B

Olá Galera,

Estou encontrando grandes dificuldades para executar uma jar no Linux :cry: . Tenho uma classe com um método responsável por executar comandos no console:

public void ExecutaComando(String Comando) {
		String Retorno;
		this.RetornodoComando = new StringBuffer();
		this.ErrosdoComando = new StringBuffer();

		try {
			Process Processo = Runtime.getRuntime().exec(Comando);

			InputStream StreamEntrada = Processo.getInputStream();
			InputStream StreamErro = Processo.getErrorStream();
			BufferedReader SaidadoProcesso;

			SaidadoProcesso = new BufferedReader(new InputStreamReader(
					StreamEntrada));
			while ((Retorno = SaidadoProcesso.readLine()) != null) {
				this.RetornodoComando.append(Retorno + "\r\n");
			}

			SaidadoProcesso = new BufferedReader(new InputStreamReader(
					StreamErro));
			while ((Retorno = SaidadoProcesso.readLine()) != null) {
				this.ErrosdoComando.append(Retorno + "\r\n");
			}

			Processo.waitFor();

			SaidadoProcesso.close();
			StreamErro.close();
			StreamEntrada.close();
			Processo.getOutputStream().close();

		} catch (IOException MensagemdeErro) {
			this.ErrosdoComando.append(MensagemdeErro.toString());
		} catch (InterruptedException MensagemdeErro) {
			this.ErrosdoComando.append(MensagemdeErro.toString());
		}
	}

Passo os argumentos assim, para um método que executa então os comandos chamando a classe acima:

String[] args = new String[3];
args[0] = "java";
args[1] = "-jar";
args[2] = caminhoDoJar;

executaArrayArgumentos(args);

Método que executa os comandos:

private void executaArrayArgumentos(String[] Argumentos) 
	{  
		String Comando="";  
	    for ( int i=0; i<Argumentos.length; i++ ) 
	    {  
	       Comando = Comando + Argumentos[i];  
	       if ( i < (Argumentos.length-1)) 
	    	   Comando = Comando + " ";  
	    }  
	       
	    System.out.println("Comando: '" + Comando + "'\n");  
	     
	    ComandosConsole ExecutordeComandos = new ComandosConsole();  
	       
	    ExecutordeComandos.ExecutaComando(Comando);  
	       
	    System.out.println("Retorno: '" + ExecutordeComandos.PegaRetorno() + "'\n"); //stdout  
	   
	    System.out.println("Erros: '" + ExecutordeComandos.PegaErros() + "'\n"); //stderr  
	}

Acontece que pego o retorno (EXATAMENTE IGUAL) e executo via console e dá certo. Mas pela aplicação não funfa!

Alguém já conseguiu executar um jar através da applicação no linux :?: Pelamordedeus me ajudem!!!

4 Respostas

T

Duas coisas que podem estar atrapalhando:

  • Você tem de pegar a saída padrão e a saída de erros também.
  • O java pode não estar no seu PATH e você tem de mencionar explicitamente onde ele está (como em “/usr/local/bin/java” ou sei lá onde o Java fica no seu Linux.)

Outra coisa que me atrapalha (é bitola minha mas velhos hábitos não morrem) é usar iniciais maiúsculas para os nomes das variáveis. Reserve as iniciais maiúsculas para os nomes de classes.

B

Olá thingol,

Obrigado pela luz. Através de System.getProperty(“java.home”) eu pego o dir. de instalação do java.
Mas só para ver se entendi bem sua sugestão, seria + ou - assim? Desculpa, mas não estou com linux aqui para testar.

String[] args1 = new String[2];
			args1[0] = "cd";
			args1[1] = javaHome; // Valor recebido pelo método getProperty("java.home") da class System						
			executaArrayArgumentos(args1);
			
			String[] args2 = new String[3];
			args2[0] = "java";
			args2[1] = "-jar";
			args2[2] = caminhoDoJar;			
			executaArrayArgumentos(args2);
T

a) Você não pode mudar o diretório corrente executando o comando “cd”. Isso é um fato da vida. O que você pode fazer para alterar o diretório corrente é especificá-lo na chamada a “exec” (veja no Javadoc qual dos diversos “overloads” de “exec” deve ser usado).
b) Se puder usar ProcessBuilder em vez de Runtime.exec, você pode usar “redirectErrorStream” para evitar esses problemas de o programa ficar travado porque você não está lendo a saída de erros padrão.

B

Realmente, thingol. Fiz o teste e a saída foi:

Criado 8 de janeiro de 2008
Ultima resposta 8 de jan. de 2008
Respostas 4
Participantes 2