Classpath es un parámetro que define una lista de directorios, archivos JAR y ZIP en los cuales la máquina Java y el compilador buscan clases y recursos al ejecutar una aplicación.
Historia del asunto:
Desde la aparición de Java, ha surgido la necesidad de organizar la carga de un gran número de clases, que a menudo se encuentran en diferentes directorios. Para esto se inventó el classpath, que permite especificar de manera flexible los lugares de búsqueda de las dependencias.
Problema:
Si el classpath está configurado incorrectamente, la aplicación no encontrará las clases necesarias, lo que resultará en errores de carga (por ejemplo, ClassNotFoundException o NoClassDefFoundError).
Solución:
El classpath se puede establecer a través de la variable de entorno CLASSPATH, el parámetro de la línea de comandos -cp o -classpath. Es importante especificar explícitamente todos los directorios y archivos JAR necesarios para que la aplicación funcione. Ejemplo de ejecución con classpath:
java -cp ".;lib/*" com.example.Main
Características clave:
; (Windows) o : (Linux/macOS)lib/* — todos los JAR en la carpeta lib¿Puede Java encontrar clases por sí misma, si no están especificadas en el classpath?
No, Java no realiza una búsqueda automática de clases fuera del classpath especificado. Cada ruta debe estar explícitamente indicada o añadida en la etapa de construcción o ejecución.
¿Influye el orden de las rutas en el classpath en la carga de clases?
Sí, en caso de coincidencia de nombres de clases, se encontrará primero la clase del primer camino especificado. El orden es importante para evitar conflictos de versiones.
¿Se puede añadir un nuevo JAR al classpath "en tiempo real" después de iniciar la aplicación?
No, el mecanismo estándar del classpath es estático después de iniciar la JVM. La carga dinámica de nuevas clases requiere ClassLoaders especiales.
Una aplicación Java se inicia con el parámetro -cp lib/mylib.jar, olvidando agregar la carpeta con la configuración de prueba. Como resultado, la aplicación falla con un error, aunque la biblioteca parece estar presente.
Ventajas:
Desventajas:
Se utilizan maven/gradle, que generan el classpath automáticamente en función de las dependencias. La ejecución se realiza a través de un script wrapper.
Ventajas:
Desventajas: