programa otro otras ejemplo ejecutar desde dentro como aplicaciones java processbuilder

otro - Ejecutando otra aplicación desde Java



como ejecutar un programa dentro de otro programa en java (10)

Necesito ejecutar un archivo por lotes que ejecuta otra aplicación Java. No me importa si se ejecuta correctamente o no y no tengo que capturar ningún error.

¿Es posible hacer esto con ProcessBuilder ? ¿Cuáles son las consecuencias si no capto errores?

Sin embargo, mi requisito es simplemente ejecutar otra aplicación Java.


El siguiente código de fragmento está escrito para compilar y ejecutar un programa JAVA externo usando ProcessBuilder, de la misma manera que podemos ejecutar cualquier programa externo. Asegúrese de que JAVA_HOME debe estar configurado en el entorno del sistema operativo. ver more

package com.itexpert.exam; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class JavaProcessBuilder { /** * Provide absolute JAVA file path */ private static final String JAVA_FILE_LOCATION = "D://Test.java"; public static void main(String args[]) throws IOException{ String command[] = {"javac",JAVA_FILE_LOCATION}; ProcessBuilder processBuilder = new ProcessBuilder(command); Process process = processBuilder.start(); /** * Check if any errors or compilation errors encounter then print on Console. */ if( process.getErrorStream().read() != -1 ){ print("Compilation Errors",process.getErrorStream()); } /** * Check if javac process execute successfully or Not * 0 - successful */ if( process.exitValue() == 0 ){ process = new ProcessBuilder(new String[]{"java","-cp","d://","Test"}).start(); /** Check if RuntimeException or Errors encounter during execution then print errors on console * Otherwise print Output */ if( process.getErrorStream().read() != -1 ){ print("Errors ",process.getErrorStream()); } else{ print("Output ",process.getInputStream()); } } } private static void print(String status,InputStream input) throws IOException{ BufferedReader in = new BufferedReader(new InputStreamReader(input)); System.out.println("************* "+status+"***********************"); String line = null; while((line = in.readLine()) != null ){ System.out.println(line); } in.close(); }

}


Este es un ejemplo de cómo usar ProcessBuilder para ejecutar su aplicación remota. Como no le importa la entrada / salida y / o los errores, puede hacer lo siguiente:

List<String> args = new ArrayList<String>(); args.add ("script.bat"); // command name args.add ("-option"); // optional args added as separate list items ProcessBuilder pb = new ProcessBuilder (args); Process p = pb.start(); p.waitFor();

El método waitFor() esperará hasta que el proceso haya terminado antes de continuar. Este método devuelve el código de error del proceso pero, como no te importa, no lo puse en el ejemplo.


Pude ver que hay una mejor biblioteca que la biblioteca exec de apache commons. Puede ejecutar su trabajo utilizando Java Secure Shell (JSch).

Yo tuve el mismo problema. Utilicé JSch para resolver este problema. Apache commons tenía algunos problemas al ejecutar comandos en un servidor diferente. Además JSch me dio resultado y errores de InputStreams. Me pareció más elegante. Puede encontrar una solución de muestra aquí: http://wiki.jsch.org/index.php?Manual%2FExamples%2FJschExecExample

import java.io.InputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.commons.exec.*; import com.jcraft.*; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import com.jcraft.jsch.ChannelExec; import java.util.Arrays; import java.util.List; import java.util.ArrayList; import java.util.HashMap; public class exec_linux_cmd { public HashMap<String,List<String>> exec_cmd ( String USERNAME, String PASSWORD, String host, int port, String cmd) { List<String> result = new ArrayList<String>(); List<String> errors = new ArrayList<String>(); HashMap<String,List<String>> result_map = new HashMap<String,List<String>>(); //String line = "echo `eval hostname`"; try{ JSch jsch = new JSch(); /* * Open a new session, with your username, host and port * Set the password and call connect. * session.connect() opens a new connection to remote SSH server. * Once the connection is established, you can initiate a new channel. * this channel is needed to connect and remotely execute the program */ Session session = jsch.getSession(USERNAME, host, port); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword(PASSWORD); session.connect(); //create the excution channel over the session ChannelExec channelExec = (ChannelExec)session.openChannel("exec"); // Gets an InputStream for this channel. All data arriving in as messages from the remote side can be read from this stream. InputStream in = channelExec.getInputStream(); InputStream err = channelExec.getErrStream(); // Set the command that you want to execute // In our case its the remote shell script channelExec.setCommand(cmd); //Execute the command channelExec.connect(); // read the results stream BufferedReader reader = new BufferedReader(new InputStreamReader(in)); // read the errors stream. This will be null if no error occured BufferedReader err_reader = new BufferedReader(new InputStreamReader(err)); String line; //Read each line from the buffered reader and add it to result list // You can also simple print the result here while ((line = reader.readLine()) != null) { result.add(line); } while ((line = err_reader.readLine()) != null) { errors.add(line); } //retrieve the exit status of the remote command corresponding to this channel int exitStatus = channelExec.getExitStatus(); System.out.println(exitStatus); //Safely disconnect channel and disconnect session. If not done then it may cause resource leak channelExec.disconnect(); session.disconnect(); System.out.println(exitStatus); result_map.put("result", result); result_map.put("error", errors); if(exitStatus < 0){ System.out.println("Done--> " + exitStatus); System.out.println(Arrays.asList(result_map)); //return errors; } else if(exitStatus > 0){ System.out.println("Done -->" + exitStatus); System.out.println(Arrays.asList(result_map)); //return errors; } else{ System.out.println("Done!"); System.out.println(Arrays.asList(result_map)); //return result; } } catch (Exception e) { System.out.print(e); } return result_map; } //CommandLine commandLine = CommandLine.parse(cmd); //DefaultExecutor executor = new DefaultExecutor(); //executor.setExitValue(1); //int exitValue = executor.execute(commandLine); public static void main(String[] args) { //String line = args[0]; final String USERNAME ="abc"; // username for remote host final String PASSWORD ="abc"; // password of the remote host final String host = "3.98.22.10"; // remote host address final int port=22; // remote host port HashMap<String,List<String>> result = new HashMap<String,List<String>>(); //String cmd = "echo `eval hostname`"; // command to execute on remote host exec_linux_cmd ex = new exec_linux_cmd(); result = ex.exec_cmd(USERNAME, PASSWORD , host, port, cmd); System.out.println("Result ---> " + result.get("result")); System.out.println("Error Msg ---> " +result.get("error")); //System.out.println(Arrays.asList(result)); /* for (int i =0; i < result.get("result").size();i++) { System.out.println(result.get("result").get(i)); } */ } }

EDIT 1: para encontrar su proceso (si es uno de larga ejecución) que se está ejecutando en Unix, use el ps -aux | grep java ps -aux | grep java . El ID de proceso debe aparecer junto con el comando de Unix que está ejecutando.


Puede ejecutar una instrucción por lotes, o cualquier otra aplicación utilizando

Runtime.getRuntime().exec(cmd);

  • cmd es el comando o la ruta de la aplicación.

También puede esperar a que se ejecute y obtenga el código de retorno (para verificar si se ejecuta correctamente) con este código:

Process p = Runtime.getRuntime().exec(cmd); p.waitFor(); int exitVal = p.exitValue();

Tiene una explicación completa de los diferentes tipos de llamadas aquí http://www.rgagnon.com/javadetails/java-0014.html


Sé que este es un subproceso más antiguo, pero me parece que podría valer la pena ponerlo en mi implementación, ya que encontré que este subproceso intentaba hacer lo mismo que OP, excepto con acceso de nivel raíz, pero realmente no encontraba una solución. Estaba buscando. El siguiente método crea un shell de nivel raíz estático que se utiliza para ejecutar comandos sin tener en cuenta la comprobación de errores o incluso si el comando se ejecutó correctamente.

Lo uso una aplicación de linterna para Android que he creado que permite configurar el LED a diferentes niveles de brillo. Al eliminar todas las comprobaciones de errores y otras cosas, puedo hacer que el LED cambie a un nivel de brillo específico en tan solo 3 ms, lo que abre la puerta a los tonos de luz (tonos de llamada con luz). Más detalles sobre la aplicación en sí se pueden encontrar aquí: http://forum.xda-developers.com/showthread.php?t=2659842

A continuación se muestra la clase en su totalidad.

public class Shell { private static Shell rootShell = null; private final Process proc; private final OutputStreamWriter writer; private Shell(String cmd) throws IOException { this.proc = new ProcessBuilder(cmd).redirectErrorStream(true).start(); this.writer = new OutputStreamWriter(this.proc.getOutputStream(), "UTF-8"); } public void cmd(String command) { try { writer.write(command+''/n''); writer.flush(); } catch (IOException e) { } } public void close() { try { if (writer != null) { writer.close(); if(proc != null) { proc.destroy(); } } } catch (IOException ignore) {} } public static void exec(String command) { Shell.get().cmd(command); } public static Shell get() { if (Shell.rootShell == null) { while (Shell.rootShell == null) { try { Shell.rootShell = new Shell("su"); //Open with Root Privileges } catch (IOException e) { } } } return Shell.rootShell; } }

Luego, en cualquier lugar de mi aplicación para ejecutar un comando, por ejemplo, cambiando el brillo del LED, solo llamo:

Shell.exec("echo " + bt.getLevel() + " > "+ flashfile);


Sí, es posible utilizar ProcessBuilder.

Ejemplo de ProcessBuilder:

import java.io.*; import java.util.*; public class CmdProcessBuilder { public static void main(String args[]) throws InterruptedException,IOException { List<String> command = new ArrayList<String>(); command.add(args[0]); ProcessBuilder builder = new ProcessBuilder(command); Map<String, String> environ = builder.environment(); final Process process = builder.start(); InputStream is = process.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; while ((line = br.readLine()) != null) { System.out.println(line); } System.out.println("Program terminated!"); } }

Compruebe estos ejemplos:

http://www.rgagnon.com/javadetails/java-0014.html

http://www.java-tips.org/java-se-tips/java.util/from-runtime.exec-to-processbuilder.html


Si no te importa el valor de retorno, puedes usar Runtime.getRuntime().exec("path.to.your.batch.file");



Supongo que sabe cómo ejecutar el comando utilizando ProcessBuilder .

La ejecución de un comando desde Java siempre debe leer las secuencias stdout y stderr del proceso. De lo contrario, puede suceder que el búfer esté lleno y el proceso no pueda continuar porque se escriben sus bloques stdout o stderr.


El enfoque Runtime.getRuntime().exec() es bastante problemático, como lo descubrirás en breve.

Echa un vistazo al proyecto Apache Commons Exec . Te abstrae de muchos de los problemas comunes asociados con el uso de Runtime.getRuntime().exec() y la API de ProcessBuilder .

Es tan simple como:

String line = "myCommand.exe"; CommandLine commandLine = CommandLine.parse(line); DefaultExecutor executor = new DefaultExecutor(); executor.setExitValue(1); int exitValue = executor.execute(commandLine);