Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=3f56ae29-99ea-419b-916e-f4cadec23695

Java: qué es el classpath y cómo lo ajusto

Ya hemos explicado con detalle en este blog qué son los paquetes de Java y cómo se utilizan.

Cuando estás programando en Java y quieres hacer uso de alguna clase desde tu código que está en otro paquete o en una librería externa, debes incluir un import al principio de tu clase, algo así:

import java.lang.Math;
import com.miempresa.utilidades.MiUtilidad;

o, incluso, para importar varias clases dentro del mismo paquete, se puede usar un asterisco:

import java.lang.*;
import com.miempresa.utilidades.*;

Así, luego, en tu programa puedes hacer uso de las clases que has importado, de manera directa, en nuestro ejemplo, algo así:

System.out.println(Math.PI);
MiUtilidad prueba = new MiUtilidad();

que mostrará por consola el valor del número Pi, definido dentro de la clase Math, e instanciará un nuevo objeto de la clase MiUtilidad() que tenemos en una librería de terceros, por ejemplo.

¿Cómo sabe el compilador de Java dónde encontrar las clases que hemos importado? Más aún, si se trata de una clase de terceros, no de la plataforma, ¿de qué manera averigua dónde está y cómo ponerla a disposición de tu programa a partir del import?

Básicamente, la máquina virtual de Java (JVM) puede utilizar dos tipos de archivos para acceder a este código referenciado:

Los primeros suelen estar en la carpeta output de nuestro proyecto, por ejemplo, en el archivo carpeta output/com/miempresa/utilidades/MiUtilidad.class, junto a los demás archivos compilados de las demás clases de ese paquete.

Los segundos, .jar, pueden estar en cualquier sitio de nuestro sistema, en donde el compilador debe encontrarlos.

Pero lo que no tendría sentido es que, para localizar cada paquete, se recorriese el disco duro completo buscándolos.

Así, si la clase MiUtilidad que queremos emplear en nuestro código forma parte de una librería externa que nos han facilitado en forma de archivo .jar para su distribución, ¿cómo la localizan las herramientas de Java?

La respuesta está en una variable de entorno especial llamada CLASSPATH, que contiene las rutas en donde las herramientas de Java y la JVM deben mirar para localizar los archivos de código y los paquetes que se van a utilizar. Puede apuntar a las carpetas raíz de jerarquías de paquetes y rutas directas a archivos .jar.

¿Cómo se establece el CLASSPATH?

Básicamente existen dos formas de hacerlo:

  1. Estableciendo una variable de entorno del sistema
  2. Usando un parámetro específico al utilizar Java o sus herramientas

Variables de entorno

La primera opción, de las variables de entorno, es la más directa, porque además queda permanentemente establecida en nuestro sistema, pero al mismo tiempo es la más problemática, porque es una configuración no tan fácil de replicar y transportar a otro equipo o entorno y además podemos "arreglar" un programa y "cargarnos" otro por andar tocando la variable.

De todos modos, vamos a ver cómo se hace.

Por ejemplo, establecer en CLASSPATH en sistemas *NIX como Linux o macOS es tan sencillo como escribir esto:

export CLASSPATH=/home/usuario/misProyectos/libs/*:/utilidades/libs/utils.jar

Es decir, se establece la variable y se le pasan las rutas que sean necesarias, separándolas con el símbolo de dos puntos (:).

También podemos añadir una ruta a las rutas que hayamos establecido previamente usando una variable, así:

export CLASSPATH=${CLASSPATH}:/utilidades/libs/utils.jar

Lo que hará será expandir esa variable, sustituyéndola por su valor, para, a continuación, concatenarle la ruta o rutas adicionales que nos interesen.

En el caso de Windows, se puede hacer de manera visual con las propiedades avanzadas del sistema, pero desde línea de comandos podemos hacer lo mismo usando el comando set y separando las rutas con un punto y coma (;):

set classpath=C:\java\MisClases;C\Utilidades\libs\utils.jar

Del mismo modo, podemos expandir una variable para agregar rutas nuevas a las ya existentes:

set classpath=%classpath%;C\Utilidades\libs\utils.jar

Usando el parámetro -classpath

Generalmente es mejor idea utilizar este método, porque es mucho más fácil de transportar a otros sistemas y se puede incluir en algún tipo de archivo de script para automatizar las tareas de los proyectos.

Las herramientas de Java, como java para ejecutar o javac para compilar, admiten un parámetro -classpath o su versión abreviada -cp que sirven específicamente para establecer las rutas del CLASSPATH.

Así, es tan sencillo como hacer esto, por ejemplo, para compilar un programa:

java -d bin -cp /home/usuario/misProyectos/libs/*:/utilidades/libs/utils.jar miPrograma

Fíjate en cómo le pasamos los mismos valores que antes, en el caso de Linux o macOS separados por :, para indicar las rutas que queremos utilizar en el CLASSPATH. Además, con el parámetro -d le estamos diciendo en qué carpeta queremos que se generen los archivos compilados.

En Windows sería exactamente igual, pero separados por ;, como antes.

¿Qué pasa si tenemos mal establecido el CLASSPATH?

Pues básicamente es uno de los motivos de recibir un error de tipo java.lang.NoClassDefFoundError a la hora de ejecutar o compilar un proyecto, como ya hemos explicado con detalle aquí: Cómo solucionar el error "java.lang.NoClassDefFoundError" en Java.

campusMVP campusMVP es la mejor forma de aprender a programar online y en español. En nuestros cursos solamente encontrarás contenidos propios de alta calidad (teoría+vídeos+prácticas) creados y tutelados por los principales expertos del sector. Nosotros vamos mucho más allá de una simple colección de vídeos colgados en Internet porque nuestro principal objetivo es que tú aprendas. Ver todos los posts de campusMVP
Archivado en: Lenguajes y plataformas

¿Te ha gustado este post?
Pues espera a ver nuestro boletín mensual...

Suscríbete a la newsletter

La mejor formación online para desarrolladores como tú

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.