域名解析在 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.conf
、env | grep -i proxy
和dig 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的主要内容,如果未能解决你的问题,请参考以下文章