Foros del Web » Programación para mayores de 30 ;) » Java »

arrancar una jar desde otro

Estas en el tema de arrancar una jar desde otro en el foro de Java en Foros del Web. Que tal! Alguno de ustedes sabe cual es la instrucción correcta para ejecutar un jar desde mi aplicación, he probado de la siguiente manera: Código: ...
  #1 (permalink)  
Antiguo 23/02/2009, 12:19
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
De acuerdo arrancar una jar desde otro

Que tal!

Alguno de ustedes sabe cual es la instrucción correcta para ejecutar un jar desde mi aplicación, he probado de la siguiente manera:

Código:
Runtime r = Runtime.getRuntime();
Process p = null;
      
p = r.exec("java -jar mi_jar.jar");
pero no resulta la ejecución, ojalá me puedan ayudar.

Gracias.
  #2 (permalink)  
Antiguo 23/02/2009, 13:30
Avatar de TresPuntoDos  
Fecha de Ingreso: septiembre-2008
Ubicación: Madrid, España
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 3
Respuesta: arrancar una jar desde otro

Tienes definido la variable JAVA_HOME? Quizas pueda ser por eso

No te sale ninguna excepcion o ningun error?
__________________
Tres punto Dos - Mi Blog sobre J2EE, Java, Struts y Diseño Web
Proyecto BloJ - Crea tu blog Java
  #3 (permalink)  
Antiguo 24/02/2009, 16:51
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: arrancar una jar desde otro

encontre este código me parece que es muy util, se los dejo para que la revisen,

Código:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.*;

/**
 * This utility makes a JAR runnable by inserting a <code>Main-Class</code>
 * attribute into the Manifest.
 *
 * @author Shawn Silverman
 */
public class MakeJarRunnable {
    public static void main(String[] args) throws IOException {
        if (args.length != 2) {
            System.out.println("Usage: MakeJarRunnable "
                               + "<jar file> <Main-Class>");
            System.exit(0);
        }

        // Create the JarInputStream object, and get its Manifest

        JarInputStream jarIn = new JarInputStream(new FileInputStream(args[0]));
        Manifest manifest = jarIn.getManifest();
        if (manifest == null) {
            // This will happen if there is no Manifest

            manifest = new Manifest();
        }

        Attributes a = manifest.getMainAttributes();
        String oldMainClass = a.putValue("Main-Class", args[1]);

        // If there was an old value there, tell the user about it and exit

        if (oldMainClass != null) {
            System.out.println("Warning: old Main-Class value is: "
                               + oldMainClass);
            System.exit(1);
        }

        System.out.println("Writing to " + args[2] + "...");
        JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(args[2]),
                                                     manifest);

        // Create a read buffer to be used for transferring data from the input

        byte[] buf = new byte[4096];

        // Iterate the entries

        JarEntry entry;
        while ((entry = jarIn.getNextJarEntry()) != null) {
            // Exclude the Manifest file from the old JAR

            if ("META-INF/MANIFEST.MF".equals(entry.getName())) continue;

            // Write out the entry to the output JAR

            jarOut.putNextEntry(entry);
            int read;
            while ((read = jarIn.read(buf)) != -1) {
                jarOut.write(buf, 0, read);
            }

            jarOut.closeEntry();
        }

        // Flush and close all the streams

        jarOut.flush();
        jarOut.close();

        jarIn.close();
    }
}
Saludos
  #4 (permalink)  
Antiguo 25/02/2009, 01:44
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: arrancar una jar desde otro

Con Runtime.exec se ejecutan procesos a nivel de S.O. y "java" no es un comando de sistema operativo, es simplemente un ejecutable.

Por eso lo que tienes que hacer es ejecutar una consola de S.O. que ejecute el programa que quieres, algo asi como "cmd /c java.exe -jar....". Y además el ejecutable, java.exe en este caso, tiene que estar en el PATH o no lo encontrará.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 25/02/2009, 13:08
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: arrancar una jar desde otro

Si se puede hacer java -jar mi_jar.jar directamente desde Runtime.getRuntime.exec(), porque yo lo hago actualmente.

mira mi codigo de ejemplo

cmd="java -jar "+installPath+separator+"lib"+separator+"HENPLUS.j ar";
cmd+=" jdbc:oracle:thin:@"+keys.getIp()+":1521:prueba";
cmd+=" system manager ";
String cr_cc1="\"load "+installPath+separator+"create"+separator+"cr_cc1 .sql\"";
String catics01="\"load "+installPath+separator+"create"+separator+"catics 01.sql\"";/*
String catics02="\"load "+installPath+separator+"create"+separator+"catics 02.sql\"";
String catics03="\"load "+installPath+separator+"create"+separator+"catics 03.sql\"";
String catics04="\"load "+installPath+separator+"create"+separator+"catics 04.sql\"";*/

Runtime.getRuntime().exec(cmd+cr_cc1+" "+catics01);

Aqui llamo un jar que se llama HENPLUS y es mas, le mando parametros al jar, como jdbc:oracle...., como system, como manager, como el valor de la variable cr_cc1.java.

Debes mirar que en el fichero manifest.mf del jar que estas llamando que tengas definido el Atributo Main-class:

su valor debe ser algo como esto paquete.subpaquete.ClaseQueContieneElMetodoMain.

al igual si este jar hace uso de librerias externas estas deben estar especificadas en el atributo Classpath: del mismo fichero.
  #6 (permalink)  
Antiguo 25/02/2009, 13:26
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: arrancar una jar desde otro

Ni caso, he leido mal.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #7 (permalink)  
Antiguo 26/02/2009, 09:09
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: arrancar una jar desde otro

Muchas gracias a ambos, lo intentaré.
  #8 (permalink)  
Antiguo 26/02/2009, 12:16
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: arrancar una jar desde otro

webness!

podrías ayudarme un poco, fijate que he mirado en la red y con tu ejemplo, según yo estoy haciendo las cosas bien, supongo que el problema esta en el MANIFEST de mi jar porque de esta manera debería funcionar,

Código:
public static void main(String[] args) 
   {  
      String cmd = "C:/j2sdk1.4.2_16/bin/java -jar C:/java/mi_jar.jar";
      
      try 
      {   
         Process p = Runtime.getRuntime().exec("cmd");   
         BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));   
         String line = null;   
         while ((line = in.readLine()) != null) 
         {   
            System.out.println(line);   
         }   
      } 
      catch (IOException e) 
      {   
         e.printStackTrace();   
      }   
   }
y en mi manifest tengo esto

Código HTML:
Manifest-Version: 1.0
Created-By: 1.4.2_16 (Sun Microsystems Inc.)
Main-Class: mi_jar
que estoy haciendo mal?
  #9 (permalink)  
Antiguo 26/02/2009, 13:18
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: arrancar una jar desde otro

Esto:
Cita:
Process p = Runtime.getRuntime().exec("cmd");
¿no debería ser así?
Cita:
Process p = Runtime.getRuntime().exec(cmd);
S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #10 (permalink)  
Antiguo 26/02/2009, 15:48
 
Fecha de Ingreso: marzo-2008
Mensajes: 63
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: arrancar una jar desde otro

Listo ya quedo, muchas gracias.
  #11 (permalink)  
Antiguo 13/01/2012, 20:51
 
Fecha de Ingreso: enero-2012
Ubicación: Santiago
Mensajes: 1
Antigüedad: 12 años, 3 meses
Puntos: 0
Pregunta Respuesta: Duda con getRuntime

Hola,

he buscado por miles de lugares y no he podido encontrar una respuesta satisfactoria, ojalas la pueda encontrar aquí:

(la idea es que con el systeminfo saque informacion del pc y lo lanze a un archivo txt, luego un type abra el archivo y lo filtre con un pipe enviandolo a otro archivo, pero tengo un error de reconocimiento con el pipe)

quiero ejecutar el siguiente código en Java pero no me arroja resultados.

package formulario;
public class MSDOS {
public static void datos()
{
try
{
Runtime p = Runtime.getRuntime();
p.exec("cmd /c systeminfo >> D://info.txt");
p.exec("cmd /c type D://info.txt|find \"Fabricante del sistema:\" >> D://DatosCapturados.txt");
}
catch (Exception e)
{
}
}
}

Compilado en Netbeans
  #12 (permalink)  
Antiguo 13/01/2012, 22:23
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Duda con getRuntime

Hola,

Cita:
Iniciado por soponce Ver Mensaje
p.exec("cmd /c systeminfo >> D://info.txt");
p.exec("cmd /c type D://info.txt|find \"Fabricante del sistema:\" >> D://DatosCapturados.txt");
El separador en Windows es \\ estás escribiendo el código de escape el caracter \, pero en Linux es / porque no es un caracter especial. No creo que exec te deje hacer un 'pipe' porque el mismo exec de java abre el stdout del programa cmd. ¿Existe algún motivo por el cual no puedas usar en batch file?

Simplemente sería algo así:

Código BAT:
Ver original
  1. @echo off
  2. %SystemRoot%\System32\systeminfo.exe | findstr /I "fabricante"

Y en Java lo podría recuperar así:

Código Java:
Ver original
  1. Runtime p = Runtime.getRuntime();
  2. Process r = p.exec("cmd /c E:\\sysinfo.cmd");
  3. Integer i = r.waitFor();
  4.  
  5. if (i == 0) {
  6.         new InputStreamReader(r.getInputStream()));
  7.     String l = br.readLine();
  8.     System.out.println(l.split(":")[1].trim());
  9. } else {
  10.     System.err.println("ERRORLEVEL : " + String.valueOf(i));
  11. }

Saludos,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:55.