2009-12-10 3 views
71

Je suis en train de tester notre application serveur (Java écrite) sur différents systèmes d'exploitation et je pensais que OpenSolaris (2008.11) serait le moins gênant en raison de l'intégration de Java. Il se trouve que je me trompais, que je me retrouve avec un UnknownHostExceptionInetAddress.getLocalHost() throws UnknownHostException

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

La sortie est:

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

Cependant, nslookup desvearth01 renvoie l'adresse IP correcte et nslookup localhost retours 127.0.0.1 comme prévu. De plus, le même code fonctionne parfaitement sur FreeBSD. Y a-t-il quelque chose de spécial à OpenSolaris dont je ne suis pas au courant?

Tous les conseils appréciés, merci.

Répondre

105

Dans la bonne tradition que je peux répondre à ma propre question encore une fois:

Il semble que InetAddress.getLocalHost() ne tient pas compte de la /etc/resolv.conf mais ne regarde que le fichier/etc/hosts (où je ne l'avais pas précisé quoi que ce soit en plus de localhost). L'ajout de l'adresse IP et du nom d'hôte à ce fichier résout le problème et l'exception disparaît. Ci-dessus, la réponse est presque correcte et j'ai obtenu un indice ci-dessus et mon problème est résolu ... Merci. Mais pour améliorer cela, j'ajoute des changements pas-à-pas, de sorte que ce sera utile même pour les utilisateurs naïfs.

Étapes:

  • Ouvrir/etc/hosts, les entrées pourraient ressembler ci-dessous.

    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
    ::1   localhost localhost.localdomain localhost6 localhost6.localdomain6 
    
  • vous devez ajouter une ligne au-dessus de ce par un éditeur tel que vi ou gedit. <your-machine-ip> <your-machine-name> localhost par exemple.

    192.168.1.73 my_foo localhost 
    

Maintenant, le fichier global peut ressembler à ceci:

192.168.1.73 my_foo localhost 
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
::1   localhost localhost.localdomain localhost6 localhost6.localdomain6 
  • Il suffit de l'enregistrer et exécuter de nouveau votre java ... le code de votre travail est fait.
+1

Si vous rencontrez des problèmes de permission lorsque vous essayez d'écrire dans le fichier hosts, les instructions ici vous aideront: http: //decoding.wordpress.com/2009/04/06/how-to-edit-the-hosts-file -in-mac-os-x-leopard/ – septerr

+3

Il y a aussi un bogue dans OS X et java 7, les détails et la solution ici https://groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo –

+11

La définition de '127.0.0.1 localhost ' était suffisante pour moi –

4

hôte sur lookups Solaris utilise /etc/nsswitch.conf donc en fonction de ce que les « hôtes: » ligne dit qu'il détermine si /etc/hosts, NIS, DNS et/ou LDAP doit être consulté.

Si vous utilisez uniquement les hôtes et DNS, vous devriez avoir cela dans /etc/nsswitch.conf:

hosts: files dns

La raison nslookup desvearth01 fonctionne est parce que la commande nslookup consulte directement /etc/resolv.conf.Si vous voulez faire un meilleur test de ligne de commande, utilisez la commande:

getent hosts desvearth01
+0

Très utile! Cela m'a pris des jours pour comprendre. – Tilo

0

J'ai des questions autour aussi. J'ai besoin de faire d'autres tests, mais il semble que NetworkInterface.getNetworkInterfaces() peut être plus fiable. Je pense que cela ne fait pas la recherche, mais attrape juste l'adresse IP. Je l'utilise comme le «meilleur prochain» quand le getLocalHost() échoue.

1

Si vous voyez ce message que vous avez besoin de définir le nom d'hôte AVEChostname superhost.domainCOMMANDE! Ensuite, vérifiez quel fichier /etc/hosts contient une chaîne comme celle-ci 127.0.0.1 localhost.

Vérifiez également que commande uname -a retours quelque chose comme ceci:

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

PAS COMME CELA !!!!

Linux (none) 2.6.38-8-server # 42 Ubuntu SMP Mon 11 avril 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

2

Commander /etc/nom d'hôte puis mettez votre nom d'hôte dans le fichier hosts.

2

J'utilise NetworkInterface.getNetworkInterfaces() comme repli lorsque InetAddress.getLocalHost() lance UnknownHostException. Voici le code (sans exception de manipulation pour plus de clarté).

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

Cette erreur apparaît quand j'ai changé le nom du poste de travail et le démarrage essayé Glassfish 2. Vous devez également renommer l'entrée dans/etc/hosts, quelque chose comme ceci:

127.0.0.1  localhost 
127.0.1.1  MyNewName 
+0

Cela a fonctionné pour moi - merci! –

3

Sur mon exemple amazone J'avais le même problème, il y avait un problème de configuration DNS par défaut.Donc, pour résoudre le problème, je l'avais fait ces étapes -

obtenir votre nom d'hôte

$hostname 
ip-10-122-16-169 

ping hostname

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

chat /etc/hôtes fichier, vous obtiendrez quelque chose comme

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

maintenant vous avez juste besoin d'ajouter votre nom d'hôte à la fin de la ligne de poing, alors quand vous ajoutez il ressemblera

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

maintenant vous êtes prêt à aller, pour vérifier ping à nouveau le même nom d'hôte

$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 
Questions connexes