2009-12-10 14 views
71

Sto testando la nostra applicazione server (scritta Java) su diversi sistemi operativi e ho pensato che OpenSolaris (2008.11) sarebbe stato il meno problematico a causa della buona integrazione di Java. Venuto fuori mi sbagliavo, come io alla fine con un UnknownHostExceptionInetAddress.getLocalHost() genera UnknownHostException

try { 
    computerName = InetAddress.getLocalHost().getHostName(); 
    if (computerName.indexOf(".") > -1) 
    computerName = computerName.substring(0, 
     computerName.indexOf(".")).toUpperCase(); 
} catch (UnknownHostException e) { 
    e.printStackTrace(); 
} 

L'output è:

java.net.UnknownHostException: desvearth01: desvearth01 
    at java.net.InetAddress.getLocalHost(InetAddress.java:1353) 

Tuttavia, nslookup desvearth01 restituisce l'indirizzo IP corretto, e restituisce nslookup localhost127.0.0.1 come previsto. Inoltre, lo stesso codice funziona perfettamente su FreeBSD. C'è qualcosa di speciale in OpenSolaris di cui non sono a conoscenza?

Eventuali suggerimenti apprezzati, grazie.

risposta

105

In buona tradizione posso rispondere alla mia domanda, ancora una volta:

Sembra che InetAddress.getLocalHost() ignora il /etc/resolv.conf, ma guarda solo il file/etc/hosts (dove non avevo specificato nulla oltre a localhost). L'aggiunta dell'IP e del nome host a questo file risolve il problema e l'eccezione è scomparsa.


Sopra la risposta è quasi corretta e ho ottenuto un suggerimento da sopra e il mio problema viene risolto ... Grazie.

Ma per migliorare questo, sto aggiungendo le modifiche passo dopo passo, in modo che sia utile anche per gli utenti ingenui.

Passi:

  • Aprire/etc/hosts, le voci potrebbero sembrare come qui di seguito.

    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
    ::1   localhost localhost.localdomain localhost6 localhost6.localdomain6 
    
  • è necessario aggiungere una riga più sopra di questo con qualsiasi editor come vi o gedit. <your-machine-ip> <your-machine-name> localhost es.

    192.168.1.73 my_foo localhost 
    

Ora, il file globale può apparire come segue:

192.168.1.73 my_foo localhost 
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
::1   localhost localhost.localdomain localhost6 localhost6.localdomain6 
  • Basta salvare ed eseguire di nuovo il codice di Java ... il vostro lavoro è fatto.
+1

Se si verificano problemi di autorizzazione quando si tenta di scrivere sul file host, le istruzioni qui aiuteranno: http: //decoding.wordpress.com/2009/04/06/how-to-edit-the-hosts-file -in-mac-os-x-leopard/ – septerr

+3

C'è anche un bug in OS X e java 7, dettagli e soluzione qui https://groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo –

+11

L'impostazione '127.0.0.1 localhost ' era sufficiente per me –

4

ricerca degli host su Solaris utilizza /etc/nsswitch.conf così a seconda di ciò che il 'ospiti:' Linea dice che determina se /etc/hosts, NIS, DNS e/o LDAP dovrebbe essere consultato.

se si utilizza solo host e DNS si dovrebbe avere questo /etc/nsswitch.conf:

hosts: files dns

La ragione nslookup desvearth01 funziona è perché il comando nslookup consulta direttamente /etc/resolv.conf.Se si desidera eseguire un test della riga di comando migliore, utilizzare il comando:

getent hosts desvearth01
+0

Molto utile! Mi ci sono voluti giorni per capire. – Tilo

0

Anche io ho problemi in merito. Devo fare ulteriori test, ma sembra che NetworkInterface.getNetworkInterfaces() possa essere più affidabile. Penso che questo non faccia la ricerca, ma semplicemente afferra l'IP.

Lo sto usando come "prossimo" quando lo getLocalHost() non funziona.

1

Se vedi questo messaggio che si desidera impostare hostname CONhostname superhost.domainCOMANDO!

Dopo questo, controllare quale file /etc/hosts contiene una stringa come questa 127.0.0.1 localhost.

Inoltre, controllare che il comando uname -a restituisce qualcosa di simile:

Linux superhost.domain 2.6.38-8-server di # 42-Ubuntu SMP Lun 11 Apr 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

NON MI PIACE QUESTO !!!!

Linux (nessuno) 2.6.38-8-server di # 42-Ubuntu SMP Lun 11 Apr 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

2

Checkout /etc/hostname poi mettere il tuo host file hosts.

2

Io uso NetworkInterface.getNetworkInterfaces() come back-back per quando InetAddress.getLocalHost() lancia un UnknownHostException. Ecco il codice (senza eccezioni di gestione per chiarezza).

Enumeration<NetworkInterface> iterNetwork; 
Enumeration<InetAddress> iterAddress; 
NetworkInterface network; 
InetAddress address; 

iterNetwork = NetworkInterface.getNetworkInterfaces(); 

while (iterNetwork.hasMoreElements()) 
{ 
    network = iterNetwork.nextElement(); 

    if (!network.isUp()) 
     continue; 

    if (network.isLoopback()) // If I want loopback, I would use "localhost" or "127.0.0.1". 
     continue; 

    iterAddress = network.getInetAddresses(); 

    while (iterAddress.hasMoreElements()) 
    { 
    address = iterAddress.nextElement(); 

    if (address.isAnyLocalAddress()) 
     continue; 

    if (address.isLoopbackAddress()) 
     continue; 

    if (address.isMulticastAddress()) 
     continue; 

    return(address.getHostAddress()); 
    } 
} 
3

Questo errore si presenta quando ho cambiato il nome della workstation e inizio provato Glassfish 2. È inoltre necessario rinominare la voce in/etc/hosts, qualcosa di simile:

127.0.0.1  localhost 
127.0.1.1  MyNewName 
+0

Questo ha funzionato per me - grazie! –

3

Sul mio esempio amazon Stavo avendo lo stesso problema, c'era il problema di configurazione DNS di default.Quindi, per risolvere il problema che avevo fatto questi passi -

ottenere il vostro nome host

$hostname 
ip-10-122-16-169 

ping per hostname

$ping ip-10-122-16-169 
ping: unknown host ip-10-122-16-169 

gatto /etc/hosts file, si otterrà qualcosa di simile

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
::1   localhost6 localhost6.localdomain6 

ora non vi resta che aggiungere il proprio nome host alla fine della linea di pugno, in modo che quando si aggiunge che sarà del tipo

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169 
::1   localhost6 localhost6.localdomain6 

ora siete pronti ad andare, per controllare il ping di nuovo lo stesso nome host

$ping ip-10-122-16-169 
PING localhost (127.0.0.1) 56(84) bytes of data. 
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=255 time=0.018 ms 
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=255 time=0.024 ms