2009-10-22 38 views
15

Tôi có một số ứng dụng Java được cài đặt trên Ubuntu64 9.04 PC và không ai trong số họ có thể phân giải tên miền (có nhiều JRE - một số trong số đó là các sản phẩm của IBM). Nếu tôi đặt tên miền trong tệp máy chủ với địa chỉ IP được liên kết, thì các ứng dụng Java chỉ hoạt động cho các miền đó. Mọi chương trình không phải Java khác - như ping, firefox, v.v. - hoạt động tốt với độ phân giải miền. Tôi đã cố gắng để vô hiệu hóa bộ nhớ đệm DNS trong tệp java.security - cho tất cả các JRE của tôi - nhưng điều đó cũng không hoạt động. Tôi sẽ đánh giá cao một số trợ giúp trong việc tìm ra điều này. Cảm ơn!Độ phân giải tên miền không hoạt động trong Java Ứng dụng trên máy Ubuntu64 9.04. Tất cả các phần mềm khác phân giải DNS chính xác


UPDATE: Tôi chắc chắn có không phải là một máy chủ proxy trong nhà hoặc văn phòng của tôi. - Tôi đánh giá cao các bạn giúp tôi ở đây. Tôi thực sự muốn sử dụng Linux thay vì cửa sổ bây giờ mà tôi đang làm phát triển Java một lần nữa.

[email protected]:~$ cat /etc/resolv.conf 
# Generated by NetworkManager 
domain hsd1.in.comcast.net. 
search hsd1.in.comcast.net. 
nameserver 192.168.0.1 
[email protected]:~$ env | grep -i proxy 
[email protected]:~$ 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: tôi đã viết chương trình java này trong 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(); 
    } 

} 

Đầu ra là:

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) 

Từ dòng lệnh: (kết quả tương tự)

[email protected]:~$ javac DomainResolutionTest.java 
[email protected]:~$ 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) 
[email protected]:~$ 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) 
[email protected]:~$ 
+0

Lỗi là gì? Bạn đang thực hiện truy vấn DNS rõ ràng hay chỉ cố gắng tạo kết nối với máy theo tên? Tôi nghĩ rằng vấn đề của bạn phải là môi trường hoặc chương trình cụ thể bởi vì tôi không có vấn đề như vậy trên Ubuntu 9,04 64-bit. –

+0

Tôi có Nhà phát triển ứng dụng Rational của IBM và Nhà phát triển Oracle SQL được tải. Cả hai đều sử dụng một JVM khác. Tuy nhiên, cả hai sẽ không phân giải tên DNS. Trong RAD, về cơ bản là Eclipse, bạn sử dụng URL để cập nhật sản phẩm từ web. Không ai trong số họ giải quyết. Đồng thời, mặc dù tôi có thể đặt URL trong Firefox và trang web hiện lên ngay! Trong nhà phát triển oracle SQL, tôi có cùng một vấn đề. Có một máy chủ trên mạng của chúng tôi với Oracle DB chạy trên nó. Tôi có thể ping tên miền chỉ tốt từ dòng lệnh. Tuy nhiên, tôi chỉ có thể kết nối với cơ sở dữ liệu đó thông qua địa chỉ IP. CHỨNG ĐIÊN CUỒNG! –

+1

Bạn đã thử sử dụng InetAddress.getByName chưa? Bạn có thiết lập proxy trong Firefox không? Bạn có thể truy xuất các trang từ máy chủ bằng wget hoặc curl không? –

Trả lời

24

Một lần nữa, nhờ sự hướng dẫn của mọi người ở đây, tôi đã tìm thấy câu trả lời. Các chương trình Java trên hoạt động khi tôi làm như sau:

java -Djava.net.preferIPv4Stack=true DomainResolutionTest 

chi tiết:

[email protected]:~$ java -Djava.net.preferIPv4Stack=true DomainResolutionTest 
www.google.com/209.85.225.106 
[email protected]:~$ 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) 

Nó chỉ ra rằng có một lỗi trong ngăn xếp IPv6. Có một vài bài viết mà dẫn tôi đến kết luận này:

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

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

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

Tôi chắc chắn hy vọng tôi không cần phải thêm các crap IPv4 trong mỗi khi tôi chạy một ứng dụng Java. Giải pháp cuối cùng có thể nằm trong liên kết thứ hai - một gói bị thiếu. Chúng ta sẽ thấy.

Debian Báo cáo lỗi các bản ghi - # 477.211 ia32-sun-java6-bin: Nhu cầu phụ thuộc vào lib32nss-mDNS ... Không thể phân giải tên miền. Giải quyết tốt trên phần còn lại của hệ thống, có không được thử nghiệm với các JDK khác. Được cài đặt từ gói và được đặt với cập nhật-java-lựa chọn thay thế.

DNS hoạt động cho mọi thứ khác trên hệ thống của tôi. Chạy trên Debian 2.6.23-AMD64. Đã thử cả gói Lenny và gói Sid.Hoạt động như dự kiến ​​với sun-java6-bin, không hoạt động với ia32-sun-java6-bin. Arg. ... Nếu bạn nhấn java với strace bạn sẽ thấy rằng nó đang cố gắng sử dụng libnss_mdns4_minimal.so.2, là có sẵn trong gói lib32nss-mdns. Bạn nên thêm phụ thuộc vào đó để khắc phục lỗi.

Điều tương tự cũng xảy ra với sun-java6-bin - libnss-mdns được sử dụng tại đây.

Các gói phần mềm thực sự là mất tích trên máy tính của tôi:

[email protected]:~$ 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. 

Dù bằng cách nào, tôi hy vọng bài viết này sẽ giúp người khác, bởi vì đây là một Pita lớn để tìm ra.

+1

chỉ cần chạy vào vấn đề này trong tuần này sau khi nâng cấp distro linux của tôi nhờ công trình này. Nhìn khắp nơi. –

+0

Điều gì dẫn đến kết luận rằng đây là lỗi IPv6? Nó có vẻ giống như một lỗi trong Java. –

+0

Tôi đã đọc bài viết này và các bài viết tương tự khác - https://bugs.launchpad.net/ubuntu/+bug/220314 Tôi đoán tôi vẫn chưa thực sự chắc chắn vấn đề ở đâu hoặc đã xảy ra. Tôi chỉ muốn sửa nó. :) –

2

Giải pháp này (-Djava.net.preferIPv4Stack=true) cũng hoạt động khi có thời gian chạy dài lookupAllHostAddr.

+0

"Chạy dài" như đang treo? Sau đó, bạn có thể đã gặp lỗi JVM này: http://bugs.sun.com/view_bug.do?bug_id=7012768 –

+0

URL lỗi đã chuyển đến http://bugs.java.com/view_bug.do?bug_id=7012768 – ppeterka

Các vấn đề liên quan