alterando o diretório de trabalho do comando de java

Eu preciso executar um arquivo. Exe de uma function em um dos pacotes que tenho no meu projeto java. agora o diretório de trabalho é o diretório raiz do projeto para java, mas o arquivo .exe está nos subdiretórios do meu projeto. aqui está como o projeto é organizado:

ROOT_DIR |.......->com | |......->somepackage | |.........->callerClass.java | |.......->resource |........->external.exe 

Inicialmente eu tentei executar o arquivo .exe diretamente através de:

 String command = "resources\\external.exe -i input -o putpot"; Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(command); 

mas o problema é externo. exe precisa acessar alguns arquivos em seu próprio diretório e continua pensando diretório raiz é o seu diretório. Eu até tentei usar o arquivo .bat para resolver o problema, mas o mesmo problema aumenta:

 Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "resources\\helper.bat"}); 

e o arquivo .bat está no mesmo diretório que o arquivo .exe, mas o mesmo problema acontece. aqui está o conteúdo do arquivo .bat:

 @echo off echo starting process... external.exe -i input -o output pause 

mesmo que eu mova o arquivo .bat para root e corrija seu conteúdo, o problema não desaparece. plz plz plz help

Para implementar isso você pode usar a class ProcessBuilder, aqui está como seria:

 File pathToExecutable = new File( "resources/external.exe" ); ProcessBuilder builder = new ProcessBuilder( pathToExecutable.getAbsolutePath(), "-i", "input", "-o", "output"); builder.directory( new File( "resources" ).getAbsoluteFile() ); // this is where you set the root folder for the executable to run with builder.redirectErrorStream(true); Process process = builder.start(); Scanner s = new Scanner(process.getInputStream()); StringBuilder text = new StringBuilder(); while (s.hasNextLine()) { text.append(s.nextLine()); text.append("\n"); } s.close(); int result = process.waitFor(); System.out.printf( "Process exited with result %d and output %s%n", result, text ); 

É um monte de código, mas dá ainda mais controle sobre como o processo será executado.

Use esta forma do método exec para especificar um diretório de trabalho

 public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException 

O diretório de trabalho é o terceiro argumento. Você pode passar null para envp se não precisar definir nenhum ambiente especial.

Existe também este método de conveniência :

 public Process exec(String command, String[] envp, File dir) throws IOException 

… onde você especifica o comando em uma string (ela só é transformada em uma matriz para você; consulte os documentos para obter detalhes).

Eu peguei o mesmo problema no meu projeto, eu tentei estas soluções sobre ProcessBuilder.directory(myDir) e o método exec do Runtime e todas as minhas bandejas falharam.
Isso me faz entender que o Runtime tem privilégios limitados apenas para o diretório de trabalho e os subdiretórios dele.

Então minha solução é feia, mas funciona muito bem.
Eu crio um arquivo .bat temporário em “runtime” no diretório de trabalho.
Este arquivo incluiu duas linhas de comandos:
1. Mover para o diretório necessário (comando cd).
2. Faça o comando em necessidade.
Eu chamo o exec de Runtime com o meu arquivo temporariamente .bat como comando.
É um trabalho para mim muito bem!

    Intereting Posts