文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

javaのInetAddressのgetCanonicalHostNameはどの値を参照しているか

え、そこ参照してるの?と思いますね絶対。


f:id:treeapps:20180426142529p:plain

javaでサーバのホスト名を取得し、アラートメールの件名にサーバ名を記述したい時、InetAddressのgetCanonicalHostNameを使う場合がありますね。
このgetCanonicalHostNameですが、一体どこの値を参照しているか実はよく解りませんでした。

public static String getHostName() {
    InetAddress inet = null;
    try {
        inet = InetAddress.getLocalHost();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
    return inet.getCanonicalHostName();
}

最初はapacheのServerNameを見ているのか?と思ったが違う。
ではhostname?違う。
ではいったいどこなんだ??と思って色々試してたら解りました。

答えは /etc/hosts でした。

treemacpro:sitemap tree$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain

この場合、getCanonicalHostNameは「localhost」を返します。

treemacpro:sitemap tree$ cat /etc/hosts
127.0.0.1   localhost.localdomain localhost

続いてこの場合は、getCanonicalHostNameは「localhost.localdomain」を返します。
どうやら一番左に記述した値が参照されるようです。

私が試した環境はCentOSです。
macでは/etc/hostsを参照している訳ではなさそう(どこを参照しているか不明)で、
OS毎に違う場所を参照していると思われます。
こういうOS毎に挙動が変わる機能は困りますね。

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)

わかりやすいJavaオブジェクト指向編

わかりやすいJavaオブジェクト指向編

なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング

なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング