16

I have an number of Java applications installed on an Ubuntu64 9.04 PC, and none of them can resolve domain names (there are multiple JRE's too - some of them are IBM products). If I put the domain name in the hosts file with it's associated IP address, then the Java apps work for those domains only. Every other non Java program - like ping, firefox, etc - work just fine with domain resolution. I've tried to disable DNS caching in the java.security file - for all of my JREs - but that didn't work either. I would appreciate some help in figuring this one out. Thanks!


UPDATE: I am sure there isn't a proxy server in my home or office. - I appreciate you guys helping me here. I REALLY want to use Linux instead of windows now that I'm doing Java development again.

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

UPDATE: I wrote this java program in 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();
    }

}

The output is:

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)

From the command line: (same result)

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:~$ 
komma8.komma1
  • 1,250
  • 2
  • 14
  • 20
  • What is the error? Are you making an explicit DNS query or just trying to make a connection to a machine by name? I think your problem must be environmental or program-specific because I have no such problem on 64-bit Ubuntu 9.04. – Rob H Oct 22 '09 at 16:56
  • I have IBM Rational Application Developer, and Oracle SQL Developer loaded. Both use a different JVM. However, both of them will not resololve DNS names. In RAD, which is basically Eclipse, you use URLs to update the product from the web. None of them resolve. At the same time though, I can put the URL in Firefox and the website pops right up! In oracle SQL developer, I have the same problem. There is a server on our network with Oracle DB running on it. I can ping the domain name just fine from the command line. However, I can only connect to that database through the IP address. INSANITY! – komma8.komma1 Oct 22 '09 at 17:01
  • 1
    Have you tried using InetAddress.getByName? Do you have a proxy set up in Firefox? Can you retrieve pages from the server using wget or curl? – Laurence Gonsalves Oct 22 '09 at 17:11
  • Oh, and have you tried connecting to this Oracle DB using sqlplus (or some other non-Java interactive query tool)? – Laurence Gonsalves Oct 22 '09 at 17:12
  • 1
    Please provide the outputs of `cat /etc/resolv.conf`, `env | grep -i proxy` and `dig google.com` – Pascal Thivent Oct 22 '09 at 17:31
  • wget, curl, and lynx all work fine - I'm writing a sample Java program to test InetAddress.getByName. – komma8.komma1 Oct 22 '09 at 17:51
  • just for reference, this is a related bug: https://bugs.openjdk.java.net/browse/JDK-6991580 – Janning Vygen Aug 14 '14 at 10:15
  • I ran into something similar to this. In my case, the `dnsapi.dll` Windows system file was corrupted. Running `sfc /scannow` fixed the file and this issue. – Holistic Developer Nov 13 '15 at 20:22

2 Answers2

25

Once again, thanks to the guidance of the people here, I've found an answer. The Java program above works when I do the following:

java -Djava.net.preferIPv4Stack=true DomainResolutionTest

Details:

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)

It turns out that there is a bug in the IPv6 stack. There are a couple of posts that led me to this conclusion:

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

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

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

I sure hope I don't have to add the IPv4 crap in every time I run a Java app. The final solution may be in the second link - a missing package. We shall see.

Debian Bug report logs - #477211 ia32-sun-java6-bin: Needs to depend on lib32nss-mdns ... Cannot resolve domain names. Resolve fine on the rest of the system, have not tested with other JDK's. Installed from package and set with update-java-alternatives.

DNS works for everything else on my system. Running on Debian 2.6.23-AMD64. Have tried both Lenny packages and Sid packages. Works as expected with sun-java6-bin, fails with ia32-sun-java6-bin. Arg. ... If you hit java with strace you'll see that it is trying to use libnss_mdns4_minimal.so.2, which is available in the package lib32nss-mdns. You should add a dependency on that to fix the bug.

Same thing happens for sun-java6-bin - libnss-mdns is used here.

The package is indeed missing on my machine:

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.

Either way, I hope this post helps someone else, because this was a major PITA to figure out.

komma8.komma1
  • 1,250
  • 2
  • 14
  • 20
2

This solution (-Djava.net.preferIPv4Stack=true) also works when there is long runing lookupAllHostAddr.

Dmitry Ginzburg
  • 7,391
  • 2
  • 37
  • 48
jogol
  • 21
  • 1
  • "Long running" as in hanging? Then you might have hit this JVM bug: http://bugs.sun.com/view_bug.do?bug_id=7012768 – Stefan L Aug 29 '12 at 07:25