Tal y como indican las notas de la versión de Java 7u51, esas que no solemos leer, hay un cambio en los permisos predeterminados para los sockets. Esto significa que las aplicaciones ya no pueden abrir libremente cualquier socket que deseen por encima del puerto 1024, sino que ahora están restringidos al rango de puertos efímeros ("ephemeral ports" en inglés).
Aunque las notas de la versión sugieren que el cambio no va a afectar a la mayoría de las aplicaciones, la primera bofetada me la he llevado hoy con NetBeans y una base de datos Derby a la que accedo mediante la ventana Services de NetBeans. Donde antes, al intentar arrancar la base de datos, aparecían unas cuantas líneas informativas en la ventana Output sin mayor trascendencia, hoy, tras actualizar a JDK 7u51, aparecía un mensaje de error en esa ventana y un diálogo con una excepción.
El mensaje era "access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")", seguido de la traza completa de la excepción. Hay que quedarse con este dato para poder arreglarlo.
La forma de arreglarlo, para los que como yo no solemos usar un Security Manager, es lanzar la herramienta de políticas, que yo he encontrado en el directorio bin del JDK (también está en el directorio bin del JRE). La herramienta se llama "policytool"; en mi caso, con Linux, la he lanzado mediante "/usr/local/jdk1.7/bin/policytool &".
Esta página tiene una guía sobre el uso de esta herramienta. Los pasos que yo he seguido para el problema concreto de Derby en NetBeans han sido los siguientes:
- Clic en el botón Agregar entrada de política
- Codebase: yo he ido "a lo bruto" y he puesto file:/usr/local/jdk1.7/-. Es decir, estoy dando permiso a todos los archivos class y jar que hay dentro de ese directorio y todos sus subdirectorios ("-" al final). Luego he afinado un poco más y lo he cambiado por "file:/usr/local/jdk1.7/db/lib/*".
- Si el permiso es para todos los archivos class de un directorio (no los JAR), debéis poner la ruta completa terminada en "/" (pero recordad comenzar siempre con file:).
- Si el permiso es para todos los archivos class y JAR de un directorio, debéis poner la ruta completa terminada en "/*".
- Si el permiso es para todos los archivos class y JAR de un directorio y sus subdirectorios, debéis poner la ruta completa terminada en "/-".
- Si el archivo estuviera firmado y tuvierais el alias en vuestro keystore, incluiríais el alias en SignedBy. Para Derby yo no he puesto nada.
- Las entradas de Principal no las he tocado (¿alguien se anima a comentar para qué sirven?). Lo que yo he entendido es que permiten limitar desde que clase llamante se debe invocar la clase a la que damos permisos para que ésta disponga de ellos.
- A continuación hay que pulsar el botón "Agregar permiso". Aparece un diálogo que nos pide cuatro datos:
- El primero es el tipo de permiso y en este momento es cuando tenemos que recordar el mensaje de error. Para Derby, el permiso, recurso o clase que se intentaba usar es java.net.SocketPermission (en el desplegable, simplemente SocketPermission).
- El segundo es el destino y ahí debemos escribir "localhost:1527", como figuraba en el mensaje de error.
- El tercero son las acciones. Es un desplegable con varias opciones y, en este caso, tenemos que añadir dos de ellas que también se mencionaban en el mensaje de error: listen y resolve. Basta con elegir la primera del desplegable, que aparecerá en la casilla de valores, y elegir la segunda otra vez del desplegable, para que la casilla de valores ponga "listen, resolve".
- El último valor, Firmado por, yo lo he dejado en blanco.
- Aceptamos el diálogo de permisos, aceptamos el diálogo de política ("Listo" al pie) y, de vuelta en la ventana principal de la aplicación, elegimos Archivo -> Guardar. Nos pedirá una ubicación y nombre. De acuerdo con la guía de usuario, el nombre de la política por defecto es ".java.policy" y se ubica en el directorio del usuario. En Linux es $HOME, en Windows no sé si será HOMEPATH (y, en Mac, ni idea, lo siento).
Una vez guardado, si volvéis a probar a conectar a la base de datos desde NetBeans, ya no deberíais tener problema. Recordad, si queréis hacer cambios en la política, que debéis grabarla para que surta efecto, no basta con que la veáis modificada en la herramienta de políticas.
Espero que la explicación os resulte útil y os evite algún dolor de cabeza que otro.
Nota: noticia enviada por rickiees