20

I've installed Ubuntu 14.04 Server, extracted JDK1.8u5 and Tomcat7, and added the following to .profile (I also tried adding it to .bashrc with similar [non-] results):

export JAVA_HOME=/opt/java/jdk1.8.0_05
export PATH=$PATH:$JAVA_HOME/bin

when I run echo $JAVA_HOME I get the expected result of /opt/java/jdk1.8.0_05. I can also run java -version and get the correct response from Java. so far so good.

so now I try to startup Tomcat (tried also catalina.sh), and I get the following:

user@ubuntu:~$ sudo /opt/tomcat7/apache-tomcat-7.0.53/bin/startup.sh
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program

but... I just tried echo $JAVA_HOME and it worked?

0

5 Answers 5

34

There is a help text in catalina.sh. I will quote it here:

#   Do not set the variables in this script. Instead put them into a script
#   setenv.sh in CATALINA_BASE/bin to keep your customizations separate.

#
#   JAVA_HOME       Must point at your Java Development Kit installation.
#                   Required to run the with the "debug" argument.

# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi

When you starting tomcat using catalina.sh, it searching for file setenv.sh and sourcing it. It is searching in CATALINA_HOME or CATALINA_BASE.

So the better way to set JAVA_HOME for the tomcat is:

  1. Create a script named setenv.sh in the folder CATALINA_BASE/bin, if it does not exist already.
  2. Add this line to setenv.sh

    export JAVA_HOME=/opt/java/jdk1.8.0_05
    
  3. Make it executable.


Why you should use this solution:

Setting environment variable in script is safer. Always try to set variables as locally as possible. Try do not use /etc/environment, /etc/profile and others if you really do not need Global Environment Variable. Setting JAVA_HOME in setenv.sh gives you ability to use different tomcats with different applications that need different version of java, but running by one user. Other user environment would not be affected by you.

0
6

Since you have set the environment variable for your own user and not for the superuser, you have two options:

  1. You will have to export the variable using -E option as follows:

    sudo -E /opt/tomcat7/apache-tomcat-7.0.53/bin/startup.sh
    

    Note that this will export all environment variables while running the command. This is not preferred since the normal users environment is spilled out when you run the command as root. This is not desirable.

  2. Export the variable in root's .bashrc /etc/enviroment file. Open a terminal and type:

    sudo nano /etc/environment
    

    and enter your administrative password, and add the following lines to the end of the file:

    JAVA_HOME=/opt/java/jdk1.8.0_05
    PATH=$PATH:$JAVA_HOME/bin
    

    and then

    source /etc/environment
    

    or restart your machine and then retry the command you were using.


Update:

This answer provided hints as two why step 2 wouldn't work, sudo would reset the environment and provide a secure path, so all global variables are reset. A workaround would be to use

sudo su

and then execute command which uses the set environment variables.

13
  • 1
    Thanks @Jobin -- option 1 works so I upvoted your answer. I will now check option 2, which is my preferred solution, and if it works I will accept your answer.
    – isapir
    May 18, 2014 at 17:57
  • I added the commands to /root/.bashrc with nano, as you suggested, but calling user@ubuntu:~$ source /root/.bashrc results in -bash: /root/.bashrc: Permission denied and trying it with sudo yields sudo: source: command not found. retrying the original command at this point brings me back to point 0.
    – isapir
    May 18, 2014 at 18:05
  • @Igal: Edited my answer to solve that issue, you should first use sudo -i before you source. Thanks for pointing that out.
    – jobin
    May 18, 2014 at 18:06
  • ok, pardon the newbie questions, but how do I exit the sudo -i once I'vet called source? without exiting I am getting the original error message...
    – isapir
    May 18, 2014 at 18:08
  • @Igal: Just press Ctrl + d or type exit.
    – jobin
    May 18, 2014 at 18:09
0

The solution I was looking for is in /etc/environment which, as specified at EnvironmentVariables, does not process scripts and does not expand variables, so adding the following (without export) did the trick:

JAVA_HOME=/opt/java/jdk1.8.0_05

Then I rebooted the system for the changes to take affect.

0

I added JAVA_HOME in tomcat7.service script as setenv.sh was not get sourced by catalina.sh

Steps:

1.Open tomcat7 service script file

sudo gedit /etc/init.d/tomcat7

2.Set JAVA_HOME

.
.
.
JAVA_HOME=/usr/lib/jvm/java-8-oracle

# Directory where the Tomcat 6 binary distribution resides
CATALINA_HOME=/usr/share/$NAME

# Directory for per-instance configuration files and webapps
CATALINA_BASE=/var/lib/$NAME

# Use the Java security manager? (yes/no)
TOMCAT7_SECURITY=no

3.Start tomcat7 service

sudo service tomcat7 status

0

Choose or try a different JDK.

Set $JAVA_HOME as described in the catalina.sh intro or other Tomcat documentation, and do not alter anything else apart from the environment variables defined therein (e.g. Catalina Home/Base). Then run the following;

sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config javadoc
sudo update-alternatives --config javap

On each one, I had to switch down from version 11 to version 8 of the Java Development Kit/JDK, for tomcat version 8. I tested twice, and I am sure this was the solution (with update alternatives, Java dependent programs know where to find Java so you don't have to repeat in the env vars file). A Initially, I did find that my shutdown.sh script was looking for my server at port 8005 while it was started at 8080 (Severe could not contact localhost:8005. Tomcat may not be running. Or connection refused error). But the server itself did shutdown. I manually started it back up again, and shut it back down only to find that the error was not a reoccurring one.

Join the tomcat users group, I think you will see that Tomcat alone can be a headache. Then be patient with yourself!

NB/CAVEAT: test one change at a time, and update others accordingly.

You must log in to answer this question.

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