我在Ubuntu644.04 PC上安装了一些Java应用程序,它们都不能parsing域名(也有多个JRE,其中一些是IBM产品)。 如果我将域名放在hosts文件中,并且与相关的IP地址相关联,那么Java应用程序仅适用于这些域。 其他非Java程序 – 比如ping,firefox等 – 在域parsing方面工作得很好。 我已经尝试禁用java.security文件中的DNScaching – 对于我的所有JRE,但是这也不起作用。 我希望得到一些帮助,找出这一个。 谢谢!
更新:我相信在我的家或办公室没有代理服务器。 – 我很感谢你们帮助我。 我现在真的想要使用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
更新:我写了这个Java程序在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(); } }
输出是:
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:~$
再次感谢这里的人们的指导,我找到了答案。 上面的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://bugs.debian.org/cgi-bin/bugreport.cgi?bug=477211
https://answers.launchpad.net/ubuntu/+question/23024
我当然希望在每次运行Java应用程序时都不必添加IPv4垃圾。 最终的解决方案可能在第二个环节 – 缺少一个包装。 我们将会看到。
Debian Bug报告日志 – #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。 精氨酸。 …如果你用strace命中java,你会发现它正在试图使用lib32nss-mdns包中的libnss_mdns4_minimal.so.2。 你应该添加一个依赖关系来修复这个bug。
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.
无论哪种方式,我希望这个职位帮助别人,因为这是一个重要的皮塔饼搞清楚。
这个解决方案( -Djava.net.preferIPv4Stack=true
)也适用于长时间运行lookupAllHostAddr
。