Parche para Tomcat 3.3
miércoles, enero 16, 2002 at 1:00AM Si usais Tomcat 3.2.x o Tocmat 4.x no teneis de que preocuparos.
j2ee
miércoles, enero 16, 2002 at 1:00AM
miércoles, enero 16, 2002 at 1:00AM
miércoles, enero 16, 2002 at 1:00AM
miércoles, enero 16, 2002 at 1:00AM
En este artículo vamos a hablar de las tareas más comunes que vienen implementadas por defecto en Ant. La versión utilizada es la 1.4.
Para aquellos que no concozcan Ant, existe un artículo previo que explica qué es Ant y cómo se usa.
La tarea javac sirve para compilar uno o más ficheros fuente en Java. Únicamente se compilan los ficheros que no tengan un fichero .class actualizado (es decir, cuando no existe, o cuando existe pero es más antiguo que el fichero fuente).
Un ejemplo sencillo de uso es el siguiente:
<javac srcdir="fuentes" destdir="clases" classpath="/home/jh/lib"/>
Con esta tarea, se compilan todos los fuentes del directorio fuentes (que debe estar situado en el directorio actual). Las clases resultantes se guardan en el directorio classes (ídem). El classpath en el que buscar clases existentes es /home/jh/lib.
Este ejemplo es equivalente a ejecutar "javac -sourcepath fuentes -classpath /home/jh/lib -d clases *.java"
Por defecto, se utiliza el compilador disponible en el sistema. Para ello, la variable de entorno JAVA_HOME debe apuntar al directorio base del JDK disponible.
Sin embargo, es posible que queramos compilar con otro compilador distinto. Para ello, podemos modificar la propiedad "build.compiler". En el siguiente ejemplo se usa el compilador jikes:
<?xml version="1.0"?>
<project name="pruebas" default="prueba" basedir=".">
<property name="build.compiler" value="jikes"/>
<target name="prueba">
<javac srcdir="fuentes" destdir="clases" classpath="."/>
</target>
</project>
Otros valores de esta propiedad son: classic (javac 1.1 y 1.2), modern (javac 1.3 y 1.4), kjc (del proyecto KOPI), gcj (de GNU), sj (de Symantec), extJava y jvc (de Microsoft).
Algunos de los atributos que admite esta tarea son:
Un ejemplo de uso con todos ellos podría ser:
<?xml version="1.0"?>
<project name="pruebas" default="prueba" basedir=".">
<target name="prueba">
<javac srcdir="fuentes" destdir="clases" classpath="."
verbose="true" debug="true" nowarn="false" deprecation="false"
target="1.2" optimize="true" failonerror="true"/>
</target>
</project>
Existen más atributos, de uso más específico. Además, algunos pueden ser utilizados como elementos internos del elemento javac, en lugar de atributos. Para información
detallada sobre todo ello, se recomienda consultar la documentación oficial de Ant.
La tarea java sirve para ejecutar una aplicación Java. Por defecto, la aplicación se ejecuta en la misma máquina virtual que el propio Ant.
Algunos de los atributos más comunes son:
Es posible indicar argumentos para la clase (o fichero .jar) a ejecutar. Para ello deben utilizarse elementos arg anidados, de la siguiente manera:
<java classname="Prueba" classpath="clases">
<arg value="1"/>
</java>
Este ejemplo es equivalente a ejecutar "javac -claspath clases Prueba 1"
Análogamente, es posible indicar argumentos para la máquina virtual, mediante elementos jvmarg anidados:
<java classname="Prueba" classpath="clases">
<arg value="1"/>
<jvmarg value="-Dprueba.nombre="un nombre"/>
</java>
También es posible determinar el valor de una propiedad de sistema mediante un elemento sysproperty anidado, de la siguiente manera:
<java classname="Pruena" classpath="clases">
<arg value="2"/>
<sysproperty key="prueba.nombre" value="otro nombre"/>
</java>
Las propiedades definidas de esta manera son accesibles desde el código Java, mediante el método System.getProperty(), pasando como parámetro el nombre de la
propiedad ("prueba.nombre" en el ejemplo anterior).
Existen otros atributos y opciones más específicos. Para más detalles se recomienda consultar la documentación oficial de Ant.
La tarea javadoc sirve para generar la documentación de los fuentes en formato Javadoc. La mayor parte de sus atributos se corresponden con opciones del comando
javadoc, por lo que se recomienda consultar la documentación oficial de javadoc.
Un ejemplo de uso bastante completo sería el siguiente:
<javadoc sourcepath="fuentes" classpath="clases" destdir="javadoc"
packagenames="p1.sub1,p1.sub2,p2"
verbose="true" author="true" locale="es_ES"
nodeprecated="true" nodeprecatedlist="true"
private="true" splitindex="true" version="true"
windowtitle="Documentación de mi aplicación"
doctitle="Aplicación"
header="Documentación de mi aplicación"
footer="Una aplicación interesante..."
stylesheet="css/estilos.css"
/>
Algunos de los atributos más comunes de javadoc son:
La tarea copy sirve para copiar ficheros y directorios, igual que cp en Linux o copy en MS-DOS y Windows.
Por defecto, sólo se copian ficheros que sean más recientes que el destino o que sean nuevos.
La forma de indicar qué ficheros hay que copiar es mediante atributos o mediante filesets. Los filesets serán explicados en un artículo posterior. De momento, utilizaremos algunos ejemplos sencillos:
Para copiar un único fichero f, a otro f2:
<copy file="f" tofile="f2"/>
Para copiar un fichero f a un directorio d:
<copy file="f" todir="d"/>
Para copiar un directorio d1 a otro directorio d2:
<copy todir="d2">
<fileset dir="d1"/>
</copy>
Para copiar todos los ficheros .xml a un directorio d:
<copy todir="d">
<fileset dir="." includes="*.xml"/>
</copy>
Los atributos de la tarea copy son:
La tarea delete sirve para eliminar ficheros y directorios, igual que rm en Linux o delete en MS-DOS y Windows.
Algunos ejemplos de uso son:
Para borrar un único fichero f:
<delete file="f"/>
Para borrar un directorio d entero, incluyendo los subdirectorios no vacíos:
<delete dir="d"/>
Para borrar los ficheros .class de un directorio d:
<delete>
<fileset dir="d" includes="*.xml"/>
</delete>
Los atributos de delete son:
La tarea mkdir sirve para crear un directorio.
El único atributo que tiene es dir, con el directorio a crear.
Un ejemplo de uso es:
<mkdir dir="d"/>
La tarea move sirve mover uno o más ficheros o un directorio, a un nuevo directorio, igual que mv en Linux o move en MS-DOS y Windows. Por defecto, si el destino existe, es sobreescrito. Si la sobreescritura se deshabilita, el origen sólo es movido si es más reciente que el destino, o si éste no existe.
Es posible usar filsets para seleccionar conjuntos de ficheros, al igual que con la tarea copy.
Algunos ejemplos de uso son:
Para cambiar de nombre un fichero, de f1 a f2:
<move file="f1" tofile="f2"/>
Para mover un fichero f a un directorio d:
<move file="f" todir="d"/>
Para mover un directorio d1 a otro d2:
<move todir="d2">
<fileset dir="d1"/>
</move>
Para mover todos los ficheros .xml a un directorio d:
<move todir="f">
<fileset dir="." includes="*.xml"/>
</move>
Los atributos de la tarea move son:
La tarea chmod sirve para cambiar los permisos de acceso de los ficheros. Esta tarea sólo tiene efecto en sistemas de ficheros UNIX, similar al comando chmod. Se
recomienda consultar la ayuda del comando chmod (man chmod, info chmod o chmod --help) para más información.
Un ejemplo sencillo de uso es el siguiente, para añadir el permiso de ejecución al propietario y al grupo del fichero:
<chmod file="f" perm="ug+x"/>
Si en lugar de un fichero se indica un directorio, se cambiarán los permisos del directorio pero no los permisos de los ficheros que hay en el mismo.
Para cambiar los mismos permisos de todos los ficheros de un directorio d, usaríamos algo como:
<chmod dir="d" perm="ug+x"/>
o alternativamente
<chmod perm="ug+x">
<fileset dir="d"/>
</chmod>
En el ejemplo anterior no se modifican los permisos del propio directorio (sí los permisos de los ficheros guardados en él).
Los atributos de la tarea chmod son:
La tarea touch sirve para cambiar la fecha y hora de modificación de un fichero. Por defecto, se asigna la fecha y hora actuales. En caso de que el fichero no exista, lo crea.
Un ejemplo de uso es:
<touch file="nuevo.txt"/>
Para indicar una hora concreta, se podría hacer:
<touch datetime="12/31/2001 10:30 AM"/ file="f">
Es posible usar touch sobre un conjunto de ficheros, mediante un elemento fileset anidado. Para cambiar la fecha y hora de todos los ficheros de un directorio d, se usaría algo como:
<touch>
<fileset dir="d"/>
</touch>
Los atributos de touch son:
La tarea echo sirve para mostrar un mensaje en la salida estándar o en un fichero.
Para mostrar un mensaje por pantalla:
<echo message="Mensaje 1"/>
Para guardar un mensaje en un fichero de texto f, que será creado o sobreescrito:
<echo message="Mensaje 2" file="f"/>
Para añadir un mensaje a un fichero f2, creándolo si no existe:
<echo message="Mensaje 3" file="f2" append="true"/>
La tarea sleep sirve para producir un retardo de duración determinada. No se garantiza en absoluto que el retardo tenga la duración indicado, ni siquiera que llegue a producirse, ya que es una prestación que depende del sistema operativo, de la granularidad de su reloj, de la carga del sistema, etc.
El tiempo a esperar se obtiene como la suma de las horas, minutos, segundos y milisegundos indicados. Alguno de estos valores puede ser negativo siempre y cuando la suma total sea positiva.
Para esperar 1 hora, 20 minutos, 35 segundos y 500 milisegundos, usaríamos algo como:
<sleep hours="1" minutes="20" seconds="35" milliseconds="500"/>
Además, es posible utilizar el atributo failonerror para detener la ejecución de ant en caso de que se produzca un error durante la espera.
También es posibe usar sleep sin ningún atributo. En este caso no se produce ninguna espera. Simplemente, Ant cede el procesador a otros procesos del sistema.
La tarea exec sirve para ejecutar comandos de sistema. Es posible indicar un sistema operativo en el que ejecutar el comando. En este caso, el comando sólo se ejecutará si el sistema operativo actual es el indicado.
Un ejemplo muy básico, para listar en formato ancho el contenido de "C:\" en un sistema Windows 2000:
Los atributos más importantes de exec son:
Es posible pasar variables de entorno al comando a ejecutar, de la siguiente manera:
<exec executable="echo">
<arg value="$JAVA_HOME"/>
<env key="JAVA_HOME" value="/usr/local/java"/>
</exec>
|
miércoles, enero 16, 2002 at 1:00AM
Fecha de creación: 15.01.2002
Revisión 1.0.1 (30.01.2003)
Isaac Ruíz
rugi AT javahispano DOT org
|
Una de las operaciones más comunes que tenemos que hacer cuanto trabajamos con números es el darles formato, ya sea con el fin de cumplir con los requerimientos de impresión o simplemente mostrar los datos de una manera más agradable y legible al usuario.
Java proporciona la clase NumberFormat (java.text.NumberFormat para ser mas precisos :p) para realizar este tipo de operaciones; los principales métodos, o por lo menos los más utilizados, de esta clase son: setMinimumIntegetDigits, setMinimumFractionDigits, setMaximumIntegerDigits y setMaximunFractionDigits. Aunque prácticamente con leer los nombres de los métodos nos damos cuenta de la función de cada uno de ellos, es mucho mejor verlos trabajar en un ejemplo.
import java.text.NumberFormat;
public class formato
{
public static void main (String[] argv){
double value = 361.23456789;
/*
Inicio. primeramente con el método getInstance obtenemos
el formato numerico actual.
Por ser NumberFormat una clase abtracta no utilizamos la
palabra clave new
*/
NumberFormat nf = NumberFormat.getInstance();
/*
Datos. Nuestra variable value tiene originalmente 8 digitos en
la parte fraccionaria y 3 digitos en la parte entera.
*/
// Caso 1.
// ¿Qúe pasará si definimos que solo tenga 5, se truncará o
// se redondeará? la respuesta es que se redondeara.
// lo siguiente mostrará: 361.23457
nf.setMaximumFractionDigits(5);
System.out.println(nf.format(value));
// Caso 2.
// ¿Y si le definimos mas digitos fraccionales de los que tiene?
// la respuesta es que muestra el número tal cual.
// lo siguiente mostrará: 361.23456789
nf.setMaximumFractionDigits(10);
System.out.println(nf.format(value));
// Caso 3.
// ¿Y si le definimos menos enteros de los que tiene?
// En este caso el numero sí es truncado.
// lo siguiente mostrará: 61.23456789
nf.setMaximumIntegerDigits(2);
System.out.println(nf.format(value));
// Caso 4
// ¿y en el caso contrario?
// Pues ocurre lo mismo que en el caso 2,
// el numero se muestra tal cual.
// lo siguiente mostrará: 361.23456789
nf.setMaximumIntegerDigits(5);
System.out.println(nf.format(value));
}
}
Sin tanto comentario el código queda de la siguiente manera:
import java.text.NumberFormat;
public class formato
{
public static void main (String[] argv){
double value = 361.23456789;
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(5);
System.out.println(nf.format(value));
nf.setMaximumFractionDigits(10);
System.out.println(nf.format(value));
nf.setMaximumIntegerDigits(2);
System.out.println(nf.format(value));
nf.setMaximumIntegerDigits(5);
System.out.println(nf.format(value));
}
}
La clase NumberFormat es una buena opción para darle formato a tus números, además de los métodos que se acaban de mostrar, cuenta con otros métodos un tanto más especializados para darle un formato mas especifico a los números; ya sea ponerle el separador de miles, determinar el formato númerico del país en donde se ejecutará la aplicación,y otros más.
El objetivo ahora fué sólo mostrarte los métodos más comunes de esta clase y sobre todo el que conozcas su existencia para utilizarla cuando la requieras.
Isaac Ruíz
Isaac Ruíz, RuGI, egresado del ITI (Istmo de Tehuantepec, Oaxaca, Mexico) en la Carrera de Ingeniería en Sistemas Computacionales, es actualmente desarrollador independiente Java con intenciones de realizar el examen de certificación
Cuando no esta programando o navegando (¿?) le gusta mucho leer todo aquello que le de el mas pequeño indicio de como llegar al Valhala o por lo menos a Avalon =:D .