Получение имени хоста с java не удается в последнем jdk7
Я получил имя хоста машины следующим образом:
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
и он начал возвращать REDBULL без проблем.
Есть ли лучший способ сделать эту работу?
Ответы
Ответ 1
Ну, я подумал о том, чтобы помечать это как дуп, но единственные ответы, которые я нахожу, предлагают использовать InetAddress.getLocalHost().getHostName()
. Который, честно говоря, я думаю, должен вернуть "localhost" в этом случае. И эти ответы, я полагаю, правильны, поскольку на самом деле нет чистого Java-способа сделать это (по крайней мере, это не переносится обратно в старые JRE).
Мы используем JNI для этого. Мы называем SCPreferencesGetHostName()
в Mac OS 10.4+, SCDynamicStoreCopyLocalHostName()
на старой Mac OS, GetComputerName()
на Win32, gethostname()
везде.
Вы могли бы, конечно, просто вызвать /bin/hostname
на машинах Unix или посмотреть на переменную среды COMPUTERNAME
на Windows. Это своего рода призыв к суждению о том, лучше ли вам звонить JNI или exec
в другую программу.
Для того, что стоит, причина, по которой мы не вызываем gethostname()
в Mac OS, заключается в том, что Mac делает странное динамическое имя хоста, где gethostname()
вернет обратный DNS вашего основного Ethernet-устройства. Если бы я подключил свой Mac прямо к моему кабельному модему, я получил бы имя хоста customer-10-42-21-42
или то, что мой провайдер кабельного телевидения решил установить как мою запись PTR в своем DNS. Вместо этого переход к настройкам даст вам стабильное имя хоста, которое было определено пользователем.
Ответ 2
У меня была такая же проблема, и когда все это выстроилось, это сработало. имя хоста должно быть добавлено с локальным DOT
$ 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)
Ответ 3
Это известная проблема в порту macosx для JDK7u4.
http://java.net/jira/browse/MACOSX_PORT-564
Ответ 4
Если вы не против использования внешней зависимости от центра maven, я написал gethostname4j, чтобы решить эту проблему для себя. Он просто использует JNA для вызова функции libc gethostname (или получает имя компьютера в Windows) и возвращает ее вам как строку.
https://github.com/mattsheppard/gethostname4j
@edward-thomson отвечает выше, делает мне что-то, что у меня может быть немного больше работы, чтобы он работал хорошо на MacOS, хотя:)