44

I have install java through yum on CentOS, however another java programme needs to know what the JAVA_HOME environmental variable is. I know all about setting environmental variables, but what do I set it to? java is installed in /usr/bin/java, it can't be there!

8 Answers 8

61

Actually I found it,

it's /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/. I found out what it was by doing update-alternatives --display java and it showed me the directory /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java

20

I'm not quite sure but if you install the normal RPMS the JAVA_HOME value can also be set to this:

/usr/java/default/

EDIT: I just checked on my home system. I have created this file:

/etc/profile.d/java.sh

That contains:

export JAVA_HOME=/usr/java/default/

and I'm using the official version from Sun: jdk-1.6.0_12-fcs

EDIT: Here is how I set up Java on my machine:

Install Java

Download and install Java JDK from Oracle

Make it primary

Ensure this Java is used instead of the OpenJDK version using the following two commands:

First

alternatives --install /usr/bin/java java /usr/java/default/bin/java 999999 \
           --slave /usr/bin/keytool keytool /usr/java/default/bin/keytool \
           --slave /usr/bin/rmiregistry rmiregistry /usr/java/default/bin/rmiregistry

Second

alternatives --install /usr/bin/javac javac /usr/java/default/bin/javac 999999 \
           --slave /usr/bin/jar jar /usr/java/default/bin/jar \
           --slave /usr/bin/rmic rmic /usr/java/default/bin/rmic

Set JAVA_HOME

Ensure all users have their JAVA_HOME environment variable set to the correct value:

echo "export JAVA_HOME=/usr/java/default/" > /etc/profile.d/java_home.sh
3
  • 1
    oh interesting. :) Aug 6, 2009 at 13:19
  • 1
    There's no /usr/java/default in my CentOS 6 box with OpenJDK 1.6 and 1.7 installed. Oct 28, 2013 at 17:11
  • @DanielSerodio Correct. I clearly described "Download and install Java JDK from Oracle", and then it does exist. Oct 29, 2013 at 9:06
3

You want to set JAVA_HOME to be the root location of the JDK or JRE, for example:

export JAVA_HOME=/usr/java/jdk1.3

If the JDK (Development kit) is installed, ypu probably want it to point to that, else use the JRE path (Java Runtime Environment). Then, you might want to set your $PATH environment variable to include the bin directory as well:

export PATH=$PATH:/usr/java/jdk1.3/bin

If you are using tomcat, you might also need to set CATALINA_HOME for the tomcat user.

export CATALINA_HOME=/path/to/tomcat

To set this for the system you want to edit your /etc/profile or add a .sh file in /etc/profile.d folder. For a particular user you can put it in the users ~/.profile or ~/.bash_profile files.

1
  • I wonder if there is a good reason the install doesn't do this for you if run as the super user, I always find it irritating ... Aug 6, 2009 at 13:15
2

I considered the problem of if one changes the version of java being used with:

alternatives --config java

Then any hard coded JAVA_HOME is going to change (atleast it will on the Centos 6.6 I'm currently staring at). That is, there is no /usr/java.

This doesn't seem like the best way (open to failure) but in the 10 mins I've spent on this it seems the best.

In /etc/bashrc I modified the setting to JAVA_HOME to be:

export JAVA_HOME=$(alternatives --display java | grep current | sed 's/link currently points to //' | sed 's|/bin/java||')

You have to do something similar on MacOSX but without all the grep and sed to parse out the result. Surely alternatives offers an similarly easier solution.

Anyways I hope I helped.


Update

No that would be JRE_HOME. The JDK / SDK isn't proving as obvious (I'll keep looking).

The alternatives seems to only be about the JRE by default. I defer to @Niels answer or just install Java with yum and set the JAVA_HOME to that (the trick is where I found where that was installed to!).

yum install java-1.8.0-openjdk-devel.x86_64
cd /usr/lib/jvm 

I noticed java_1.8.0 is a symlink to /etc/alternatives/java_sdk_1.8.0 and so set my $JAVA_HOME to /usr/lib/jvm/java_1.8.0. In the /etc/bashrc.

2

Below is always working for me perfectly:

[user@base ~]$ locate bin/java
/usr/bin/java
/usr/bin/javac
/usr/bin/javadoc
/usr/bin/javaws
/usr/java/jdk1.6.0_31/bin/java
/usr/java/jdk1.6.0_31/bin/javac
/usr/java/jdk1.6.0_31/bin/javadoc
/usr/java/jdk1.6.0_31/bin/javah
/usr/java/jdk1.6.0_31/bin/javap
/usr/java/jdk1.6.0_31/bin/javaws
/usr/java/jdk1.6.0_31/jre/bin/java
/usr/java/jdk1.6.0_31/jre/bin/java_vm
/usr/java/jdk1.6.0_31/jre/bin/javaws

It means I can set JAVA_HOME as /usr/java/jdk1.6.0_31

0

Thats weird, the whole point of having a JAVE_HOME environmental variable is so you don't have to specify the path to each program, it can get this path by looking for this variable.

Either way, the correct way to find the environmental variable for JAVA_HOME is to use echo:

[root@host ~]# echo $JAVA_HOME
/usr/java/j2sdk1.4.2_09

Running this command will display the path no matter what version you are running, from command line.

1
  • 2
    The variable had not been set. Aug 6, 2009 at 13:19
0

re: Centos7, refer to the /etc/java/java.conf file.

in it JAVA_HOME is indicated to be located in the following dir : /usr/lib/jvm/java

i checked, it is the correct version of the jdk I loaded via yum, and so...

my env doesn't have JAVA_HOME set by default, therefore I set it in .bash_profile

0

I found the package manager can place in a variety of locations, so using which (you will need to explicitly install this if using a container) the following is a little less brittle

javaCompiler=$(which javac)
javaBin=$(dirname $(readlink -f $javaCompiler))
javaHome=${javaBin%/*}
export JAVA_HOME=$javaHome

or for JRE

javaExec=$(which java)
javaBin=$(dirname $(readlink -f $javaExec))
javaHome=${javaBin%/*}
export JRE_HOME=$javaHome

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .