Nov 14
Revisando los contenidos para la scja, encontré un problema con la parte de compilar, nunca lo había hecho de forma manual, siempre utilizando Eclipse. Así que para que no se me olvide y por si le sirve a alguien explicaré el ejemplo que viene en un ejercicio de compilación, se tienen 4 clases en dos paquetes (paquete y sub paquete) son:
package com.scjaexam.tutorial;
import com.scjaexam.tutorial.planets.*;
public class GreetingUniverse
{
public static void main(String[] args)
{
Earth e;
Mars m;
Venus v;
System.out.println(“Greeting Universe!”);
e= new Earth();
m = new Mars();
v= new Venus();
}
}
Ojo no olvidar agregar el import ya que si no el compialdor no sabrá donde se encuentran esas clases.
package com.scjaexam.tutorial.planets;
public class Earth
{
public Earth()
{
System.out.println(“Hello from Heart”);
}
}
package com.scjaexam.tutorial.planets;
public class Mars
{
public Mars()
{
System.out.println(“Hello from Mars!!!”);
}
}
package com.scjaexam.tutorial.planets;
public class Venus
{
public Venus ()
{
System.out.println(“Hello from Venus!!!”);
}
}
Con los cuatro códigos fuente en un mismo directorio llamado 26
Se compilan cada clase del sub paquete planets así
javac -d . Venus.java
javac -d . Earth.java
javac -d . Mars.java
La opción -d deja el .class en la ruta específicada en la clase (hay que recordar que la declaración package se traduce para el sistema operativo como una ruta específica en este caso com.scjaexam.tutorial se lleva a
/home/joseangel/Desarrollo/workspace/sin_ide/26/src/com/scjaexam/tutorial), tambien si esta ruta no existe, la crea.
hora bien, para compilarbasta con hacer
javac -d . GreetingUniverse.java
Para ejecutar, y al formar parte de un paquete, tenemos que ejecutarlo con el nombre del paquete sin extensión, esto es:
java com.scjaexam.tutorial.GreetingUniverse
Hasta ahora todo bien, dentro del directorio src se debió de haber creado el directorio del paquete y subpaquete respectivamente, la cual es:
GreetingUniverse.class en
/home/joseangel/Desarrollo/workspace/sin_ide/26/src/com/scjaexam/tutorial
y
Earth.class, Venus.class, Mars.class en
/home/joseangel/Desarrollo/workspace/sin_ide/26/src/com/scjaexam/tutorial/planets/
Ahora, que pasaría si cambiamos de paquete a Earth.class y lo situamos en el package otro.scjaexam/tutorial
primero hay que agregar el paquete a la clase principal, esto en GreetingUniverse.java, agregamos la linea
import otro.scjaexam.tutorial.planets.*;
luego compilamos de nuevo Earth.java con la opción -d
intentamos compilar la clase GreetingUniverse.java y todo resulta a la perfección, pero ahora que sucedería si a la clase Venus.class la sacamos de la estructura del paquete, es decir lo ponemos enun directorio diferente.
Para ejecutar no tiene cambio alguno, ya que se encuentran dentro de la ruta actual donde inician los paquetes, es decir tanto otro.scjaexam.tutorial.planets como com.scjaexam.tutorial.planets están dentro de src.
para diferenciar esto, agregamos Venus.class al paquete fuera.scjaexam.tutorial.planets para ello cambiar su declaración package a:
package fuera.scjaexam.tutorial.planets;
compilamos de nuevo Venus.java.
javac -d . Venus.java
despues movemos la estructura del paquete a otro directorio, por ejemplo movemos desde …/fuera/scjaexam/tutorial/planets/Venus.class a /home/joseangel/Escritorio
quedando de esta manera /home/joseangel/Escritorio/fuera/scjaexam/tutorial/planets/Venus.class
ahora intentamos compilar la clase principal GreetingUniverse.java y obtenemos esto7
[joseangel@lap src]$ javac -d . GreetingUniverse.java
GreetingUniverse.java:3: package fuera.scjaexam.tutorial.planets does not exist
import fuera.scjaexam.tutorial.planets.Venus;
^
1 error
para resolver este problema usamos la opción -cp
hay que poner especial atención, ya que al utilizar la opción cp, le decimos al compilador donde se encuentran las clases, para ello recordamos que el separador para rutas en windows es ; (punto y coma) y en windows son : (dos puntos), así la opción completa para compilar podría ser:
javac -d . -cp /home/joseangel/Escritorio GreetingUniverse.java
sin embargo esto nos procaría el siguiente error:
javac -d . -cp /home/joseangel/Escritorio GreetingUniverse.java
GreetingUniverse.java:2: package com.scjaexam.tutorial.planets does not exist
import com.scjaexam.tutorial.planets.*;
^
GreetingUniverse.java:4: package otro.scjaexam.tutorial.planets does not exist
import otro.scjaexam.tutorial.planets.Earth;
^
GreetingUniverse.java:10: cannot find symbol
symbol : class Earth
location: class com.scjaexam.tutorial.GreetingUniverse
Earth e;
^
GreetingUniverse.java:11: cannot find symbol
symbol : class Mars
location: class com.scjaexam.tutorial.GreetingUniverse
Mars m;
^
GreetingUniverse.java:14: cannot find symbol
symbol : class Earth
location: class com.scjaexam.tutorial.GreetingUniverse
e= new Earth();
^
GreetingUniverse.java:15: cannot find symbol
symbol : class Mars
location: class com.scjaexam.tutorial.GreetingUniverse
m = new Mars();
^
6 errors
Esto es porque al compilador le decimos donde está unicamente la clase Earth.class, por eso para decirle exactamente donde están nuestras clases tenemos que especificar dos rutas, la ruta actual de Earth.class y Mars.class con . (punto) y la ruta de Venus.class
para ello lo hacemos de la siguiente forma:
javac -d . -cp .:/home/joseangel/Escritorio GreetingUniverse.java
y nos compila sin ningún problema.
para ejecutar se tiene que agregar una nueva opción al compilador cp quedando de la siguiente forma:
java -cp .:/home/joseangel/Escritorio com.scjaexam.tutorial.GreetingUniverse
la misma advertencia anterior, se tiene que poner .:/home/joseangel/Escritorio de esta manera le decimos al interpreta java que las clases se encuentran en el mismo directorio src (clases Mars.class y Earth.class) y en la ruta /home/joseangel/Escritorio (Venus.class), si no se pone el . (punto), el interprete java no encontraría las clases dentro de src (Mars y Earth) mostrando el siguiente error.
[joseangel@lap src]$ java -cp /home/joseangel/Escritorio com.scjaexam.tutorial.GreetingUniverse
Exception in thread “main” java.lang.NoClassDefFoundError: com/scjaexam/tutorial/GreetingUniverse
Caused by: java.lang.ClassNotFoundException: com.scjaexam.tutorial.GreetingUniverse
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: com.scjaexam.tutorial.GreetingUniverse. Program will exit.
Comentarios Recientes