linux - servidores - La resolución de nombres de dominio no funciona en aplicaciones Java en la máquina Ubuntu64 9.04. El resto del software resuelve el DNS correctamente
servidores de aplicaciones para java ee (2)
Tengo varias aplicaciones Java instaladas en una PC Ubuntu64 9.04, y ninguna de ellas puede resolver nombres de dominio (también hay varias JRE, algunas de ellas son productos de IBM). Si pongo el nombre de dominio en el archivo de hosts con su dirección IP asociada, entonces las aplicaciones Java solo funcionan para esos dominios. Todos los demás programas que no son Java, como ping, firefox, etc., funcionan bien con la resolución de dominio. Intenté desactivar el almacenamiento en caché de DNS en el archivo java.security, para todos mis JRE, pero tampoco funcionó. Agradecería ayuda para descifrar esto. ¡Gracias!
ACTUALIZACIÓN: estoy seguro de que no hay un servidor proxy en mi hogar u oficina. - Les agradezco que me hayan ayudado aquí. REALMENTE deseo usar Linux en lugar de Windows ahora que estoy haciendo el desarrollo de Java nuevamente.
jgreenwood@jeg-ubuntu64:~$ cat /etc/resolv.conf
# Generated by NetworkManager
domain hsd1.in.comcast.net.
search hsd1.in.comcast.net.
nameserver 192.168.0.1
jgreenwood@jeg-ubuntu64:~$ env | grep -i proxy
jgreenwood@jeg-ubuntu64:~$ dig google.com
; <<>> DiG 9.5.1-P2 <<>> google.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56845
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 58 IN A 74.125.53.100
google.com. 58 IN A 74.125.45.100
google.com. 58 IN A 74.125.67.100
;; Query time: 35 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Thu Oct 22 13:37:26 2009
;; MSG SIZE rcvd: 76
ACTUALIZACIÓN: escribí este programa de Java en RAD:
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.io.PrintWriter;
import java.io.StringWriter;
public class DomainResolutionTest {
public static void main(String[] args) {
if (args.length == 0) args = new String[] { "www.google.com" };
try {
InetAddress ip = InetAddress.getByName(args[0]);
System.out.println(ip.toString());
}catch (UnknownHostException uhx) {
System.out.println("ERROR: " + uhx.getMessage() + "/n" + getStackTrace(uhx));
Throwable cause = uhx.getCause();
if (cause != null) System.out.println("CAUSE: " + cause.getMessage());
}
}
public static String getStackTrace(Throwable t)
{
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
t.printStackTrace(pw);
pw.flush();
sw.flush();
return sw.toString();
}
}
El resultado es:
ERROR: www.google.com
java.net.UnknownHostException: www.google.com
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:862)
at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1213)
at java.net.InetAddress.getAllByName0(InetAddress.java:1166)
at java.net.InetAddress.getAllByName(InetAddress.java:1096)
at java.net.InetAddress.getAllByName(InetAddress.java:1032)
at java.net.InetAddress.getByName(InetAddress.java:982)
at DomainResolutionTest.main(DomainResolutionTest.java:12)
Desde la línea de comando: (mismo resultado)
jgreenwood@jeg-ubuntu64:~$ javac DomainResolutionTest.java
jgreenwood@jeg-ubuntu64:~$ java DomainResolutionTest
ERROR: www.google.com
java.net.UnknownHostException: www.google.com
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:849)
at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1200)
at java.net.InetAddress.getAllByName0(InetAddress.java:1153)
at java.net.InetAddress.getAllByName(InetAddress.java:1083)
at java.net.InetAddress.getAllByName(InetAddress.java:1019)
at java.net.InetAddress.getByName(InetAddress.java:969)
at DomainResolutionTest.main(DomainResolutionTest.java:12)
jgreenwood@jeg-ubuntu64:~$ java -version
java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Server VM (build 14.2-b01, mixed mode)
jgreenwood@jeg-ubuntu64:~$
Esta solución ( -Djava.net.preferIPv4Stack=true
) también funciona cuando hay una larga ejecución lookupAllHostAddr
.
Una vez más, gracias a la orientación de la gente de aquí, he encontrado una respuesta. El programa anterior de Java funciona cuando hago lo siguiente:
java -Djava.net.preferIPv4Stack=true DomainResolutionTest
Detalles:
jgreenwood@jeg-ubuntu64:~$ java -Djava.net.preferIPv4Stack=true DomainResolutionTest
www.google.com/209.85.225.106
jgreenwood@jeg-ubuntu64:~$ java DomainResolutionTest ERROR: www.google.com
java.net.UnknownHostException: www.google.com
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:849)
at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1200)
at java.net.InetAddress.getAllByName0(InetAddress.java:1153)
at java.net.InetAddress.getAllByName(InetAddress.java:1083)
at java.net.InetAddress.getAllByName(InetAddress.java:1019)
at java.net.InetAddress.getByName(InetAddress.java:969)
at DomainResolutionTest.main(DomainResolutionTest.java:12)
Resulta que hay un error en la pila de IPv6. Hay un par de publicaciones que me llevaron a esta conclusión:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=477211
https://answers.launchpad.net/ubuntu/+question/23024
Espero que no tenga que agregar la basura IPv4 cada vez que ejecuto una aplicación Java. La solución final puede estar en el segundo enlace, un paquete faltante. Veremos.
Registros del informe de Debian Bug - # 477211 ia32-sun-java6-bin: Necesita depender de lib32nss-mdns ... No se pueden resolver los nombres de dominio. Se resuelve bien en el resto del sistema, no se ha probado con otros JDK. Instalado desde el paquete y configurado con update-java-alternatives.
DNS funciona para todo lo demás en mi sistema. Funcionando en Debian 2.6.23-AMD64. He probado tanto paquetes de Lenny como paquetes de Sid. Funciona como se esperaba con sun-java6-bin, falla con ia32-sun-java6-bin. Arg. ... Si aciertas con java, verás que está intentando usar libnss_mdns4_minimal.so.2, que está disponible en el paquete lib32nss-mdns. Debe agregar una dependencia para corregir el error.
Lo mismo ocurre con sun-java6-bin: libnss-mdns se usa aquí.
El paquete de hecho falta en mi máquina:
jgreenwood@jeg-ubuntu64:~$ dpkg -L lib32nss-mdns
Package `lib32nss-mdns'' is not installed.
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.
De cualquier manera, espero que esta publicación ayude a otra persona, porque esta fue una PITA importante para descubrir.