Tomcat erkennt JAVA_HOME nicht

15

Ich habe Ubuntu 14.04 Server installiert, JDK1.8u5 und Tomcat7 extrahiert und Folgendes zu .profile hinzugefügt (ich habe auch versucht, es zu .bashrc hinzuzufügen, mit ähnlichen [Nicht-] Ergebnissen):

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

Wenn ich renne, echo $JAVA_HOMEerhalte ich das erwartete Ergebnis von /opt/java/jdk1.8.0_05. Ich kann auch ausführen java -versionund die richtige Antwort von Java erhalten. So weit, ist es gut.

Jetzt versuche ich Tomcat zu starten (versucht auch catalina.sh) und bekomme folgendes:

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

aber ... ich habe es gerade versucht echo $JAVA_HOMEund es hat funktioniert?

Isapir
quelle

Antworten:

23

Es gibt einen Hilfetext in catalina.sh. Ich werde es hier zitieren:

#   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

Wenn Sie beginnen tomcatmit catalina.sh, die Suche für Datei setenv.shund Sourcing es. Es wird in CATALINA_HOMEoder gesucht CATALINA_BASE.

So ist der bessere Weg , um Set JAVA_HOMEfür die tomcatist:

  1. Erstellen Sie ein Skript mit dem Namen setenv.shim Ordner CATALINA_BASE/bin, falls es noch nicht vorhanden ist.
  2. Fügen Sie diese Zeile zu setenv.sh

    export JAVA_HOME=/opt/java/jdk1.8.0_05
  3. Mach es ausführbar.


Warum sollten Sie diese Lösung verwenden:

Das Festlegen von Umgebungsvariablen im Skript ist sicherer. Versuchen Sie immer, Variablen so lokal wie möglich festzulegen. Versuchen Sie nicht /etc/environment, /etc/profileund andere, wenn Sie wirklich nicht brauchen Global Environment Variable. Einstellung JAVA_HOMEin setenv.shbietet Ihnen die Möglichkeit verschiedene Kater mit verschiedenen Anwendungen zu verwenden , die andere Version benötigt java, sondern von einem Benutzer ausgeführt wird . Andere Benutzerumgebungen wären von Ihnen nicht betroffen.

c0rp
quelle
4

Da Sie die Umgebungsvariable für Ihren eigenen Benutzer und nicht für den Superuser festgelegt haben, haben Sie zwei Möglichkeiten:

  1. Sie müssen die Variable mit der folgenden -EOption exportieren :

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

    Beachten Sie, dass dadurch alle Umgebungsvariablen exportiert werden, während der Befehl ausgeführt wird. Dies ist nicht zu bevorzugen, da die normale Benutzerumgebung beim Ausführen des Befehls als root nicht mehr zur Verfügung steht. Das ist nicht wünschenswert.

  2. Exportieren Sie die Variable in die Root-.bashrc /etc/enviroment Datei. Öffnen Sie ein Terminal und geben Sie Folgendes ein:

    sudo nano /etc/environment

    Geben Sie Ihr Administratorkennwort ein und fügen Sie die folgenden Zeilen am Ende der Datei hinzu:

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

    und dann

    source /etc/environment

    oder starten Sie Ihren Computer neu und wiederholen Sie den von Ihnen verwendeten Befehl.


Aktualisieren:

Diese Antwort lieferte zwei Hinweise, warum Schritt 2 nicht funktioniert, sudodie Umgebung zurücksetzt und einen sicheren Pfad bereitstellt, sodass alle globalen Variablen zurückgesetzt werden. Eine Problemumgehung wäre zu verwenden

sudo su

und dann den Befehl ausführen, der die eingestellten Umgebungsvariablen verwendet.

Job in
quelle
1
Danke @Jobin - Option 1 funktioniert also habe ich deine Antwort positiv bewertet. Ich werde jetzt Option 2 ankreuzen, die meine bevorzugte Lösung ist, und wenn es funktioniert, werde ich Ihre Antwort akzeptieren.
Isapir
Ich habe die Befehle /root/.bashrcmit nano hinzugefügt , wie Sie vorgeschlagen haben, aber das Aufrufen von user@ubuntu:~$ source /root/.bashrcErgebnissen -bash: /root/.bashrc: Permission deniedund das Ausprobieren mit sudo ergibt sudo: source: command not found. Wiederholen des ursprünglichen Befehls an dieser Stelle bringt mich zurück zu Punkt 0.
Isapir
@Igal: Bearbeitet meine Antwort, um dieses Problem zu lösen, sollten Sie zuerst verwenden, sudo -ibevor Sie source. Vielen Dank für den Hinweis.
jobin
ok, entschuldigen Sie die neuen Fragen, aber wie verlasse ich die sudo -iQuelle , wenn ich sie einmal aufgerufen habe? ohne zu
beenden erhalte
@Igal: Drücken Sie einfach Strg + d oder geben Sie Folgendes ein exit.
jobin
0

Ich suchte nach einer Lösung, bei /etc/environmentder, wie in EnvironmentVariables angegeben , keine Skripts verarbeitet und keine Variablen erweitert werden. Daher hat das Hinzufügen der folgenden Lösung ( ohne Export) den Trick ausgeführt:

JAVA_HOME=/opt/java/jdk1.8.0_05

Dann habe ich das System neu gestartet, damit die Änderungen wirksam werden.

Isapir
quelle
0

Ich habe JAVA_HOME im tomcat7.serviceSkript hinzugefügt, da setenv.shes nicht von bereitgestellt wurdecatalina.sh

Schritte:

1.Öffnen Sie die Tomcat7-Dienstskriptdatei

sudo gedit /etc/init.d/tomcat7

2.Stellen Sie JAVA_HOME ein

.
.
.
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.Starten Sie den tomcat7-Dienst

sudo service tomcat7 status

CᴴᴀZ
quelle