Tomcat ไม่รู้จัก JAVA_HOME


15

ฉันได้ติดตั้ง Ubuntu 14.04 Server แล้วแยก JDK1.8u5 และ Tomcat7 และเพิ่มไฟล์ต่อไปนี้เป็น. profile (ฉันลองเพิ่มไปยัง. bashrc ด้วยผลลัพธ์ที่คล้ายกัน [ไม่ใช่ -]):

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

เมื่อฉันเรียกฉันจะได้รับผลที่คาดหวังของecho $JAVA_HOME /opt/java/jdk1.8.0_05ฉันยังสามารถเรียกใช้java -versionและรับการตอบสนองที่ถูกต้องจาก Java ดีมาก

ดังนั้นตอนนี้ฉันพยายามเริ่มต้น Tomcat (พยายาม catalina.sh ด้วย) และฉันได้รับสิ่งต่อไปนี้:

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

แต่ ... ฉันแค่ลองecho $JAVA_HOMEแล้วก็ใช้งานได้?

คำตอบ:


23

catalina.shมีข้อความช่วยเหลือในการเป็น ฉันจะพูดได้ที่นี่:

#   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

เมื่อคุณเริ่มtomcatใช้catalina.shมันค้นหาไฟล์setenv.shและหามัน มันคือการค้นหาในหรือCATALINA_HOMECATALINA_BASE

ดังนั้นวิธีที่ดีกว่าJAVA_HOMEสำหรับการตั้งค่าtomcatคือ:

  1. สร้างสคริปต์ชื่อsetenv.shในโฟลเดอร์CATALINA_BASE/binหากยังไม่มีอยู่
  2. เพิ่มบรรทัดนี้ไปที่ setenv.sh

    export JAVA_HOME=/opt/java/jdk1.8.0_05
  3. ทำให้ปฏิบัติการได้


ทำไมคุณควรใช้วิธีนี้:

การตั้งค่าตัวแปรสภาพแวดล้อมในสคริปต์นั้นปลอดภัยยิ่งขึ้น พยายามตั้งค่าตัวแปรให้อยู่ในเครื่องให้มากที่สุด ลองไม่ได้ใช้/etc/environment, /etc/profileและอื่น ๆ ถ้าคุณจริงๆไม่Global Environment Variableจำเป็นต้อง การตั้งค่าJAVA_HOMEในsetenv.shช่วยให้คุณสามารถใช้ tomcats ที่แตกต่างกับแอพพลิเคชั่นต่าง ๆ ที่ต้องการเวอร์ชั่นที่แตกต่างกันjavaแต่ทำงานโดยผู้ใช้คนเดียว สภาพแวดล้อมผู้ใช้อื่น ๆ จะไม่ได้รับผลกระทบจากคุณ


4

เนื่องจากคุณได้ตั้งค่าตัวแปรสภาพแวดล้อมสำหรับผู้ใช้ของคุณเองและไม่ใช่สำหรับ superuser คุณมีสองตัวเลือก:

  1. คุณจะต้องส่งออกตัวแปรโดยใช้-Eตัวเลือกดังนี้:

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

    โปรดทราบว่าสิ่งนี้จะส่งออกตัวแปรสภาพแวดล้อมทั้งหมดในขณะที่รันคำสั่ง ไม่แนะนำให้ทำเช่นนี้เนื่องจากสภาพแวดล้อมผู้ใช้ปกติจะหกเมื่อคุณเรียกใช้คำสั่งในฐานะรูท สิ่งนี้ไม่เป็นที่ต้องการ

  2. ส่งออกตัวแปรในไฟล์ของรู.bashrc /etc/enviromentท เปิดเทอร์มินัลแล้วพิมพ์:

    sudo nano /etc/environment

    และป้อนรหัสผ่านผู้ดูแลระบบของคุณและเพิ่มบรรทัดต่อไปนี้ในตอนท้ายของไฟล์:

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

    แล้ว

    source /etc/environment

    หรือรีสตาร์ทเครื่องแล้วลองคำสั่งที่คุณใช้อีกครั้ง


ปรับปรุง:

คำตอบนี้ให้คำแนะนำว่าทำไมขั้นตอนที่ 2 ถึงไม่ทำงานsudoจะรีเซ็ตสภาพแวดล้อมและให้เส้นทางที่ปลอดภัยดังนั้นตัวแปรทั่วโลกทั้งหมดจึงถูกรีเซ็ต วิธีแก้ปัญหาคือการใช้

sudo su

จากนั้นดำเนินการคำสั่งที่ใช้ตัวแปรสภาพแวดล้อมที่ตั้งไว้


1
ขอบคุณ @Jobin - ตัวเลือกที่ 1 ใช้งานได้ดังนั้นฉัน upvote คำตอบของคุณ ตอนนี้ฉันจะตรวจสอบตัวเลือก 2 ซึ่งเป็นโซลูชันที่ฉันต้องการและหากใช้งานได้ฉันจะยอมรับคำตอบของคุณ
isapir

ผมเพิ่มคำสั่งไป/root/.bashrcกับนาโนตามที่คุณแนะนำ แต่เรียกuser@ubuntu:~$ source /root/.bashrcผลลัพธ์ในและพยายามมีอัตราผลตอบแทน-bash: /root/.bashrc: Permission denied sudo sudo: source: command not foundการลองคำสั่งดั้งเดิม ณ จุดนี้ทำให้ฉันกลับไปที่จุด 0
isapir

@Igal: แก้ไขคำตอบของฉันในการแก้ปัญหาที่คุณควรใช้ก่อนที่คุณจะsudo -i sourceขอบคุณสำหรับการชี้ให้เห็นว่า
jobin

ตกลงให้อภัยคำถามมือใหม่ แต่ฉันจะออกจากsudo -iเมื่อฉันได้เรียกว่าแหล่งที่มาได้อย่างไร โดยไม่ออกจากฉันได้รับข้อความแสดงข้อผิดพลาดเดิม ...
isapir

@Igal: เพียงแค่กด Ctrl + D exitหรือประเภท
jobin

0

วิธีแก้ปัญหาที่ฉันค้นหาคือ/etc/environmentตามที่ระบุไว้ที่EnvironmentVariablesไม่ประมวลผลสคริปต์และไม่ขยายตัวแปรดังนั้นการเพิ่มต่อไปนี้ ( โดยไม่ต้องส่งออก) ทำให้เคล็ดลับ:

JAVA_HOME=/opt/java/jdk1.8.0_05

จากนั้นฉันรีบูตระบบเพื่อให้การเปลี่ยนแปลงมีผล


0

ฉันเพิ่ม JAVA_HOME ลงในtomcat7.serviceสคริปต์เนื่องจากsetenv.shไม่ได้รับการสนับสนุนcatalina.sh

ขั้นตอน:

1. เปิดไฟล์สคริปต์บริการ tomcat7

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. เริ่มบริการ tomcat7

sudo service tomcat7 status

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.