域名解析在 Ubuntu64 9.04 机器上的 Java 应用程序中不起作用。所有其他软件都能正确解析 DNS

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1608503/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 16:41:36  来源:igfitidea点击:

Domain name resolution not working in Java Applications on Ubuntu64 9.04 machine. All other software resolves DNS correctly

linuxdnsjavaubuntu-9.04

提问by komma8.komma1

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!

我在 Ubuntu64 9.04 PC 上安装了许多 Java 应用程序,但没有一个可以解析域名(也有多个 JRE - 其中一些是 IBM 产品)。如果我将域名与其关联的 IP 地址一起放在主机文件中,那么 Java 应用程序仅适用于这些域。所有其他非 Java 程序——比如 ping、firefox 等——都可以很好地处理域解析。我尝试在 java.security 文件中禁用 DNS 缓存 - 对于我的所有 JRE - 但这也不起作用。我将不胜感激帮助解决这个问题。谢谢!



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.

更新:我确定我家或办公室没有代理服务器。- 我很感谢你们在这里帮助我。我真的很想使用 Linux 而不是 Windows 现在我又在做 Java 开发了。

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:

更新:我在 RAD 中编写了这个 java 程序:

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.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.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:~$ 

采纳答案by komma8.komma1

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 程序可以工作:

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

事实证明,IPv6 堆栈中存在错误。有几个帖子让我得出这个结论:

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

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

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

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

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

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.

我当然希望每次运行 Java 应用程序时都不必添加 IPv4 废话。最终的解决方案可能在第二个链接中 - 丢失的包。我们会看到的。

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.

Debian 错误报告日志 - #477211 ia32-sun-java6-bin:需要依赖 lib32nss-mdns ... 无法解析域名。在系统的其余部分解决得很好,没有用其他JDK测试过。从包安装并使用 update-java-alternatives 设置。

DNS 适用于我系统上的所有其他内容。在 Debian 2.6.23-AMD64 上运行。已经尝试过 Lenny 包和 Sid 包。使用 sun-java6-bin 时按预期工作,使用 ia32-sun-java6-bin 时失败。Arg。...如果您使用strace 访问java,您会看到它正在尝试使用libnss_mdns4_minimal.so.2,它在包lib32nss-mdns 中可用。您应该添加对它的依赖来修复错误。

sun-java6-bin 也发生了同样的事情——这里使用了 libnss-mdns。

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.

无论哪种方式,我都希望这篇文章对其他人有所帮助,因为这是一个需要弄清楚的主要 PITA。

回答by jogol

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

此解决方案 ( -Djava.net.preferIPv4Stack=true) 也适用于长时间运行的情况lookupAllHostAddr