Разрешение имен доменов не работает в Java-приложениях на машине Ubuntu64 9.04. Все другое программное обеспечение правильно разрешает DNS
У меня на компьютере Ubuntu64 9.04 установлено несколько приложений Java, и ни один из них не может разрешать имена доменов (также есть несколько JRE - некоторые из них - продукты IBM). Если я помещаю имя домена в файл hosts с его ассоциированным IP-адресом, то приложения Java работают только для этих доменов. Каждая другая не-Java-программа, такая как ping, firefox и т.д., Отлично работает с разрешением домена. Я попытался отключить кэширование DNS в файле java.security - для всех моих JRE - но это тоже не сработало. Я был бы признателен за помощь в этом. Спасибо!
UPDATE:
Я уверен, что в моем доме или офисе нет прокси-сервера. - Я ценю, что вы, ребята, помогаете мне здесь. Я ДЕЙСТВИТЕЛЬНО хочу использовать Linux вместо окон, теперь я снова занимаюсь разработкой Java.
[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:
Я написал эту 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)
Из командной строки: (тот же результат)
[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]:~$
Ответы
Ответ 1
Еще раз, благодаря руководству людей здесь, я нашел ответ. Программа Java выше работает, когда я делаю следующее:
java -Djava.net.preferIPv4Stack=true DomainResolutionTest
Подробнее:
[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)
Оказывается, в стеке IPv6 есть ошибка. Есть несколько сообщений, которые привели меня к такому выводу:
http://uclue.com/?xq=2127
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=477211
https://answers.launchpad.net/ubuntu/+question/23024
Я уверен, что мне не нужно добавлять дерьмо IPv4 каждый раз, когда я запускаю Java-приложение. Окончательное решение может быть во втором звене - недостающем пакете. Мы увидим.
Журналы отчетов об ошибках Debian - # 477211 ia32-sun-java6-bin: нужно зависеть от lib32nss-MDNS... Не удается разрешить имена доменов. Разрешить штраф на остальную часть системы, не тестировались с другими JDK. Установлен из упаковки и установлен с обновить-Java-альтернативы.
DNS работает для всего остального на моем система. Запуск на Debian 2.6.23-AMD64. Попробовали оба пакета Lenny и пакеты Sid. Работает как ожидаемый с sun-java6-bin, не работает с ia32-sun-java6-bin. Arg.... Если вы попадаете в java с strace, вы увидите что он пытается использовать libnss_mdns4_minimal.so.2, который доступно в пакете lib32nss-MDNS. Вы должны добавить зависимость от этого, чтобы исправить ошибку.
То же самое происходит и для sun-java6-bin - Здесь используется libnss-mdns.
Пакет действительно отсутствует на моей машине:
[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.
В любом случае, я надеюсь, что этот пост поможет кому-то другому, потому что это был важный PITA, чтобы понять.
Ответ 2
Это решение (-Djava.net.preferIPv4Stack=true
) также работает при длительном запуске lookupAllHostAddr
.