2012-05-10 15 views
10

He estado recibiendo el nombre de host de la máquina de la siguiente manera:Obtener nombre de host con Java falla en última JDK7

InetAddress.getLocalHost().getHostName(); 

Sin embargo, cuando puse JDK más reciente (jdk1.7.0_04), el código anterior simplemente volver LOCALHOST . Revisé/etc/hosts (su linux) y se dice que:

127.0.0.1 localhost redbull 

Se ha regresaba hasta REDBULL actualización. Así que cambié de que todo poniendo

127.0.0.1 redbull localhost 

en vez y comenzado a regresar REDBULL sin ningún problema.

¿Hay alguna manera mejor de hacer esto?

Respuesta

2

Bueno, pensé en marcar esto como un duplicado, pero las únicas respuestas que encuentro sugieren que use InetAddress.getLocalHost().getHostName(). Lo cual, francamente, creo que debería devolver "localhost" en este caso. Y esas respuestas, supongo, son correctas, en que realmente no hay una forma pura de Java de hacer esto (al menos ninguna que sea portátil para los JRE anteriores).

Usamos JNI para lograr esto. Llamamos al SCPreferencesGetHostName() en Mac OS 10.4+, SCDynamicStoreCopyLocalHostName() en Mac OS anterior, GetComputerName() en Win32, gethostname() en cualquier otro lado.

Puede, por supuesto, simplemente llamar al /bin/hostname en máquinas Unix o consultar la variable de entorno COMPUTERNAME en Windows. Es una especie de decisión sobre si se siente mejor si llama a JNI o ​​exec en otro programa.

Por lo que vale, la razón por la que no llamamos gethostname() en Mac OS es porque Mac hace un nombre de host dinámico extraño, donde gethostname() devolverá el DNS inverso de su dispositivo ethernet principal. Si tuviera que conectar mi Mac directamente a mi cablemódem, obtendría un nombre de host de customer-10-42-21-42 o lo que sea que mi proveedor de cable decidiera establecer como mi registro PTR en su DNS. En cambio, ir a las preferencias le dará un nombre de host estable que fue determinado por el usuario.

+0

Sí, esto se ve como un duplicado, pero su no cuando miras de cerca. También estoy de acuerdo en que debería devolver LOCALHOST. Sin embargo, con todas las versiones anteriores de JDK, nunca lo hizo y, por lo tanto, "corregir" la lógica en este momento parece ser contra intuitivo. Usar JNI para obtener algo tan simple como el nombre de host me parece una exageración.A menos que alguien tenga una mejor solución o JDK proporcione algo más estándar, utilizaré mi "solución alternativa" en este caso. – Daniil

+0

Yo tendería a estar de acuerdo. La implementación de JNI, si bien es bien conocida, agrega otro nivel de complejidad a su proceso de compilación e implementación. ¿Y si este es el único JNI que necesitas? Probablemente exagerado de hecho. Es extraño que hayan cambiado esto, el equipo de Java tiende a marcar errores aparentemente más importantes como "tal como están diseñados" para mantener el backcompat. –

2

que tenían el mismo problema y cuando todo lo siguiente en fila funcionó. nombre de host tuvo que ser añadido con el DOT locales

$ 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

Si no está en contra del uso de una dependencia externa experta en el centro, que escribió gethostname4j para resolver este problema por mí mismo. Simplemente utiliza JNA para llamar a la función gethostname de libc (u obtiene ComputerName en Windows) y se lo devuelve como una cadena.

https://github.com/mattsheppard/gethostname4j

@ respuesta de Edward-Thomson anterior me hace cosa que podría tener un poco más de trabajo que hacer para que funcione bien en MacOS aunque :)

Cuestiones relacionadas