Разрешение доменного имени не работает в Java-приложениях на компьютере с Ubuntu64 9.04. Все остальное программное обеспечение корректно разрешает DNS

У меня есть несколько приложений Java, установленных на ПК с Ubuntu64 9.04, и ни одно из них не может разрешать доменные имена (также есть несколько JRE - некоторые из них являются продуктами IBM). Если я помещу доменное имя в файл hosts со связанным с ним IP-адресом, то приложения Java будут работать только для этих доменов. Любая другая программа, отличная от Java, например ping, firefox и т. д., отлично работает с разрешением домена. Я пытался отключить кеширование DNS в файле java.security для всех моих 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:~$ 

person komma8.komma1    schedule 22.10.2009    source источник
comment
В чем ошибка? Вы делаете явный DNS-запрос или просто пытаетесь подключиться к машине по имени? Я думаю, что ваша проблема должна быть связана с окружающей средой или программой, потому что у меня нет такой проблемы в 64-битной Ubuntu 9.04.   -  person Rob H    schedule 22.10.2009
comment
У меня загружены IBM Rational Application Developer и Oracle SQL Developer. Оба используют разные JVM. Однако оба они не будут разрешать DNS-имена. В RAD, который по сути является Eclipse, вы используете URL-адреса для обновления продукта из Интернета. Ни один из них не решает. В то же время, я могу ввести URL-адрес в Firefox, и веб-сайт сразу же появится! В разработчике Oracle SQL у меня такая же проблема. В нашей сети есть сервер, на котором работает Oracle DB. Я могу просто пропинговать доменное имя из командной строки. Однако я могу подключиться к этой базе данных только через IP-адрес. БЕЗУМИЕ!   -  person komma8.komma1    schedule 22.10.2009
comment
Вы пытались использовать InetAddress.getByName? У вас настроен прокси в Firefox? Можете ли вы получить страницы с сервера с помощью wget или curl?   -  person Laurence Gonsalves    schedule 22.10.2009
comment
О, а вы пытались подключиться к этой базе данных Oracle с помощью sqlplus (или какого-либо другого интерактивного инструмента запросов, отличного от Java)?   -  person Laurence Gonsalves    schedule 22.10.2009
comment
Предоставьте результаты cat /etc/resolv.conf, env | grep -i proxy и dig google.com   -  person Pascal Thivent    schedule 22.10.2009
comment
wget, curl и lynx работают нормально — я пишу пример программы на Java для тестирования InetAddress.getByName.   -  person komma8.komma1    schedule 22.10.2009
comment
просто для справки, это связанная ошибка: bugs.openjdk.java.net/browse/ JDK-6991580   -  person Janning    schedule 14.08.2014
comment
Я столкнулся с чем-то похожим на это. В моем случае системный файл dnsapi.dll Windows был поврежден. Запуск sfc /scannow исправил файл и эту проблему.   -  person Holistic Developer    schedule 13.11.2015


Ответы (2)


Еще раз, благодаря руководству людей здесь, я нашел ответ. Приведенная выше 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

Я очень надеюсь, что мне не придется добавлять дерьмо IPv4 каждый раз, когда я запускаю приложение Java. Окончательное решение может быть во второй ссылке - отсутствующий пакет. Мы увидим.

Журналы отчетов об ошибках Debian — #477211 ia32-sun-java6-bin: Должна зависеть от lib32nss-mdns ... Не удается разрешить доменные имена. В остальной части системы все нормально, с другими JDK не тестировалось. Устанавливается из пакета и устанавливается с помощью update-java-alternatives.

DNS работает для всего остального в моей системе. Работает на Debian 2.6.23-AMD64. Пробовали как пакеты Ленни, так и пакеты Сида. Работает должным образом с sun-java6-bin, не работает с ia32-sun-java6-bin. Арг. ... Если вы нажмете на java с помощью strace, вы увидите, что он пытается использовать 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, который нужно было выяснить.

person komma8.komma1    schedule 22.10.2009
comment
просто столкнулся с этой проблемой на этой неделе после обновления моего дистрибутива Linux - спасибо, это работает. Осмотрел все вокруг. - person raphaëλ; 28.12.2011
comment
Что приводит к выводу, что это ошибка IPv6? Это больше похоже на ошибку в Java. - person Niall Donegan; 31.03.2014
comment
Я читал эту и другие подобные статьи — bugs.launchpad.net/ubuntu/+bug/220314. Думаю, я до сих пор не уверен, в чем проблема или была. Я просто хотел это исправить. :) - person komma8.komma1; 24.05.2014
comment
Ты спаситель! Но почему это происходит даже на машине с выключенным IPv6? - person Dmitry Ginzburg; 14.05.2015

Это решение (-Djava.net.preferIPv4Stack=true) также работает при длительном выполнении lookupAllHostAddr.

person jogol    schedule 26.05.2011
comment
Долгий бег как в зависании? Тогда вы могли столкнуться с этой ошибкой JVM: bugs.sun.com/view_bug.do?bug_id =7012768 - person Stefan L; 29.08.2012