我们刚刚在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以获取命令行列出的主机名?我不想在任何地方硬编码任何东西。
从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);