sirve - metodo exists java
cambiando el directorio de trabajo del comando de java (3)
Necesito ejecutar un archivo .exe desde una función en uno de los paquetes que tengo en mi proyecto de Java. ahora el directorio de trabajo es el directorio raíz del proyecto para java pero el archivo .exe en los subdirectorios de mi proyecto. así es como se organiza el proyecto:
ROOT_DIR
|.......->com
| |......->somepackage
| |.........->callerClass.java
|
|.......->resource
|........->external.exe
Inicialmente traté de ejecutar el archivo .exe directamente a través de:
String command = "resources//external.exe -i input -o putpot";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
pero el problema es externo .exe necesita acceder a algunos archivos en su propio directorio y sigue pensando que el directorio raíz es su directorio. Incluso traté de usar el archivo .bat para resolver el problema, pero el mismo problema se plantea:
Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "resources//helper.bat"});
y el archivo .bat está en el mismo directorio que el archivo .exe pero ocurre el mismo problema. aquí está el contenido del archivo .bat:
@echo off
echo starting process...
external.exe -i input -o output
pause
incluso si muevo el archivo .bat a la raíz y arreglo su contenido, el problema no desaparece. plz plz por favor ayuda
Para implementar esto, puede usar la clase ProcessBuilder, así es como sería:
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 );
Es un montón de código, pero te da aún más control sobre cómo se ejecutará el proceso.
Use esta forma del método exec
para especificar un directorio de trabajo
public Process exec(String[] cmdarray,
String[] envp,
File dir)
throws IOException
El directorio de trabajo es el tercer argumento. Puede pasar null
por envp
si no necesita establecer ningún entorno especial.
También hay este método de conveniencia :
public Process exec(String command,
String[] envp,
File dir)
throws IOException
... donde especificas el comando en una cadena (simplemente se convierte en una matriz para ti, mira los documentos para más detalles).
Obtuve el mismo problema en mi proyecto, probé estas soluciones sobre ProcessBuilder.directory(myDir)
y el método de Runtime
de Runtime
y todas mis bandejas fallaron.
Me hace entender que Runtime
tiene privilegios limitados solo para el directorio de trabajo y los subdirectorios del mismo.
Entonces mi solución es muy buena pero funciona muy bien.
Creo un archivo .bat temporal en "runtime" en el directorio de trabajo.
Este archivo incluye dos líneas de comandos:
1. Vaya al directorio necesario (comando cd).
2. Haz el comando en necesidad.
Llamo al ejecutivo de Runtime
con mi archivo temporalmente .bat como comando.
¡Me funciona muy bien!