2012-05-10 15 views
10

sto ottenendo nome host della macchina come segue:Ottenere hostname con Java non riesce in ultima jdk7

InetAddress.getLocalHost().getHostName(); 

Tuttavia, quando ho messo più recente JDK (jdk1.7.0_04), il codice di cui sopra semplicemente restituire LOCALHOST . Ho controllato/etc/hosts (il suo linux) e si dice lì:

127.0.0.1 localhost redbull 

E 'stato tornando REDBULL fino aggiornamento. Quindi l'ho modificato inserendo

127.0.0.1 redbull localhost 

e ha iniziato a restituire REDBULL senza problemi.

C'è un modo migliore di fare questo lavoro?

risposta

2

Beh, ho pensato di segnalazione come DUP, ma le uniche risposte trovo suggerire che si utilizza InetAddress.getLocalHost().getHostName(). Il che, francamente, penso che dovrebbe restituire "localhost" in questo caso. E quelle risposte, suppongo, sono corrette, in quanto in realtà non esiste un modo Java puro per farlo (almeno nessuno che possa tornare ai vecchi JRE.)

Usiamo JNI per fare ciò. Chiamiamo SCPreferencesGetHostName() su Mac OS 10.4+, SCDynamicStoreCopyLocalHostName() sui vecchi Mac OS, GetComputerName() su Win32, gethostname() ovunque.

Si potrebbe, naturalmente, semplicemente chiamare /bin/hostname su macchine Unix o guardare la variabile di ambiente COMPUTERNAME su Windows. È una sorta di giudizio se si sente meglio chiamare JNI o ​​exec in un altro programma.

Per quello che vale, la ragione per cui non chiamiamo gethostname() su Mac OS è perché Mac fa una cosa strana hostname dinamica, dove gethostname() restituirà il DNS inverso del dispositivo ethernet primario. Se dovessi collegare il mio Mac direttamente nel mio modem via cavo, che avrei avuto un hostname di customer-10-42-21-42 o qualsiasi altra cosa il mio provider via cavo ha deciso di creare il mio record PTR nella loro DNS. Invece, andando alle preferenze otterrai un hostname stabile che è stato determinato dall'utente.

+0

Sì, questo fa apparire come un duplicato, ma la sua non quando osservi da vicino. Sono anche d'accordo che dovrebbe restituire LOCALHOST. Tuttavia, con tutte le versioni precedenti di JDK, non ha mai funzionato e quindi "correggere" la logica a questo punto sembra essere contro-intuitiva. Usare JNI per ottenere qualcosa di semplice come l'hostname mi sembra eccessivo.A meno che qualcuno non abbia una soluzione migliore o JDK offra qualcosa di più standard, userò la mia "soluzione alternativa" su questo. – Daniil

+0

Tenderei ad essere d'accordo. La distribuzione di JNI, anche se certamente ben compresa, aggiunge un altro livello di complessità al processo di compilazione e implementazione. E se questo è l'unico JNI che ti serve? Probabilmente eccessivo. È strano che lo avrebbero cambiato, il team di Java tende a segnalare bug apparentemente importanti come "progettati" per mantenere il backcompat. –

2

Ho avuto lo stesso problema e quando tutte le seguenti allineati ha funzionato. Nome host doveva essere aggiunto con DOT locale

$ 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

Se non sei contro l'uso di una dipendenza esterna dal centro di Maven, ho scritto gethostname4j per risolvere questo problema per me. Usa semplicemente JNA per chiamare la funzione gethostname di libc (o ottiene ComputerName su Windows) e lo restituisce come stringa.

https://github.com/mattsheppard/gethostname4j

@ risposta di Edward-Thomson sopra mi fa cosa potrei avere un po 'più di lavoro da fare per farlo funzionare bene su MacOS però :)

Problemi correlati