Println en cmd desde .jar

Iniciado por Lind L. Tailor, 29 Abril 2015, 18:21 PM

0 Miembros y 1 Visitante están viendo este tema.

Lind L. Tailor

Hola...

Como están compañeros programadores, espero que tengan un excelente día, el motivo de mi tema es que ando batallando con algo que según a mi consideración no debería tener problema alguno, caso contrario, por favor de corregirme...

Tengo dos archivos .jar en donde uno de ellos manda a llamar al otro, además de contener tanto en uno como el otro un simple System.out.println(), tal y como pueden ver en el siguiente código.

Hola.jar
Código (java) [Seleccionar]
import java.io.IOException;

public class ImprimirHola {
   
   public static void main(String[] args) {
       System.out.println("HOLA");
       try {
           Runtime.getRuntime().exec("java -jar C:\\Mundo.jar");
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}


Mundo.jar
Código (java) [Seleccionar]
public class ImprimirMundo {
   public static void main(String[] args) {    
       System.out.println("MUNDO");
   }
}


Sin embargo, cuando ejecuto el primer archivo el cual manda a llamar el siguiente debería ver en consola o por lo menos eso pienso...

HOLA
MUNDO

Cosa que no me realiza ya que solo veo en consola HOLA, prácticamente el archivo que estoy ejecutando en ese momento desde CMD, mi pregunta es... ¿Cual es la forma correcta de hacerlo?

De antemano, muchas gracias por su tiempo y pronta respuesta.

Sin mas que comentar, que tengan un excelente día.

PabloPbl

#1
Pues por lo que veo, con esos comandos estas creando el jar, el cual solo lo deberías compilar y correr el class que te genera para recibir un resultado en la consola:

Inténtalo desde esta manera:

Ahora mismo no me acuerdo como se hacia esto, pero prueba con el comando "javac class.java" y luego ejecútalo como "java class".

Thryks

#2
No se rian pero yo pense en esto:
import java.io.IOException;

public class ImprimirHola {

  public static void main(String[] args) {
      System.out.println("HOLA");
      try {
          Runtime.getRuntime().exec("CMD /C javac ImprimirMundo.java");
          Runtime.getRuntime().exec("CMD /C java ImprimirMundo");
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
Futuro Sysadmin

PabloPbl

#3
Pues estoy en la misma que ustedes, he intentado un montón de formas y no consigo hacerlo. Si hago todo desde la consola manualmente pongo los comandos apropiados para cada función lo hace perfecto, pero cuando quiero ejecutar los comandos desde código java lo hace bien pero hasta cierto punto, la única parte donde no se ejecuta es a la hora de mostrarse la impresión "MUNDO" pero por lo demás va bien, compila bien y me crea el jar bien.

Así me quedo el código la ultima vez que lo ejecute, tuve que crear un Manifest y todo pero no va:
Código (java) [Seleccionar]

import java.io.IOException;

public class ImprimirHola {

   public ImprimirHola() {
       System.out.println("HOLA");
       try {
           Runtime.getRuntime().exec("javac ImprimirMundo.java");
    Runtime.getRuntime().exec("jar cvmf Manifest.txt ImprimirMundo.jar ImprimirMundo.class");
    Runtime.getRuntime().exec("java -jar ImprimirMundo.jar");
       } catch (Exception e) {
e.printStackTrace();
       }
   }
   
   public static void main(String[] args) {
       new ImprimirHola();
   }
}



Estos 2 comandos se ejecutan bien y lo he comprobado:
Código (java) [Seleccionar]

Runtime.getRuntime().exec("javac ImprimirMundo.java");
Runtime.getRuntime().exec("jar cvmf Manifest.txt ImprimirMundo.jar ImprimirMundo.class");


Luego este es el que no se ejecuta, pero si lo hago desde la consola, tecleando manualmente el comando me lo hace perfecto:
Código (java) [Seleccionar]
Runtime.getRuntime().exec("java -jar ImprimirMundo.jar");

Haber si alguien mas se anima a hacerlo y nos cuenta en que estamos fallando, o como se debería hacer.

Un saludo a todos.

Lind L. Tailor

#4
Hola...

Como están compañeros programadores, espero que su día este saliendo de maravillo, sino recuerden que todo tiene solución ;)...

Como comentaba en un tema posterior a este, a continuación, proporciono la solución...

IMPORTANTE: La solución no fue otorgada por su servidor, código original: Profesor_Falken.

Como sabrán el objetivo de este tema era "enlazar" dos aplicaciones java la cual al ejecutar una de ellas mediante línea de comando, mandábamos a llamar la segunda aplicación y así obtener como salida el famoso "HOLA MUNDO", donde la palabra "HOLA" se encontraba en el primer archivo y la palabra "MUNDO" en el segundo.

Comprendí el error cuando entendí que el problema no era la forma en que estábamos llamando a los archivos, incluso podríamos intentar infinidad de códigos desde java con el fin de obtener la salida espera pero el resultado siempre iba a ser el mismo, la razón se debe a que erróneamente pensaba que el método exec() de la clase Runtime se encargaba de EJECUTAR, ESPERAR y MOSTRAR la salida en consola del archivo llamado... Pensamiento erróneo, efectivamente ejecuta el archivo mas no realiza los últimos dos, y es que si lo analizamos estamos diciendo a nuestra aplicación "Ejecuta el Archivo.jar" mas no le estamos diciendo "Espera a que termine su ejecución y muestra por consola lo que te trae", en pocas palabras nosotros tenemos que programar las ultimas dos acciones lo cual se logra con la clase Process...

Código (java) [Seleccionar]

try {
Process p = Runtime.getRuntime().exec("java -jar C:\\Mundo.jar");
BufferedReader output = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));

 String linea= "";

while ((linea= output.readLine()) != null) {
System.out.println(linea);
}

while ((linea= error.readLine()) != null) {
System.out.println(linea);
}

p.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}


Con gusto proporciono la dirección web de la clase mencionada anteriormente, ya que estoy seguro que les servirá para comprender de mejor forma todo el proceso http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html.

Sin mas que comentar, agradezco a los compañeros interesados en el tema y por sus soluciones, así como agradecimientos a Profesor_Falken por tan excelente solución, marco tema como solucionado.

PabloPbl

Muy interesante tu solución, aunque había visto algo parecido por StackOverFlow, pero nunca me puse a probar xD.

Haber si en un rato lo pruebo.

Saludos!!

Lind L. Tailor

Cita de: PabloPbl en 30 Abril 2015, 17:57 PM
Muy interesante tu solución, aunque había visto algo parecido por StackOverFlow, pero nunca me puse a probar xD.

Haber si en un rato lo pruebo.

Saludos!!

Créeme, funciona correctamente ;)

PabloPbl

Jaja, no es que no te crea, simplemente me da curiosidad probarlo por mi mismo, y ver que funciona conmigo xD

Un saludo!

Lind L. Tailor

Por no creerme no te funcioanra xD :silbar: