2009-10-22 13 views
15

Tengo una serie de 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!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


ACTUALIZACIÓN: Estoy seguro de que no es un servidor proxy en mi casa 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.

[email protected]:~$ cat /etc/resolv.conf 
# Generated by NetworkManager 
domain hsd1.in.comcast.net. 
search hsd1.in.comcast.net. 
nameserver 192.168.0.1 
[email protected]:~$ env | grep -i proxy 
[email protected]:~$ 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 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(); 
    } 

} 

La salida 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 comandos: (mismo resultado)

[email protected]:~$ javac DomainResolutionTest.java 
[email protected]:~$ 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) 
[email protected]:~$ 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) 
[email protected]:~$ 
+0

¿Cuál es el error? ¿Estás haciendo una consulta DNS explícita o simplemente tratando de hacer una conexión a una máquina por su nombre? Creo que su problema debe ser ambiental o específico del programa porque no tengo ese problema en Ubuntu 9.04 de 64 bits. –

+0

Tengo IBM Rational Application Developer y Oracle SQL Developer cargado. Ambos usan una JVM diferente. Sin embargo, ninguno de los dos resolverá nombres DNS. En RAD, que es básicamente Eclipse, usa URL para actualizar el producto desde la web. Ninguno de ellos resuelve. ¡Al mismo tiempo, sin embargo, puedo poner la URL en Firefox y el sitio web aparece al instante! En el desarrollador de Oracle Oracle, tengo el mismo problema. Hay un servidor en nuestra red con Oracle DB ejecutándose en él. Puedo hacer ping al nombre de dominio desde la línea de comando. Sin embargo, solo puedo conectarme a esa base de datos a través de la dirección IP. ¡LOCURA! –

+1

¿Ha intentado usar InetAddress.getByName? ¿Tienes un proxy configurado en Firefox? ¿Puedes recuperar páginas del servidor usando wget o curl? –

Respuesta

24

Una vez más, gracias a la orientación de la gente de aquí, he encontrado una respuesta. El programa Java anterior funciona cuando lo haga lo siguiente:

java -Djava.net.preferIPv4Stack=true DomainResolutionTest 

Detalles:

[email protected]:~$ java -Djava.net.preferIPv4Stack=true DomainResolutionTest 
www.google.com/209.85.225.106 
[email protected]:~$ 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 IPv6. Hay un par de mensajes que me han llevado a esta conclusión:

http://uclue.com/?xq=2127

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=477211

https://answers.launchpad.net/ubuntu/+question/23024

Seguro espero no tener que añadir la basura en IPv4 cada vez que ejecute una aplicación de Java. La solución final puede estar en el segundo enlace, un paquete faltante. Veremos.

Debian registros de informes de errores - # 477211 IA32-sol-java6-bin: Needs a depender de lib32nss-mdns ... no puede resolver nombres de dominio. Resuelva bien en el resto del sistema, tenga no probado con otros JDK. instalado desde el paquete y configurado con update-java-alternatives.

El DNS funciona para todo lo demás en mi sistema . Corriendo en Debian 2.6.23-AMD64. He probado tanto paquetes de Lenny como paquetes de Sid.Funciona como esperado con sun-java6-bin, falla con ia32-sun-java6-bin. Arg. ... Si golpeas java con strace verás que está tratando de usar libnss_mdns4_minimal.so.2, que es disponible en el paquete lib32nss-mdns. Debe agregar una dependencia para corregir el error.

Lo mismo ocurre con sun-java6-bin - libnss-mdns se utiliza aquí.

El paquete está hecho falta en mi máquina:

[email protected]:~$ 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 este post ayuda a otra persona, ya que este fue un importante PITA de averiguar.

+1

acabo de toparme con este problema esta semana después de actualizar mi distribución de Linux, gracias a esto funciona. Miró por todo el lugar. –

+0

¿Qué lleva a la conclusión de que esto es un error de IPv6? Parece más un error en Java. –

+0

Había leído esto y otros artículos similares - https://bugs.launchpad.net/ubuntu/+bug/220314 Creo que todavía no estoy seguro de dónde está o estaba el problema. Solo quería arreglarlo. :) –

2

Esta solución (-Djava.net.preferIPv4Stack=true) también funciona cuando hay mucho run run lookupAllHostAddr.

+0

"Larga ejecución" como en colgar? Entonces, es posible que haya pulsado este error de JVM: http://bugs.sun.com/view_bug.do?bug_id=7012768 –

+0

La URL de los errores se ha movido a http://bugs.java.com/view_bug.do?bug_id=7012768 – ppeterka

Cuestiones relacionadas