InetAddress.getLocalHost () lance une exception UnknownHostException

87

Je teste notre application serveur (écrite en Java) sur différents systèmes d'exploitation et je pensais qu'OpenSolaris (2008.11) serait le moins gênant en raison de la belle intégration Java. Il s'avère que j'avais tort, car je me retrouve avec une exception 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 desvearth01renvoie l'adresse IP correcte et nslookup localhostretourne 127.0.0.1comme 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 indices appréciés, merci.

jhwist
la source

Réponses:

119

Dans la bonne tradition, je peux à nouveau répondre à ma propre question:

Il semble que cela InetAddress.getLocalHost()ignore le /etc/resolv.conf, mais ne regarde que le /etc/hostsfichier (où je n'avais rien spécifié en plus localhost). L'ajout de l'adresse IP et du nom d'hôte à ce fichier résout le problème et l'exception a disparu.


Une autre réponse est presque correcte et j'ai eu un indice d'en haut et mon problème est résolu ... Merci.

Mais pour améliorer cela, j'ajoute des changements étape par étape, afin que cela soit utile même pour les utilisateurs naïfs.

Pas:

  • Ouvrez /etc/hosts, les entrées peuvent ressembler à celles ci-dessous.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • Vous devez ajouter une ligne de plus au-dessus de ceci par n'importe quel éditeur comme viou gedit(par exemple <your-machine-ip> <your-machine-name> localhost).

     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
  • Enregistrez-le simplement et exécutez à nouveau votre code Java ... votre travail est terminé.
jhwist
la source
1
Si vous rencontrez des problèmes d'autorisation lorsque vous essayez d'écrire dans le fichier hosts, les instructions ici vous aideront: decoding.wordpress.com/2009/04/06/…
septerr
3
Il y a aussi un bogue dans OS X et java 7, détails et solution de contournement ici groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood
12
Le réglage 127.0.0.1 localhost <hostname>était suffisant pour moi
Marius Soutier
J'ai trouvé cela trop tard. Codé une solution NetworkInterface.getNetworkInterfaces () à la place.
ctpenrose
4
Pour obtenir votre nom d'hôte, vous pouvez utiliser la hostnamecommande du terminal.
Gris
8

J'utilise NetworkInterface.getNetworkInterfaces()comme solution de repli pour les InetAddress.getLocalHost()lancers UnknownHostException. Voici le code (sans traitement d'exception 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())
      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();
  }
}

D'autres réponses modifient le /etc/hostsfichier. Ceci est sujet aux erreurs, fragile, peut nécessiter un accès root et ne fonctionnera pas sur tous les systèmes d'exploitation.

Nathan
la source
5

Sur mon instance Amazon, 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, j'avais fait ces étapes -

obtenez votre nom d'hôte

$hostname
ip-10-122-16-169

ping au nom d'hôte

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

cat / etc / hosts , vous obtiendrez quelque chose comme

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

il vous suffit maintenant d'ajouter votre nom d'hôte à la fin de la première ligne, donc lorsque vous l'ajouterez, cela 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 à partir, pour vérifier à nouveau ping 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
ankit.vishen
la source
4

Les recherches d'hôte sur Solaris l'utilisent en /etc/nsswitch.conffonction de ce que la ligne «hosts:» indique qu'elle détermine si /etc/hostsNIS, DNS et / ou LDAP doivent être consultés.

Si vous n'utilisez que des hôtes et DNS, vous devriez avoir ceci dans /etc/nsswitch.conf:

hôtes: fichiers dns

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

getent héberge desvearth01
Martin
la source
4

Cette erreur apparaît lorsque j'ai changé le nom du poste de travail et essayé de démarrer 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
Jimmy
la source
2

Vérifiez / etc / hostname puis placez votre nom d'hôte dans le fichier hosts.

user4877680
la source
1

Si vous voyez ce message, vous devez définir le nom d'hôte AVEC hostname superhost.domain LA COMMANDE !

Après cela, vérifiez quel /etc/hostsfichier contient une chaîne comme celle-ci 127.0.0.1 localhost.

Vérifiez également que la commande uname -arenvoie 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 ÇA!!!!

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

Pavel
la source
0

J'ai également des problèmes à ce sujet. J'ai besoin de faire des tests supplémentaires, mais il semble que cela NetworkInterface.getNetworkInterfaces()puisse être plus fiable. Je pense que cela ne fait pas la recherche, mais saisit simplement l'adresse IP.

Je l'utilise comme le «prochain meilleur» en cas d' getLocalHost()échec.

Jon
la source