What is the correct target for the JAVA_HOME environment variable for a Linux OpenJDK Debian-based distribution?
In Windows, JAVA_HOME
must point to the JDK installation folder (so that JAVA_HOME/bin
contains all executables and JAVA_HOME/libs
contains all default jar
libraries).
If I download Sun's JDK bundle and installs it in Linux, it is the same procedure.
However, I need to use Kubuntu's default OpenJDK package. The problem is that all executables are placed in /usr/bin
. But the jars are placed in /usr/share/java
. Since they are not under the same JAVA_HOME
folder I'm having trouble with Grails and maybe there will be trouble with other applications that expect the standard Java structure.
-
If I use:
JAVA_HOME=/usr
All applications and scripts that want to use any Java executable can use the standard procedure
call $JAVA_HOME/bin/executable
. However, since the jars are in a different place, they are not always found (example: in grails I'm gettingClassDefNotFound
fornative2ascii
). -
On the other hand, if I use:
JAVA_HOME=/usr/share/java
None of the Java executables (
java
,javac
, etc.) can be found.
So, what is the correct way of handling the JAVA_HOME
variable in a Debian-based Linux?
Thanks for your help, Luis
What finally worked for me (Grails now works smoothly) is doing almost like Steve B. has pointed out:
JAVA_HOME=/usr/lib/jvm/default-java
This way if the user changes the default JDK for the system, JAVA_HOME
still works.
default-java
is a symlink to the current JVM.
If you use alternatives to manage multiple java versions, you can set the JAVA_HOME
based on the symlinked java (or javac) like this:
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
The standard Ubuntu install seems to put the various Java versions in /usr/lib/jvm
. The javac
, java you find in your path will softlink to this.
There's no issue with installing your own Java version anywhere you like, as long as you set the JAVA_HOME
environment variable and make sure to have the new Java bin
on your path.
A simple way to do this is to have the Java home exist as a softlink, so that if you want to upgrade or switch versions you only have to change the directory that this points to - e.g.:
/usr/bin/java --> /opt/jdk/bin/java,
/opt/jdk --> /opt/jdk1.6.011