kom*_*ma1 16 java linux dns ubuntu-9.04
我在Ubuntu64 9.04 PC上安装了许多Java应用程序,但没有一个可以解析域名(也有多个JRE - 其中一些是IBM产品).如果我将域名与其关联的IP地址放在hosts文件中,那么Java应用程序仅适用于这些域.所有其他非Java程序 - 如ping,firefox等 - 在域解析时工作得很好.我试图在java.security文件中禁用DNS缓存 - 对于我的所有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
Run Code Online (Sandbox Code Playgroud)
更新:我在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();
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
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)
Run Code Online (Sandbox Code Playgroud)
从命令行:(相同的结果)
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:~$
Run Code Online (Sandbox Code Playgroud)
kom*_*ma1 24
再次,感谢这里的人们的指导,我找到了答案.上面的Java程序在我执行以下操作时起作用:
java -Djava.net.preferIPv4Stack=true DomainResolutionTest
Run Code Online (Sandbox Code Playgroud)
细节:
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)
Run Code Online (Sandbox Code Playgroud)
事实证明,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,你会发现它正在尝试使用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.
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,我希望这篇文章可以帮助其他人,因为这是一个重要的PITA.