为什么InetAddress.getLocalHost().getHostName()返回的值与bash“hostname”不同?

2022-09-03 13:36:49

我有一个 build.gradle 任务,它就像我的开发框中的冠军一样,在生成一个属性文件时,该文件记录了生成生成的计算机的名称。逻辑很简单...

def hostname = InetAddress.getLocalHost().getHostName();

在我的开发盒上,这总是产生与我从bash shell中创建主机名相同的值。

bobk-mbp:DM_Server bobk$ hostname
bobk-mbp.local

然而,在我们的 jenkins CI 服务器上,bash hostname 返回了一件事,但是我对 InetAddress.getLocalHost().getHostName() 的调用;返回其他内容。在 jenkins 机器上需要更改哪些内容才能使这两个返回相同的值?


答案 1

假设您使用的是 linux,从 o/s 执行的 hostname 命令将返回内核配置的主机名。

InetAddress.getHostName() 正在使用 O/S 中配置的命名服务 (DNS) 对服务器的 IP 地址执行反向查找。

如果您需要 o/s 所理解的主机名,则通过 System.getenv 从环境变量获取它可能是最简单的选择。这不是一种完全可靠的方法,但可能就足够了,而无需深入研究网络或系统管理。


答案 2

来自 InetAddress.getHostName() 的 API 文档;

如果此 InetAddress 是使用主机名创建的,则将记住并返回此主机名;否则,将执行反向名称查找,并将根据系统配置的名称查找服务返回结果。如果需要查找名称服务,请调用 getCanonicalHostName。

因此,您可能需要在 Jenkins 服务器上配置 DNS。最简单的方法是编辑 /etc/hosts(我假设你的 Jenkins 在 Linux 上运行),并确保它看起来像这样:

127.0.0.1           localhost       localhost.localdomain
<public IP address> <hostname>      <hostname>.<domain>

推荐