提问者:小点点

在Java8中,如何获取我的主机名而不在我的环境中硬编码它?


我们刚刚在AmazonLinux上升级到Java8。我们正在使用Spring 4.3.8。RELEASE。过去,我们可以通过在应用程序上下文文件中设置bean来获取机器主机名,如下所示…

<bean id="localhostInetAddress" class="java.net.InetAddress" factory-method="getLocalHost" />
<bean id="hostname" factory-bean="localhostInetAddress" factory-method="getHostName" />

但是在Java8中,bean"hostname"现在包含字符串

localhost

在Java8之前,它曾经包含在命令行上运行的“主机名”值,即

[myuser@machine1 ~]$ hostname
machine1.mydomain.org

如何重新配置我们的bean以获取命令行列出的主机名?我不想在任何地方硬编码任何东西。


共3个答案

匿名用户

从InetAddressjava8没有得到主机名:

JDK也有类似的bug。

我的理解是,他们改变了默认的解决过程。

它们在 /etc/nsswitch.conf中尊重配置,其中主机配置为 /etc/hosts,从而使名称解析具有主要优先级。

通常 /etc/hosts有127.0.0.1localhost的记录,为主机提供名称localhost

匿名用户

OpenJDK bug中也有类似的问题

较新的调用尊重localhost的 /etc/nsswitch.conf配置文件。在这台机器上,该文件告诉这些调用在引用其他命名服务之前先查看文件。

由于 /etc/hosts文件包含此主机名/IP组合的显式映射,因此将返回该映射。

在旧JDK中,gethostbyname实际上忽略了本地计算机设置,并立即委托给命名服务。

您始终可以为此使用Runtime类:

Process hostname = Runtime.getRuntime().exec("hostname");

BufferedReader stdInput = new BufferedReader(new
            InputStreamReader(hostname.getInputStream()));
String s;
while ((s = stdInput.readLine()) != null) {
        System.out.println(s);
}

但正如你所见,这不是推荐的

匿名用户

Linux,您可以尝试以下替代方案:

String hostname = new String(Files.readAllBytes(Paths.get("/proc/sys/kernel/hostname")), StandardCharsets.US_ASCII);