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

Posted

技术标签:

【中文标题】域名解析在 Ubuntu64 9.04 机器上的 Java 应用程序中不起作用。所有其他软件都能正确解析 DNS【英文标题】:Domain name resolution not working in Java Applications on Ubuntu64 9.04 machine. All other software resolves DNS correctly 【发布时间】:2010-12-09 04:09:33 【问题描述】:

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


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

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

更新: 我在 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();
    


输出是:

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)

从命令行:(相同的结果)

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

【问题讨论】:

错误是什么?您是在进行显式 DNS 查询还是只是试图通过名称连接到机器?我认为您的问题一定是环境或程序特定的,因为我在 64 位 Ubuntu 9.04 上没有这样的问题。 我已经加载了 IBM Rational Application Developer 和 Oracle SQL Developer。两者都使用不同的 JVM。但是,它们都不会解析 DNS 名称。在基本上是 Eclipse 的 RAD 中,您使用 URL 从 Web 更新产品。他们都没有解决。但与此同时,我可以将 URL 放入 Firefox 中,然后网站就会立即弹出!在 oracle SQL 开发人员中,我有同样的问题。我们的网络上有一台服务器,上面运行着 Oracle DB。我可以从命令行很好地 ping 域名。但是,我只能通过 IP 地址连接到该数据库。疯狂! 您是否尝试过使用 InetAddress.getByName?您在 Firefox 中设置了代理吗?你可以使用 wget 或 curl 从服务器检索页面吗? 哦,您是否尝试过使用 sqlplus(或其他一些非 Java 交互式查询工具)连接到这个 Oracle 数据库? 请提供cat /etc/resolv.confenv | grep -i proxydig google.com的输出 【参考方案1】:

再次感谢这里的人的指导,我找到了答案。当我执行以下操作时,上面的 Java 程序可以工作:

java -Djava.net.preferIPv4Stack=true DomainResolutionTest

详情:

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)

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

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

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

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

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

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

DNS 适用于我的所有其他设备 系统。在 Debian 上运行 2.6.23-AMD64。 Lenny 包和 Sid 包都试过了。作为 预期与 sun-java6-bin 一起使用,失败 使用 ia32-sun-java6-bin。精氨酸。 ... 如果 你用 strace 打 java 你会看到 它正在尝试使用 libnss_mdns4_minimal.so.2,即 包中可用 lib32nss-mdns。你应该添加一个 依赖它来修复错误。

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

我的机器上确实缺少这个包:

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.

无论如何,我希望这篇文章对其他人有所帮助,因为这是一个需要解决的主要 PITA。

【讨论】:

这周在升级我的 linux 发行版后遇到了这个问题——感谢这个工作。到处找。 是什么导致得出这是一个 IPv6 错误的结论?它看起来更像是 Java 中的一个错误。 我已经阅读了这篇文章和其他类似的文章 - bugs.launchpad.net/ubuntu/+bug/220314 我想我仍然不确定问题出在哪里。我只是想修复它。 :) 你是救世主!但是为什么即使在关闭 IPv6 的机器上也会发生这种情况呢?【参考方案2】:

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

【讨论】:

“长时间运行”如挂起?那么你可能遇到了这个 JVM 错误:bugs.sun.com/view_bug.do?bug_id=7012768

以上是关于域名解析在 Ubuntu64 9.04 机器上的 Java 应用程序中不起作用。所有其他软件都能正确解析 DNS的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu 9.04 迅雷

ubuntu 9.04 怎么搜索文件

ubuntu 9.04怎样开启桌面效果

ubuntu 9.04安装大问题 20分求

(30分)如何卸载Ubuntu 9.04

ubuntu 9.04版本如何安装触摸屏驱动