Tomcat ne reconnaît pas JAVA_HOME

15

J'ai installé Ubuntu 14.04 Server, extrait JDK1.8u5 et Tomcat7 et ajouté ce qui suit à .profile (j'ai également essayé de l'ajouter à .bashrc avec des résultats [non] similaires):

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

quand je cours, echo $JAVA_HOMEj'obtiens le résultat attendu de /opt/java/jdk1.8.0_05. Je peux également exécuter java -versionet obtenir la bonne réponse de Java. jusqu'ici tout va bien.

alors maintenant j'essaie de démarrer Tomcat (essayé aussi catalina.sh), et j'obtiens ce qui suit:

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

mais ... j'ai juste essayé echo $JAVA_HOMEet ça a marché?

isapir
la source

Réponses:

23

Il y a un texte d'aide dans catalina.sh. Je vais le citer ici:

#   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

Lorsque vous commencer à l' tomcataide catalina.sh, il recherche de fichier setenv.shet le sourcing il. Il cherche dans CATALINA_HOMEou CATALINA_BASE.

Donc, la meilleure façon de définir JAVA_HOMEpour le tomcat:

  1. Créez un script nommé setenv.shdans le dossier CATALINA_BASE/bin, s'il n'existe pas déjà.
  2. Ajoutez cette ligne à setenv.sh

    export JAVA_HOME=/opt/java/jdk1.8.0_05
  3. Rendez-le exécutable.


Pourquoi devriez-vous utiliser cette solution:

La définition d'une variable d'environnement dans le script est plus sûre. Essayez toujours de définir les variables aussi localement que possible. Essayez de ne pas utiliser /etc/environment, /etc/profileet d'autres si vous n'en avez vraiment pas besoin Global Environment Variable. Réglage JAVA_HOMEen setenv.shvous donne la possibilité d'utiliser différentes matous avec des applications différentes qui ont besoin de version différente de java, mais en cours d' exécution par un utilisateur. Aucun autre environnement utilisateur ne serait affecté par vous.

c0rp
la source
4

Puisque vous avez défini la variable d'environnement pour votre propre utilisateur et non pour le superutilisateur, vous avez deux options:

  1. Vous devrez exporter la variable en utilisant l' -Eoption comme suit:

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

    Notez que cela exportera toutes les variables d'environnement lors de l'exécution de la commande. Ce n'est pas préférable car l'environnement normal des utilisateurs est répandu lorsque vous exécutez la commande en tant que root. Ce n'est pas souhaitable.

  2. Exportez la variable dans le.bashrc /etc/enviroment fichier racine . Ouvrez un terminal et saisissez:

    sudo nano /etc/environment

    et entrez votre mot de passe administrateur et ajoutez les lignes suivantes à la fin du fichier:

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

    puis

    source /etc/environment

    ou redémarrez votre ordinateur, puis réessayez la commande que vous utilisiez.


Mise à jour:

Cette réponse a fourni des indications comme deux raisons pour lesquelles l'étape 2 ne fonctionnerait pas, sudoréinitialiserait l'environnement et fournirait un chemin sécurisé, de sorte que toutes les variables globales sont réinitialisées. Une solution de contournement consisterait à utiliser

sudo su

puis exécutez la commande qui utilise les variables d'environnement définies.

jobin
la source
1
Merci @Jobin - l'option 1 fonctionne donc j'ai voté pour votre réponse. Je vais maintenant cocher l'option 2, qui est ma solution préférée, et si cela fonctionne, j'accepterai votre réponse.
isapir
J'ai ajouté les commandes à /root/.bashrcavec nano, comme vous l'avez suggéré, mais en appelant les user@ubuntu:~$ source /root/.bashrcrésultats -bash: /root/.bashrc: Permission deniedet en les essayant avec les rendements sudo sudo: source: command not found. retenter la commande d'origine à ce stade me ramène au point 0.
isapir
@Igal: J'ai modifié ma réponse pour résoudre ce problème, vous devez d'abord l'utiliser sudo -iavant vous source. Merci d'avoir fait remarquer cela.
jobin
ok, pardonnez les questions des débutants, mais comment puis-je quitter la sudo -isource appelée I'vet? sans sortir je reçois le message d'erreur d'origine ...
isapir
@Igal: Appuyez simplement sur Ctrl + d ou tapez exit.
jobin
0

La solution que je cherchais est dans /etc/environmentlaquelle, comme spécifié chez EnvironmentVariables , ne traite pas les scripts et ne développe pas les variables, donc l'ajout de ce qui suit ( sans exportation) a fait l'affaire:

JAVA_HOME=/opt/java/jdk1.8.0_05

J'ai ensuite redémarré le système pour que les modifications prennent effet.

isapir
la source
0

J'ai ajouté JAVA_HOME dans le tomcat7.servicescript car il setenv.shn'a pas été obtenu parcatalina.sh

Pas:

1.Ouvrez le fichier de script du service tomcat7

sudo gedit /etc/init.d/tomcat7

2.Définissez 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.Démarrez le service tomcat7

sudo service tomcat7 status

CᴴᴀZ
la source