InetAddress.getLocalHost() throws UnknownHostException
JavaFreebsdOpensolarisJava Problem Overview
I am testing our server-application (written Java) on different operating systems and thought that OpenSolaris (2008.11) would be the least troublesome due to the nice Java integration. Turns out I was wrong, as I end up with a UnknownHostException
try {
computerName = InetAddress.getLocalHost().getHostName();
if (computerName.indexOf(".") > -1)
computerName = computerName.substring(0,
computerName.indexOf(".")).toUpperCase();
} catch (UnknownHostException e) {
e.printStackTrace();
}
The output is:
java.net.UnknownHostException: desvearth01: desvearth01
at java.net.InetAddress.getLocalHost(InetAddress.java:1353)
However, nslookup desvearth01
returns the correct IP address, and nslookup localhost
returns 127.0.0.1
as expected. Also, the same code works perfectly on FreeBSD. Is there anything special to OpenSolaris that I am not aware of?
Any hints appreciated, thanks.
Java Solutions
Solution 1 - Java
In good tradition, I can answer my own question once again:
It seems that InetAddress.getLocalHost()
ignores the /etc/resolv.conf
, but only looks at the /etc/hosts
file (where I hadn't specified anything besides localhost
). Adding the IP and hostname to this file solves the problem and the exception is gone.
Another answer is almost correct and I got hint from above and my problem get resolved...Thanks.
But to improve this, I am adding steps-by-steps changes, so that it will be helpful for even naive users.
Steps:
-
Open
/etc/hosts
, the entries might look like below.127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
-
You need to add one more line above of this by any editor like
vi
orgedit
(e.g.<your-machine-ip> <your-machine-name> localhost
).192.168.1.73 my_foo localhost
Now, overall file may look like this:
192.168.1.73 my_foo localhost
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- Just save it and run again your Java code... your work is done.
Solution 2 - Java
I use NetworkInterface.getNetworkInterfaces()
as a fall back for when InetAddress.getLocalHost()
throws an UnknownHostException
. Here's the code (without exception handling for clarity).
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();
}
}
Other answers edit the /etc/hosts
file. This is error prone, brittle, may require root access and won't work on all OS's.
Solution 3 - Java
On my amazon instance I was having the same issue, there was default DNS configuration issue. So to fix the issue I had done these steps -
> get your host name
$hostname
ip-10-122-16-169
> ping to hostname
$ping ip-10-122-16-169
ping: unknown host ip-10-122-16-169
> cat /etc/hosts file, you will get something like
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost6 localhost6.localdomain6
> now you just need to append your host name at the end of the fist line, so when you append it will look like
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169
::1 localhost6 localhost6.localdomain6
> now you're ready to go, to check ping again the same hostname
$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
Solution 4 - Java
Host lookups on Solaris uses /etc/nsswitch.conf
so depending on what the 'hosts:' line says it determines if /etc/hosts
, NIS, DNS and/or LDAP should be consulted.
If you only use hosts and DNS you should have this in /etc/nsswitch.conf
:
hosts: files dns
The reason nslookup desvearth01
works is because the nslookup
command directly consults /etc/resolv.conf
. If you want to do a better command line test, use the command:
getent hosts desvearth01
Solution 5 - Java
This errors shows up when I changed the workstation name and tried start Glassfish 2. You also must rename the entry at /etc/hosts, something like this:
127.0.0.1 localhost
127.0.1.1 MyNewName
Solution 6 - Java
Checkout /etc/hostname then put your hostname to hosts file.
Solution 7 - Java
If you see this message than you need set hostname WITH hostname superhost.domain
COMMAND!
After this, check which /etc/hosts
file contain string like this 127.0.0.1 localhost
.
Also, check that command uname -a
returns something like this:
> Linux superhost.domain 2.6.38-8-server #42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
NOT LIKE THIS!!!!
> Linux (none) 2.6.38-8-server #42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
Solution 8 - Java
I am having issues around this as well. I need to do further testing, but it looks like
NetworkInterface.getNetworkInterfaces()
can be more reliable. I think that this does not do the lookup, but just grabs the IP.
I am using it as the 'next best' when the getLocalHost()
fails.
Solution 9 - Java
Another option is in this post (in fact, what is in your /etc/sysconfig/network file for your hostname...by changing it to an FQDN name fixes this issue).