5.6 Sobre la compilación

Compilar un programa escrito en C o en Java es muy sencillo a través del intérprete de comandos. Basta con invocar al compilador correspondiente y con los argumentos adecuados. Tras la compilación generaremos un fichero que puede ser ejecutado directamente por la computadora (en el caso del C) o interpretado por una máquina virtual (en el caso del Java).

El único inconveniente que tiene compilar usando shell es que en muchas ocasiones escribimos exactamente lo mismo. Para ayudarnos en esta tarea se utiliza el programa make. Este programa ejecuta los comandos interactivos escritos en un fichero llamado Makefile. Dicho fichero tiene una estructura muy simple:

objetivo: dependencias_objetivo  
          comandos para conseguir objetivo

Así, cuando escribamos:

make objetivo

el programa make comprobará si objetivo es más viejo (atendiendo a la fecha de la última modificación de los ficheros) que alguna de sus dependencias y si así es, ejecutará los comandos para conseguir objetivo. Como veremos, los objetivos pueden ser ficheros u objetivos que generen ficheros (como el objetivo all).

5.6.1 Compilación de VolMeter

# Regla para compilar los fuentes Java  
%.class: %.java  
        javac $*.java  
 
# Clases  
BIN =  
BIN += VolMeter.class  
 
# Objetivo por defecto  
all:        $(BIN)  
 
bin:        all  
        cp *.class $(BIN)  
 
# Creación del fichero .jar con todas las clases  
jar:        bin  
        jar cvfm VolMeter.jar meta-inf/manifest.mf -C . *.class  
 
clean:  
        rm -f *.class VolMeter.jar  
 
test:        jar  
        arecord -f cd -t raw | java -jar VolMeter.jar

Nótese que el objetivo jar genera un fichero .jar que contiene las clases (en este ejemplo sólo una) y un fichero de configuración almacenado en meta-inf/manifest.mf. El conenido de este fichero es:

Manifest-Version: 1.0  
Main-Class: VolMeter  
Created-By: Vicente Gonzalez Ruiz  

La idea de generar un fichero .jar se debe a que en ocasiones (aunque no en esta,) los programas en Java generan muchas clases. Una forma de agruparlas en un único fichero (y de paso, comprimirlas porque un .jar es idéntico a un .zip) es hacer este proceso.