martes, 15 de junio de 2010

Cómo compilar manualmente en java utilizando clases en distintos paquetes

No cabe duda de que las IDE nos ahorran mucho trabajo a la hora de compilar y correr un programa. En java quizá una de las IDEs más notables es NetBeans. Sin embargo, es muy interesante y divertido realizar el proceso de codificación, compilación y corrida de un programa a través de la consola o línea de comandos ya que proporciona una idea más clara de lo que ocurre con el código fuente y las clases generadas a partir de él. Este ejemplo ilustra el proceso de compilación y corrida de un proyecto para Windows únicamente.Para ilustrar estos procedimientos, utilizaré como ejemplo un grupo de clases muy sencillas cuya finalidad es imprimir un menú para la comida corrida de un restaurante (nota: se conoce como comida corrida a la comida completa desde la sopa hasta el postre que se sirve platillo tras platillo y para la cual se preparan entre dos y cuatro tipos de guisados, sopas secas y sopas caldosas así como uno o dos postres de manera que el comensal puede elegir la combinación que desee pagándola en una sola exhibición y a precio razonable).
Primero hay que crear los directorios donde se almacenará el código fuente y las clases generadas una vez compilado este pequeño proyecto. Se puede utilizar cualquier nombre, en el ejemplo utilizaré un folder llamado "src" para guardar el código fuente (archivos con extensión *.java) y otro llamado "bin" para las clases generadas tras la compilación (archivos con extensión *.class). Estos nombres son los que utiliza NetBeans cuando se genera un proyecto.
Después se crean cada una de las clases que conforman el código fuente. De preferencia utiliza el bloc de notas para que el proceso sea completamente a mano, esto también es útil para aprender la sintaxis de java, aunque estas clases son muy sencillas. A saber, en este ejemplo se crearon las clases: ComidaCorrida.java, SopaAguada.java, SopaSeca.java, PlatilloFuerte.java y Postre.java. La clase ComidaCorrida.java (mostrada a continuación) se crea dentro del paquete com.blogspot.tipsparaisc.menu. Mientras que las demás clases se crean dentro de un paquete distinto: com.blogspot.tipsparaisc.menu.comidas. Es por ello que dentro de la clase ComidaCorrida.java que contiene al método main, se debe importar este último paquete de manera que al instanciar las otras clases, éstas puedan ser reconocidas por el compilador.
Las clases SopaAguada.java, SopaSeca.java, PlatilloFuerte.java y Postre.java simplemente contienen un constructor sencillo el cual al ser instanciada la clase permite imprimir el tipo de platillo o postre que se indique seguido de un retorno de carro como se muestra en la sentencia de impresión.
Antes de comenzar la compilación, se debe crear el directorio completo donde se almacena el código fuente para cada clase. Esta ruta se obtiene a partir de la declaración de los paquetes. En el ejemplo, dentro de la carpeta "src" se crea la carpeta "com", dentro de ésta se crea la carpeta "blogspot", dentro de ésta se crea la carpeta "tipsparaisc", dentro de ella se crea la carpeta "menu" y finalmente dentro de ella se crea la carpeta "comidas". La clase ComidaCorrida.java se guarda dentro de la carpeta "menu" y las otras clases se guardan dentro de la carpeta ''comidas". Esto es, la ruta donde está almacenada la clase ComidaCorrida debe quedar de la siguiente manera:
C:\Ejemplo\src\com\blogspot\tipsparaisc\menu\ComidaCorrida.java
Y para el resto de las clases, la ruta debe ser la siguiente (utilizando como ejemplo una de ellas):
C:\Ejemplo\src\com\blogspot\tipsparaisc\menu\comidas\SopaAguada.java
Una vez que se tiene todo el código fuente en estas rutas se puede compilar el proyecto. Primero, debemos abrir la consola o símbolo del sistema y ubicarnos en el directorio o ruta donde se encuentra el proyecto, en este caso, la ruta del ejemplo es: C:\Ejemplo. (Importante: la variable de entorno de windows llamada Path localizada en las propiedades del sistema debe contener al inicio la ruta donde se encuentra instalado el compilador de java, es decir, el archivo javac.exe, de no ser así, debes pegar dicha ruta al inicio para poder compilar en la consola).
Para compilar, utiliza la siguiente secuencia de instrucciones delante de la ruta del proyecto respetando espacios y puntuación:
C:\Ejemplo>javac -d bin -cp src src\com\blogspot\tipsparaisc\menu\ComidaCorrida.java
Esto es lo que significa cada instrucción:
javac: es la instrucción para compilar un archivo. Independientemente de las demás opciones, esta instrucción se utiliza al inicio cuando se desea compilar cualquier archivo de java.
-d: indica el lugar donde se desean colocar los archivos con extensión *.class generados una vez realizada la compilación. En el ejemplo, se está indicando que dichos archivos deben ser colocados dentro de la carpeta llamada "bin" que es la carpeta que se creó al inicio junto con la carpeta "src".
-cp (también se puede utilizar -classpath): indica el directorio donde se deben buscar las clases que se van a compilar. Esta opción se utiliza cuando se desean compilar clases ubicadas en carpetas distintas. Delante de esta instrucción se coloca la carpeta o lugar desde el cual se debe comenzar la búsqueda del código fuente. En este ejemplo se está indicando que se debe comenzar a buscar desde la carpeta llamada "src". A continuación se escribe la ruta completa que lleva al compilador hacia la clase principal o la clase que contiene el método "main" que en el ejemplo es la clase ComidaCorrida.java. Es muy importante que durante la compilación se escriba la extensión *.java del archivo que contiene el método "main".
Una vez compilado el proyecto, podemos correrlo para observar los resultados. Para correr el proyecto se utiliza la siguiente secuencia de instrucciones después de la ruta que contiene el ejemplo (no olvides respetar espacios y puntuación):
C:\Ejemplo>java -cp bin com.blogspot.tipsparaisc.menu.ComidaCorrida
Esto es lo que significa cada instrucción: java: es la instrucción que se coloca al principio siempre que se va a correr un archivo ya compilado.
-cp (o -classpath): cuando se corre un programa, esta instrucción indica el lugar donde se debe buscar el archivo con extensión *.class que el intérprete de java utiliza para ejecutar el proyecto o archivo con el que se está trabajando. A continuación se indica la carpeta donde se debe buscar al o los archivos *.class que servirán para correr el ejemplo, la cual ahora es la carpeta "bin" (nótese que en la secuencia de compilado, la instrucción -cp está seguida de "src"), seguida de un espacio en blanco y a continuación la ruta para encontrar a dicho archivo, separando cada carpeta que conforma a dicha ruta ahora con un punto en vez de una diagonal como se hizo en el proceso de compilación. Esta ruta dentro de la carpeta "bin" se creó automáticamente en el proceso de compilación y es idéntica a la ruta que se encuentra en la carpeta "src" que nosotros creamos manualmente al inicio del ejemplo. Al final, se escribe el nombre del archivo principal, que en este ejemplo es ComidaCorrida SIN la extensión *.java.
El resultado y las secuencias de compilación y corrida se muestran a continuación:
Puede parecer complicado al principio, pero vale la pena probar este procedimiento. Para obtener más opciones de compilación y corrida se puede teclear en la consola la secuencia javac -help (para el compilador) o bien java -help (para el intérprete o el responsable de correr el programa). Espero que este tutorial haya sido claro y resulte de gran ayuda, si tienen dudas agradeceré que las escriban en los comentarios.
Saludos!

11 comentarios:

  1. Muchas gracias, está excelente el tutorial ;)

    ResponderEliminar
    Respuestas
    1. Gracias a ti por tu comentario.

      Eliminar
    2. Gracias a ti pude hacer este video (:
      http://www.youtube.com/watch?v=gHNQ_CfKulo

      Eliminar
    3. Este comentario ha sido eliminado por el autor.

      Eliminar
    4. Muchas gracias por el aporte del video. Me gustaría incluirlo como parte de una actualización del post, pero al parecer hay un problema al querer verlo en YouTube. Ojalá le eches un vistazo por si hay que arreglar algo para poder verlo. Saludos.

      Eliminar
  2. Respuestas
    1. Gracias por comentar. Me da gusto que esta explicación te haya servido.

      Eliminar
  3. Muy intuitivo, el mejor de cuantos he consultado.

    ResponderEliminar
  4. Gracias por la información, muy buena la explicación

    ResponderEliminar
  5. Respuestas
    1. Nos da mucho gusto que te haya servido. Gracias por visitar el blog :)

      Eliminar