He encontrado un artículo muy interesante que trata sobre los 10 errores más comunes (o 10 cosas que deberías saber) cuando desarrollas bajo Windows, pero tu aplicación va a correr sobre Linux/Unix. El artículo original está aquí en Javalobby. Como está en ingles pero me parece muy útil, he decido hacer un resumen un poco libre y en castellano sobre los puntos que trata.
En este post van los 5 primeras, mañana o pasado publicaré los 5 siguientes:
10 cosas que un programador Java debería saber
10 Uso especial de puertos
En unix, solo el usuario root puede abrir puertos por debajo de 1024. En Windows cualquiera puede hacerlo. Si tu aplicación usa un puerto por debajo de 1024 piensa que en Unix solo funcionará si el proceso corre como root.
9 No hay bloqueo mágico de ficheros
Windows protege automáticamente contra escritura los ficheros abiertos, pero en Unix no: tu puedes estar leyendo un fichero y otra aplicación/hilo puede borrarlo.
El siguiente código falla en Windows (protegiendo el fichero), pero en Unix no falla y el fichero es eliminado.
// Se abre el fichero
InputStream is = new FileInputStream("foo.txt");
// Se borra el fichero: en Windows falla, en Unix no
(new File("foo.txt")).delete();
// Intentamos leer el fichero
// En Windows nunca llegamos hasta aquí, pero en Unix
// el contenido del mismo ya ha sido borrado
int ch;
while( (ch = is.read()) > 0 )
System.out.println( "char: " + (char)ch );
is.close();
8 A veces no hay interfaz
En Unix no siempre hay interfaz, ya sea gráfica o de consola. Y a veces no hay ni consola, puede ser que la máquina sea un servidor que no tenga pantalla, ni teclado, ni ratón, ni nada. Tu aplicación puede ser un simple proceso lanzado en background por un cron por ejemplo. Si la salida estándar no está redirigida a un fichero (para hacerlo, utiliza el método setOut de la clase System), puede que tus System.out.print() se pierdan para siempre.
Utiliza siempre un sistema de logs que escriban a fichero tus trazas.
Otra cosa: aunque no uses AWT directamente (por ejemplo, en una aplicación J2EE) puede ser que utilices sin querer la interfaz gráfica del sistema al manipular imágenes con el Api AWT del JDK (por ejemplo, al cambiar el tamaño de imágenes). Si tu Unix/Linux no tiene unas X, fallará. La solución a esto consiste en utiliza el parámetro -Djava.awt.headless=true en el arranque de tu máquina virtual.
Más información: JDK 1.4.2 AWT Changes, Mindprod glossary: Headless
7 En unix no hay registro
Unix no tiene un lugar central donde almacenar toda la configuración del sistema. En su lugar, utiliza ficheros en texto plano repartidos en diversos directorios (/etc/* la mayoría).
Si usas el registro de Windows para localizar información del sistema, intenta averiguar su equivalente en Unix. Piensa que incluso será más comodo leer un texto plano que tener que acceder al registro.
6 Barras invertidas
En Windows, el separador de directorios es "\" (backslash), por ejemplo: C:\Archivos de Programa\Mola
Pero en Unix el backslash es el carácter de escape, así que el separador de directorios es "/" (slash), por ejemplo: /etc/passwd.
Lo bueno es que Windows admite los dos separadores, mientras que Unix no, por lo que tiene fácil solución: usar siempre "/" (slash)
Si has utilizado en tu código y ficheros de configuración el separador de carpetas "\", puedes cambiarlo tranquilamente por "/" para que funcionen en Unix y seguirán funcionando también en Windows.
Si por alguna razón necesitas saber en tiempo de ejecución que separador utilizar, siempre puedes utilizar la constante java.io.File.separatorChar
IMPORTANTE: el artículo original tiene una errata y dice que la constante a utilizar es java.io.File.pathSeparatorChar, confundir estas dos constantes también es un gran error muy común: pathSeparatorChar es el separador para los elementos del CLASSPATH y no para los directorio. Valdrá ":" para Unix y ";" en Windows, que no es lo mismo que separatorChar.