Escolar Documentos
Profissional Documentos
Cultura Documentos
Java Classpath
El objetivo de esta práctica es mostrar el concepto del Java classpath y cómo afecta a la compilación y ejecución de los
programas Java. El classpath es el concepto más básico pero esencial, que consiste en la ubicación de los ficheros. Si el
classpath no se configura correctamente, se experimentará con la excepción (error) "java.lang.NoClassDefFoundError:
<nombre del fichero class>".
Recursos
Ejercicios
0. Compilar el programa Hello usando "javac" y ejecutando con "java" en la línea de comando
1. Ejercicio con la opción "-classpath" o "-cp" cuando se ejecuta con el comando "java"
2. Ejercicio con la variable de entorno CLASSPATH
(1.0) Compilar el programa Hello usando "javac" y ejecutando con "java" en la línea de comando
Este paso ya se ha realizado como parte del Ejercicio 1 del Laboratorio: Conociendo el entorno de programación
Java. Se repite aquó por si no se ha visto antes.
C:\>mkdir c:\misprogramasjava
C:\>cd \misprogramasjava
2. Escribir Hello.java con un editor de texto (pe. jedit) como se muestra en Código-1.10.
C:\misprogramasjava>jedit Hello.java
/**
* Mi primer programa Java
*/
public static void main( String[] args ){
}
Código-1.10: Hello.java
3. Compilar Hello.java usando el compilador javac. El compilador javac viene con el J2SE SDK descargado e
instalado. Se encuentra en el directorio %JAVA_HOME%\bin (Windows). El resultado de la compilación será la
creación del fichero de clase Hello.class.
C:\misprogramasjava>javac Hello.java
4. Hay que asegirarse que se ha creado el fichero Hello.class. El fichero Hello.class contiene la representación en
bytecode de la clase Hello.
C:\misprogramasjava>dir Hello.class
http://personales.unican.es/corcuerp/java/Labs/LAB_8.htm 1/10
1/9/2018 LAB-8: Classpath
Volume in drive C is ACER
Volume Serial Number is 58CE-B0DC
Directory of C:\misprogramasjava
C:\misprogramasjava>java Hello
Hello world
(1.1) Ejercicio con la opción "-classpath" o "-cp" cuando se ejecuta con el comando "java"
La opción "-classpath <path>" o "-cp <path>" especifica la ubicación donde residen los ficheros de clase (en el
ejemplo, sólo se tiene un fichero de clase llamado Hello.class). Cuando no se especifica la opción classpath, el
comando java trata de encontrar los ficheros de clase en los directorios especificados en la variable de entorno
CLASSPATH o en el directorio en curso. Así, el intérprete Java trata de encontrar los ficheros de clase en el siguiente
orden:
1. Ejecutar el programa Hello usando el comando java con la opción -cp . (hay un espacio y un punto después de -
cp seguido por un espacio) o la opción -classpath . (hay un espacio y un punto después de -classpath seguido por
un espacio).
2. Ejecutar "java -classpath .. Hello" para ver si funciona. (en lugar de un punto simple ., se especifican dos puntos
.. entre -classpath y Hello. El doble punto .. especifica el directorio padre, C:\ en este ejemplo, mientra que el punto
simple . especifica el directorio en curso, c:\misprogramasjava en este ejemplo.) Debe dar un error como se muestra
a continuación, debido a que se asigna como classpath el directorio padre, C:\, que no contiene el fichero
Hello.class.
3. Copiar el fichero Hello.class al directorio padre e intentar el comando anterior otra vez. Se verá el siguiente
resultado:
C:\misprogramasjava>java -classpath .;..;c:\tmp Hello (si el fichero Hello.class se encuentra en uno de los tres
directorios, funciona .)
Hello world
Se puede asignar un classpath en el sistema mediante la variable de entorno CLASSPATH. Este classpath se aplica
en todo el sistema con lo que significa que se aplica a todos los programas Java que se ejecutan en la plataforma.
http://personales.unican.es/corcuerp/java/Labs/LAB_8.htm 2/10
1/9/2018 LAB-8: Classpath
Se puede sobreescribir mediante la opción -classpath o -cp cuando se ejecuta un programa particular.
1. Asignación de la variable de entorno CLASSPATH primero con el directorio que contiene el fichero Hello.class y
después se ejecuta el programa.
Como se ha visto antes, se puede asignar la variable de entorno CLASSPATH a un conjunto de directorios. En
Windows se usa punto y coma ; para separarlos.
Resumen
Este ejercicio ha mostrado el uso de la opción -classpath y cómo configurar la variable de entorno CLASSPATH.
Volver al inicio
Este ejercicio también se realiza en una terminal de comandos (Símbolo del sistema). El ejercicio muestra el uso de
class path con el programa StudentRecordExample primero sin utilizar la sentencia package y después con la
sentencia package. Notar que uno de los beneficios de usar un IDE como NetBeans es que el IDE gestiona todos los
class path de tal manera que uno no debe preocuparse por esta opción.
1. Escribir StudentRecord.java usando un editor de textos (pe. jedit) como se muestra en Código-2.10.
C:\misprogramasjava>jedit StudentRecord.java
http://personales.unican.es/corcuerp/java/Labs/LAB_8.htm 3/10
1/9/2018 LAB-8: Classpath
}
Código-2.10: StudentRecord.java
2. Escribir StudentRecordExample.java usando un editor de textos (pe. jedit) como se muestra en Código-2.11.
C:\misprogramasjava>jedit StudentRecordExample.java
}
Código-2.11: StudentRecordExample.java
3. Borrar los ficheros class previamente creados para empezar desde un estado limpio.
http://personales.unican.es/corcuerp/java/Labs/LAB_8.htm 4/10
1/9/2018 LAB-8: Classpath
C:\misprogramasjava>javac StudentRecord.java StudentRecordExample.java (esto funciona)
C:\misprogramasjava>dir Student*.class
Volume in drive C is ACER
Volume Serial Number is 58CE-B0DC
Directory of C:\misprogramasjava
5. Ejecutar el programa.
1. Modificar StudentRecord.java como se muestra en Código-2.20. El fragmento de código que es necesario añadir
se realta en color azul y negrita.
}
Código-2.20: adición de la sentencia package
}
Código-2.21: adición de la sentencia package
3. Eliminar los ficheros class previamente creados para empezar desde un estado limpio.
Directory of C:\misprogramasjava
Los ficheros *.java que tienen la sentencia package tienen que estar ubicados dentro de la estructura de
directorios reflejando el directorio especificado en la sentencia package.
7. Compilar el código. Se obtiene un error porque se intenta compilar los ficheros Java que no están presentes en el
directorio en curso.
C:\misprogramasjava>del *.class
C:\misprogramasjava>javac StudentRecord.java StudentRecordExample.java
error: cannot read: StudentRecord.java
1 error
8. Compilar el código usando el path de los ficheros *.java. La compilación es correcta. Notar que los ficheros class
se crean ahora bajo el directorio studentpackage y no en el directorio en curso.
C:\misprogramasjava>javac studentpackage/StudentRecord.java
studentpackage/StudentRecordExample.java
C:\misprogramasjava>dir studentpackage
Directory of C:\misprogramasjava\studentpackage
Una vez que el fichero se clase se encuentra JVM verifica que la jerarquía de package especificado en el fichero
de clase, que es studentpackage a partir del directorio en curso. Es decir, la JVM trata de encontrar el fichero
./studentpackage/StudentRecordExample.class en el class path. Como el class path se asigna al directorio
studentpackage, busca en ./studentpackage/studentpackage/StudentRecordExample.class, que no existe.
11. Ejecutar el programa usando la opción "-classpath ." pero con el path apropiado al fichero class.
http://personales.unican.es/corcuerp/java/Labs/LAB_8.htm 7/10
1/9/2018 LAB-8: Classpath
studentpackage empezando desde el class path.
C:\misprogramasjava>cd studentpackage
C:\misprogramasjava\studentpackage>java -classpath . StudentRecordExample
Exception in thread "main" java.lang.NoClassDefFoundError: StudentRecordExample
(wrong name: studentpackage/StudentRecordExample)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
15. Ejecutar el programa en el directorio C:\ dcon el classpath apropiado y el path al fichero de clase.
C:\misprogramasjava>cd \
C:\>java -classpath misprogramasjava studentpackage.StudentRecordExample
Name = Anna
Student Count = 3
1. Crear otro directorio llamado anotherpackge donde se va a escribir un nuevo programa Java.
C:\misprogramasjava>mkdir anotherpackage
C:\misprogramasjava>cd anotherpackage
C:\misprogramasjava\anotherpackage>jedit DummyClass.java
package anotherpackage;
3. Modificar StudentRecord.java para usar DummyClass como se muestra en Código-2.32. El fragmento de código
a añadir se muestra en azul y negrita.
// Import packages
import anotherpackage.*;
}
Código-2.32: StundentRecord.java modificado
C:\misprogramasjava\anotherpackage>cd \misprogramasjava
C:\misprogramasjava>javac studentpackage/*.java
C:\misprogramasjava>dir studentpackage
C:\misprogramasjava>dir anotherpackage
5. Ejecutar el programa.
Resumen
En este ejercicio se ha explorado la relación entre la opción classpath y la estructura de los package.
Volver al inicio
Tarea
1. La tarea es desarrollar y ejecutar un programa Java en la línea de comandos usando los comandos "javac" y
"java".
http://personales.unican.es/corcuerp/java/Labs/LAB_8.htm 9/10
1/9/2018 LAB-8: Classpath
Escribir una clase llamada Food bajo el package foodpackage.fruitpackage
Food.java debe tener la siguiente sentencia package en la parte superior
package foodpackage.fruitpackage
Añadir un par de métodos propios a Food.java
Escribir una clase llamada FoodMain bajo el package foodpackage.fruitpackage
La clase FoodMain crea un objeto Food
La clase FoodMain llama un método del objeto Food
El objetivo de esta tarea es experimentar con packages d estructura de dos niveles. Así,"foodpackage" es un
package padre del package"fruitpackage".Cada uno debe tener su propio directorio y la estructura reflejar esa
dependencia. Los programas Food.java y FoodMain.java están bajo el directorio fruitpackage.
http://personales.unican.es/corcuerp/java/Labs/LAB_8.htm 10/10