domingo, 27 de enero de 2019

Java classpath y jar

Recientemente me topé con la forma en la cual las opciones classpath y jar interactúan. Usemos un ejemplo muy sencillo para ilustarlo.

Supongamos que queremos usar una clase que viene en un jar. Por ejemplo:

public class MiClase {
  public static String saludo() {
    return "Saludos de MiClase";
  }
}

Podemos construir un jar de la siguiente manera.

javac MiClase.java
jar cf MiClase.jar MiClase.class

Ahora usemos este jar desde otra clase.

public class Inicio {
  public static void main(String[] args) {
    System.out.println(MiClase.saludo());
  }
}

Si sólo queremos ejecutar esta clase.

javac -cp MiClase.jar Inicio.java
java -cp .:MiClase.jar Inicio

Qué pasa si también queremos crear un jar de esta clase.

jar cfe Inicio.jar Inicio Inicio.class

Noten que el parámetro Inicio indica el punto de entrada a nuestra aplicación. Este fue mi primer intento para ejecutar el programa.

java -cp MiClase.jar -jar Inicio.jar

El cual me generó este error:

Exception in thread "main" java.lang.NoClassDefFoundError: MiClase

Resulta que la opción jar funciona con jars que contienen todas sus dependencias, también les llaman jar ejecutables. La solución es poner los jars en el classpath e indicar el punto de entrada.

java -cp MiClase.jar:Inicio.jar Inicio

No hay comentarios:

Publicar un comentario