さまざまなオペレーティングシステムでサーバーアプリケーション(Javaを記述)をテストしており、OpenSolaris(2008.11)はNice Javaの統合により、最も面倒ではないだろうと思いました。私はUnknownHostExceptionになります
try {
computerName = InetAddress.getLocalHost().getHostName();
if (computerName.indexOf(".") > -1)
computerName = computerName.substring(0,
computerName.indexOf(".")).toUpperCase();
} catch (UnknownHostException e) {
e.printStackTrace();
}
出力は次のとおりです。
Java.net.UnknownHostException: desvearth01: desvearth01
at Java.net.InetAddress.getLocalHost(InetAddress.Java:1353)
しかしながら、 nslookup desvearth01
は正しいIPアドレスを返し、nslookup localhost
返却値 127.0.0.1
予想通り。また、同じコードがFreeBSDでも完全に機能します。 OpenSolarisに気付いていないことはありますか?
ヒントをいただければ幸いです。
良い伝統では、私自身の質問にもう一度答えることができます:
InetAddress.getLocalHost()
は/etc/resolv.confを無視しているように見えますが、/ etc/hostsファイル(localhost以外は何も指定していません)のみを調べているようです。このファイルにIPとホスト名を追加すると問題が解決し、例外はなくなります。
上記の答えはほぼ正しいので、私は上からヒントを得て、私の問題を解決します...ありがとう。
しかし、これを改善するために、段階的な変更を追加しているので、単純なユーザーにも役立ちます。
手順:
/ etc/hostsを開きます。エントリは次のようになります。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
viやgeditなどのエディターで、この行を1行追加する必要があります。 <your-machine-ip> <your-machine-name> localhost
例。
192.168.1.73 my_foo localhost
これで、ファイル全体は次のようになります。
192.168.1.73 my_foo localhost
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
NetworkInterface.getNetworkInterfaces()
がスローされる場合のフォールバックとして InetAddress.getLocalHost()
を使用します UnknownHostException
=。以下にコードを示します(わかりやすくするために例外処理は行いません)。
Enumeration<NetworkInterface> iterNetwork;
Enumeration<InetAddress> iterAddress;
NetworkInterface network;
InetAddress address;
iterNetwork = NetworkInterface.getNetworkInterfaces();
while (iterNetwork.hasMoreElements())
{
network = iterNetwork.nextElement();
if (!network.isUp())
continue;
if (network.isLoopback()) // If I want loopback, I would use "localhost" or "127.0.0.1".
continue;
iterAddress = network.getInetAddresses();
while (iterAddress.hasMoreElements())
{
address = iterAddress.nextElement();
if (address.isAnyLocalAddress())
continue;
if (address.isLoopbackAddress())
continue;
if (address.isMulticastAddress())
continue;
return(address.getHostAddress());
}
}
Solarisでのホストルックアップは/etc/nsswitch.conf
を使用するため、 'hosts:'行の内容に応じて、/etc/hosts
、NIS、DNS、および/またはLDAPを調べる必要があるかどうかを判断します。
ホストとDNSのみを使用する場合は、/etc/nsswitch.conf
にこれがあるはずです。
ホスト:ファイルdns
nslookup desvearth01
が機能する理由は、nslookup
コマンドが/etc/resolv.conf
を直接参照するためです。より良いコマンドラインテストを実行する場合は、次のコマンドを使用します。
getentホストdesvearth01
このエラーは、ワークステーション名を変更してGlassfish 2を起動しようとしたときに表示されます。/etc/hostsのエントリの名前も次のように変更する必要があります。
127.0.0.1 localhost
127.0.1.1 MyNewName
Amazonインスタンスで同じ問題が発生していましたが、デフォルトのDNS構成の問題がありました。だから私はこれらの手順を実行した問題を修正するために-
ホスト名を取得
$hostname
ip-10-122-16-169
ホスト名へのping
$ping ip-10-122-16-169
ping: unknown Host ip-10-122-16-169
cat / etc/hostsファイル、次のようになります
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost6 localhost6.localdomain6
これで、最初の行の最後にホスト名を追加するだけでよいので、追加すると次のようになります
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169
::1 localhost6 localhost6.localdomain6
これで、同じホスト名でpingを再度確認する準備ができました。
$ping ip-10-122-16-169
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=255 time=0.018 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=255 time=0.024 ms
チェックアウト/ etc/hostnameその後、ホスト名をhostsファイルに追加します。
このメッセージが表示される場合は、ホスト名を設定する必要があります[〜#〜] with [〜#〜]hostname superhost.domain
[〜#〜] command [〜#〜]!
この後、どの/etc/hosts
ファイルには次のような文字列が含まれます127.0.0.1 localhost
。
また、コマンドuname -a
は次のようなものを返します。
Linux superhost.domain 2.6.38-8-server#42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
これは好きではありません!!!!
Linux (無し) 2.6.38-8-server#42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
私もこの問題を抱えています。さらにテストする必要がありますが、NetworkInterface.getNetworkInterfaces()
の方が信頼性が高いようです。これはルックアップを行わず、IPを取得するだけだと思います。
getLocalHost()
が失敗したときに、「次善」として使用しています。
別のオプションがこの投稿にあります(実際、ホスト名の/ etc/sysconfig/networkファイルにあるものを... FQDN名に変更することにより、この問題が修正されます)。
Java getLocalHost()UnknownHostException/etc/hostsファイルはlinux apiが異なりますか?