2009-10-22 18 views
15

Ich habe eine Reihe von Java-Anwendungen auf einem Ubuntu64 9.04 PC installiert, und keiner von ihnen kann Domänennamen auflösen (es gibt mehrere JRE auch - einige von ihnen sind IBM-Produkte). Wenn ich den Domänennamen in die hosts-Datei mit der zugehörigen IP-Adresse einfüge, funktionieren die Java-Apps nur für diese Domänen. Jedes andere nicht-Java-Programm - wie Ping, Firefox, etc - funktioniert gut mit Domain-Auflösung. Ich habe versucht, DNS-Caching in der Datei java.security zu deaktivieren - für alle meine JREs - aber das hat auch nicht funktioniert. Ich würde mich freuen, wenn ich Ihnen helfen könnte. Vielen Dank!Domain Name Auflösung funktioniert nicht in Java Anwendungen auf Ubuntu64 9.04 Maschine. Alle anderen Software löst DNS korrekt


UPDATE: Ich bin sicher, dass es nicht ein Proxy-Server in meinem Hause oder im Büro ist. - Ich weiß es zu schätzen, dass ihr mir hier hilft. Ich möchte wirklich Linux anstelle von Windows verwenden, jetzt wo ich Java-Entwicklung wieder mache.

[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 

UPDATE: ich dieses Java-Programm in RAD schrieb:

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(); 
    } 

} 

Die Ausgabe lautet:

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) 

in der Befehlszeile: (gleiches Ergebnis)

[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

Was ist der Fehler? Machst du eine explizite DNS-Abfrage oder versuchst du einfach eine Verbindung zu einer Maschine herzustellen? Ich denke, dein Problem muss umwelt- oder programmspezifisch sein, da ich auf 64-bit Ubuntu 9.04 kein Problem habe. –

+0

Ich habe IBM Rational Application Developer und Oracle SQL Developer geladen. Beide verwenden eine andere JVM. Beide lösen jedoch keine DNS-Namen auf. In RAD, das im Grunde Eclipse ist, verwenden Sie URLs, um das Produkt aus dem Web zu aktualisieren. Keiner von ihnen löst. Zur gleichen Zeit kann ich die URL in Firefox setzen und die Webseite erscheint sofort! In Oracle SQL-Entwickler habe ich das gleiche Problem. Es gibt einen Server in unserem Netzwerk, auf dem Oracle DB läuft. Ich kann den Domain-Namen einfach über die Befehlszeile pingen. Ich kann jedoch nur über die IP-Adresse eine Verbindung zu dieser Datenbank herstellen. WAHNSINN! –

+1

Haben Sie versucht, InetAddress.getByName zu verwenden? Hast du einen Proxy in Firefox eingerichtet? Können Sie Seiten mit wget oder curl vom Server abrufen? –

Antwort

24

Noch einmal, dank der Anleitung der Leute hier, habe ich eine Antwort gefunden. Das Java-Programm über funktioniert, wenn ich wie folgt vorgehen:

java -Djava.net.preferIPv4Stack=true DomainResolutionTest 

Details:

[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) 

Es stellt sich heraus, dass es einen Fehler in der IPv6-Stack ist. Es gibt ein paar Stellen, die mich zu dieser Schlussfolgerung geführt:

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

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

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

ich sicher, ich hoffe, die IPv4-Mist nicht in jeder Zeit hinzufügen, muss ich laufen eine Java-App. Die endgültige Lösung kann in der zweiten Verbindung sein - ein fehlendes Paket. Wir werden sehen.

Debian Bug Report-Logs - # 477211 ia32-sun-java6-ist: Muss auf lib32nss-mdns abzuhängen ... Kann nicht Domain-Namen auflösen. Resolve gut auf den Rest des Systems, haben nicht mit anderen JDKs getestet. Installiert aus Paket und mit Update-Java-Alternativen festgelegt.

DNS funktioniert für alles andere auf meinem System. Running on Debian 2.6.23-AMD64. Habe sowohl Lenny-Pakete als auch Sid-Pakete ausprobiert.Funktioniert als erwartet mit sun-java6-bin, schlägt mit ia32-sun-java6-bin. Arg. ... Wenn Sie java mit strace schlagen, sehen Sie , dass es versucht, libnss_mdns4_minimal.so.2 zu verwenden, das im Paket lib32nss-mdns verfügbar ist. Sie sollten eine Abhängigkeit hinzufügen, um den Fehler zu beheben.

Das gleiche passiert für sun-java6-bin - libnss-mdns wird hier verwendet.

Das Paket in der Tat auf meiner Maschine fehlt:

[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. 

So oder so, ich hoffe, dieser Beitrag jemand anderes hilft, weil dies eine große PITA war herauszufinden.

+1

in dieser Woche nur in dieses Problem laufen nach dem Upgrade meiner Linux-Distribution- Danke funktioniert. Sah überall hin. –

+0

Was führt zu der Schlussfolgerung, dass dies ein IPv6-Bug ist? Es scheint eher ein Bug in Java zu sein. –

+0

Ich hatte diesen und andere ähnliche Artikel gelesen - https://bugs.launchpad.net/ubuntu/+bug/220314 Ich denke ich bin mir immer noch nicht sicher, wo das Problem liegt oder war. Ich wollte es nur reparieren. :) –

2

Diese Lösung (-Djava.net.preferIPv4Stack=true) funktioniert auch, wenn lange läuft lookupAllHostAddr.

+0

"Long running" wie hängend? Dann könnten Sie diesen JVM-Fehler gefunden haben: http://bugs.sun.com/view_bug.do?bug_id=7012768 –

+0

Die Bug-URL wurde in http://bugs.java.com/view_bug.do?bug_id=7012768 verschoben – ppeterka