Archivos de Categoría: Java

Seleccionar una versión diferente de java y javac entre las disponibles en Ubuntu con update-alternatives

Se puede tener más de una versión de Java en la misma máquina.

Si tienes más de una versión de Java JRE o JDK instalada puedes cambiar entre una y otra mediante el comando update-alternatives command:

$ sudo /usr/sbin/update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                           Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-6-openjdk-i386/jre/bin/java   1061      auto mode
  1            /usr/lib/jvm/java-6-openjdk-i386/jre/bin/java   1061      manual mode
  2            /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java   1051      manual mode

Press enter to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java to provide /usr/bin/java (java) in manual mode.

Puedes hacer lo mismo para cambiar la versión de javac:

$ sudo /usr/sbin/update-alternatives --config javac

There are 2 choices for the alternative javac (providing /usr/bin/javac).

  Selection    Path                                        Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-6-openjdk-i386/bin/javac   1061      auto mode
  1            /usr/lib/jvm/java-6-openjdk-i386/bin/javac   1061      manual mode
  2            /usr/lib/jvm/java-7-openjdk-i386/bin/javac   1051      manual mode

Press enter to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/lib/jvm/java-7-openjdk-i386/bin/javac to provide /usr/bin/javac (javac) in manual mode.

Puedes comprobar qué versión estás usando en todo momento ejecutando:

$ java -version
java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2)
OpenJDK Server VM (build 23.7-b01, mixed mode)
$ javac -version
javac 1.7.0_25

Ejecutar un comando desde un programa Java trabajando adecuadamente con stdin, stdout y stderr

Si quieres ejecutar un comando externo desde una aplicación Java tienes que gestionar correctamente los descriptores de ficheros de entrada, salida y error ya que sino se producirá un error. La clave está en leer los buffers de salida y error. Este es un ejemplo de cómo se hace:

import java.io.*;

public class CmdExec {

  public static void main(String argv[]) {
    try {
      String line;
      OutputStream stdin = null;
      InputStream stderr = null;
      InputStream stdout = null;

      // launch the command and grab stdin/stdout and stderr
      Process process = Runtime.getRuntime().exec("ls -la");
      stdin = process.getOutputStream();
      stderr = process.getErrorStream();
      stdout = process.getInputStream();

      // You could write to sdtin too but it's useless for the ls we are doing ;) 
      line = "param1" + "\n";   
      stdin.write(line.getBytes() );
      stdin.flush();

      line = "param2" + "\n";
      stdin.write(line.getBytes() );
      stdin.flush();

      stdin.close();
      
      // clean up if any output in stdout
      BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stdout));
      while ((line = brCleanUp.readLine()) != null) {
        System.out.println ("[Stdout] " + line);
      }
      brCleanUp.close();
      
      // clean up if any output in stderr
      brCleanUp = 
        new BufferedReader (new InputStreamReader (stderr));
      while ((line = brCleanUp.readLine ()) != null) {
        //System.out.println ("[Stderr] " + line);
      }
      brCleanUp.close();
    } catch (Exception err) {
      err.printStackTrace();
    }
  }
}