使用Java获取主机名在最新的JDK7中失败

10

我一直是这样获取计算机主机名的:

InetAddress.getLocalHost().getHostName();

然而,当我使用最新的JDK (jdk1.7.0_04) 时,上面的代码只返回LOCALHOST。我检查了/etc/hosts(它是Linux),发现其中写着:

127.0.0.1    localhost    redbull

在升级之前,它一直返回REDBULL。因此,我进行了更改。

127.0.0.1    redbull    localhost

我尝试了使用 instead替换了之前的方法,这样就能成功返回 REDBULL 了。有没有更好的方法可以让它正常工作?

4个回答

3

嗯,我考虑将此标记为重复,但我发现的唯一答案建议您使用InetAddress.getLocalHost().getHostName()。老实说,在这种情况下,我认为它应该返回“localhost”。那些答案,我想,是正确的,因为没有纯Java方法可以做到这一点(至少对于旧版JRE来说没有)。

我们使用JNI来完成这个任务。在Mac OS 10.4+上,我们调用SCPreferencesGetHostName(),在较旧的Mac OS上,调用SCDynamicStoreCopyLocalHostName(),在Win32上调用GetComputerName(),在其他地方调用gethostname()

当然,您可以简单地在Unix机器上调用/bin/hostname或查看Windows上的环境变量COMPUTERNAME。这有点主观,取决于您是否更喜欢调用JNI还是执行另一个程序。

值得一提的是,我们不在Mac OS上调用gethostname(),因为Mac会执行奇怪的动态主机名操作,其中gethostname()将返回您的主要以太网设备的反向DNS。如果我直接将我的Mac插入我的电缆调制解调器中,我将获得一个名为customer-10-42-21-42或我的电缆提供商在其DNS中设置为我的PTR记录的任何内容。相反,转到首选项将为您提供由用户确定的稳定主机名。


是的,这看起来像是一个重复的问题,但仔细一看就不是了。我也同意它应该返回LOCALHOST。然而,在所有以前的JDK版本中,它从来没有这样做过,因此在这一点上“纠正”逻辑似乎是违反直觉的。对于我来说,使用JNI来获取像主机名这样简单的东西似乎有些过度杀手锏。除非有人有更好的解决方案或JDK提供了更标准的东西,否则我将在这个问题上使用我的“解决方法”。 - Daniil
我倾向于同意。部署JNI虽然肯定是众所周知的,但它会给您的构建和部署过程增加另一层复杂性。如果这是您唯一需要的JNI?可能确实有些过度了。奇怪的是他们为什么要更改这个,Java团队倾向于将看似重大的错误标记为“按设计”,以保持向后兼容性。 - Edward Thomson

3
如果您不反对使用来自maven中央仓库的外部依赖,我写了gethostname4j来解决这个问题。它只是使用JNA调用libc的gethostname函数(或在Windows上获取计算机名称),并将其作为字符串返回给您。

https://github.com/mattsheppard/gethostname4j

@edward-thomson上面的回答让我想到,我可能需要做更多的工作才能使它在MacOS上运行良好 :)


2

我曾经遇到过同样的问题,当以下所有内容都对齐时,它才能正常工作。主机名必须附加上“DOT local”。

$ scutil --get HostName
drums
$ scutil --get LocalHostName
drums
$ scutil --get ComputerName
drums

$ sudo hostname drums.local
$ hostname
drums.local

$sudo vim /etc/hosts
192.168.x.IP drums
127.0.0.1 localhost drums
255.255.255.255 broadcasthost
::1 localhost
fXXX::1XXX localhost

$networksetup -setv6off Ethernet

$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.9

$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接