Frage

Ich teste unsere Server-Anwendung (geschrieben Java) auf verschiedenen Betriebssystemen und dachte, dass Opensolaris (2008.11) würde die am wenigsten störend sein, wegen der schönen Java-Integration. Es stellte sich heraus, dass ich falsch war, als ich mit einem Unknown am Ende

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

Die Ausgabe lautet:

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

Allerdings nslookup desvearth01 gibt die korrekte IP-Adresse und nslookup localhost kehrt 127.0.0.1 wie erwartet. Auch der gleiche Code funktioniert perfekt auf FreeBSD. Gibt es etwas Besonderes zu Opensolaris, die ich bin mir nicht bewusst?

Für Hinweise dankbar, danke.

War es hilfreich?

Lösung

In guter Tradition kann ich meine eigene Frage noch einmal beantworten:

Es scheint, dass InetAddress.getLocalHost() ignoriert die /etc/resolv.conf sieht aber nur in der / etc / hosts-Datei (wo ich nichts außer localhost angegeben hatte). Hinzufügen von IP und Hostnamen in dieser Datei löst das Problem und die Ausnahme ist weg.


über Antwort fast richtig ist, und ich habe Hauch von oben und mein Problem gelöst bekommen ... Danke.

Aber um dies zu verbessern, ich bin Hinzufügen von Schritten-by-Schritten verändert, so dass es selbst für naiven Anwender hilfreich sein wird.

Schritte:

  • Öffnen / etc / hosts, die Einträge wie folgt aussehen könnten.

    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • Sie müssen über diesen von einem beliebigen Editor wie vi oder gedit eine weitere Zeile hinzuzufügen. <your-machine-ip> <your-machine-name> localhost zB.

    192.168.1.73 my_foo localhost
    

Nun Gesamtdatei kann wie folgt aussehen:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • speichern Sie es einfach und wiederholen Sie Ihre Java ... Code Ihre Arbeit getan ist.

Andere Tipps

Ich verwende NetworkInterface.getNetworkInterfaces() als Fallback für, wenn InetAddress.getLocalHost() wirft ein UnknownHostException . Hier ist der Code (ohne Ausnahme für Klarheit Handhabung).

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());
  }
}

Host-Lookups auf Solaris verwendet /etc/nsswitch.conf so je nachdem, was die 'hosts:'. Zeile sagt sie bestimmt, ob /etc/hosts, NIS, DNS und / oder LDAP sollte konsultiert werden

Wenn Sie nur Hosts und DNS verwenden, sollten Sie diese in /etc/nsswitch.conf haben:

hosts: files dns

Der Grund nslookup desvearth01 funktioniert, weil der nslookup Befehl /etc/resolv.conf direkt konsultiert. Wenn Sie eine bessere Befehlszeile Test machen wollen, verwenden Sie den Befehl:

getent hosts desvearth01

Dieser Fehler erscheint, wenn ich den Workstation-Namen geändert und versuchte Start Glassfish 2. Sie müssen auch den Eintrag umbenennen in / etc / hosts, so etwas wie folgt aus:

127.0.0.1       localhost
127.0.1.1       MyNewName

Auf meinem amazon Beispiel war ich das gleiche Problem haben, war es Standard-DNS-Konfigurationsproblem. So zu beheben, um das Problem, das ich diese Schritte getan hatte -

  

erhalten Sie Ihre Hostnamen

$hostname
ip-10-122-16-169
  

ping Hostname

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

Katze / etc / hosts Datei, werden Sie so etwas wie

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

Jetzt brauchen Sie nur Ihren Hostnamen am Ende der ersten Zeile anzuhängen, so dass, wenn Sie anhängen wird es aussehen

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

jetzt bist du bereit zu gehen, ping wieder die gleichen Hostnamen zu überprüfen

$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

Zur Kasse / etc / hostname dann auf Hosts-Datei setzen Sie Ihren Hostnamen.

Wenn Sie diese Meldung als Sie eingestellt Hostnamen müssen mit hostname superhost.domain COMMAND !

Danach prüft die Datei /etc/hosts enthalten Zeichenfolge wie diese 127.0.0.1 localhost.

Überprüfen Sie auch, dass Befehl uname -a etwas wie folgt zurückgibt:

  

Linux superhost.domain 2.6.38-8-Server # 42-Ubuntu SMP Mo 11. April 03.49.04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

Nicht so !!!!

  

Linux (keine) 2.6.38-8-Server # 42-Ubuntu SMP Mo 11. April 03.49.04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

Eine weitere Möglichkeit ist in diesem Beitrag (in der Tat, was in ist / etc / sysconfig / network-Datei für Ihre Hostnamen ..., indem sie es zu einem FQDN Namen behebt dieses Problem zu ändern).

java getLocalHost () Unknown / etc / hosts-Datei unterscheidet sich linux api?

Ich habe Probleme, um dies auch. Ich brauche weitere Tests zu tun, aber es sieht aus wie NetworkInterface.getNetworkInterfaces() kann zuverlässiger sein. Ich denke, dass dies nicht die Lookup tut, sondern greift nur die IP.

Ich benutze es als ‚zweitbeste Lösung‘, wenn der getLocalHost() ausfällt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top