เป้าหมายที่ถูกต้องสำหรับตัวแปรสภาพแวดล้อม JAVA_HOME สำหรับการแจกจ่ายที่ใช้ Linux OpenJDK Debian คืออะไร


91

ใน Windows JAVA_HOMEต้องชี้ไปที่โฟลเดอร์การติดตั้ง JDK (เพื่อให้JAVA_HOME/binมีไฟล์ปฏิบัติการทั้งหมดและJAVA_HOME/libsมีjarไลบรารีเริ่มต้นทั้งหมด)

หากฉันดาวน์โหลด JDK บันเดิลของ Sun และติดตั้งใน Linux ก็เป็นขั้นตอนเดียวกัน

อย่างไรก็ตามฉันต้องใช้แพ็คเกจ OpenJDK เริ่มต้นของ Kubuntu ปัญหาคือว่า executables /usr/binทั้งหมดจะอยู่ใน /usr/share/javaแต่ไหจะอยู่ใน เนื่องจากไม่ได้อยู่ในJAVA_HOMEโฟลเดอร์เดียวกันฉันจึงมีปัญหากับ Grails และอาจมีปัญหากับแอปพลิเคชันอื่น ๆ ที่คาดว่าจะมีโครงสร้าง Java มาตรฐาน

  1. ถ้าฉันใช้:

    JAVA_HOME=/usr
    

    แอ็พพลิเคชันและสคริปต์ทั้งหมดที่ต้องการใช้ Java ที่สามารถเรียกใช้งานได้สามารถใช้โพรซีเดอร์มาตรฐานcall $JAVA_HOME/bin/executableได้ อย่างไรก็ตามเนื่องจากไหอยู่ในสถานที่อื่นจึงไม่พบเสมอไป (เช่นในจอกที่ฉันClassDefNotFoundหามาnative2ascii)

  2. ในทางกลับกันถ้าฉันใช้:

    JAVA_HOME=/usr/share/java
    

    ไม่มีของ executables Java ( java, javacฯลฯ ) สามารถพบได้

ดังนั้นวิธีที่ถูกต้องในการจัดการJAVA_HOMEตัวแปรใน Linux ที่ใช้ Debian คืออะไร?

ขอบคุณสำหรับความช่วยเหลือของคุณ Luis

คำตอบ:


99

ในที่สุดสิ่งที่ได้ผลสำหรับฉัน (ตอนนี้ Grails ทำงานได้อย่างราบรื่น) กำลังทำเกือบเหมือนที่ Steve B. ได้ชี้ให้เห็น:

JAVA_HOME=/usr/lib/jvm/default-java

วิธีนี้หากผู้ใช้เปลี่ยน JDK เริ่มต้นสำหรับระบบJAVA_HOMEยังคงใช้งานได้

default-java เป็น symlink ไปยัง JVM ปัจจุบัน


6
ดูเหมือนว่าไม่มีลิงก์ดังกล่าวใน Debian 7
a1an

3
บน RHEL5.10 คือ / usr / lib / jvm / java
Brian

1
ฉันใช้ / usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn

สำหรับ Oracle Linux 7 ( ควรใช้กับ CentOS และ RHEL) ฉันสร้างไฟล์ชื่อ /etc/profile.d/java.sh และเติมข้อมูลดังต่อไปนี้: JAVA_HOME = / usr / lib / jvm / jre-openjdk ส่งออก JAVA_HOME หลังจากการจัดหา / etc / profile ใหม่อีกครั้ง (โดยการเรียกใช้ source / etc / profile) JAVA_HOME ถูกเติมข้อมูลตามที่คาดไว้
darnold0714

80

หากคุณใช้ทางเลือกอื่นในการจัดการ java หลายเวอร์ชันคุณสามารถตั้งค่าJAVA_HOMEตาม symlinked java (หรือ javac) ดังนี้:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

3
สิ่งนี้ใช้ได้กับฉัน: JAVA_HOME = $ (readlink -f / usr / bin / java | sed "s: / jre / bin / java ::")
dpnsan

4
โซลูชันที่ยอดเยี่ยมช่วยแก้ปัญหาปวดหัวมานานหลายปีของฉันด้วย JAVA_HOME ซึ่งมีแนวโน้มที่จะชี้ไปยังที่ต่างๆในระบบปฏิบัติการที่แตกต่างกัน
Datageek

3
โปรดทราบว่าโซลูชันที่ชาญฉลาดนี้จะไม่ทำงานบน distros เช่น Gentoo ที่/usr/bin/javaชี้ไปที่สคริปต์ ( /usr/libexec/eselect-java/run-java-tool.bash) ยังคงเป็นแนวทางที่ดี สิ่งเดียวที่ฉันจะเปลี่ยนคือใช้การทดแทนในตัวของ Bash เพื่อหลีกเลี่ยงการวางไข่sedเช่น:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyT TuesdayDONO

ใช้งานได้ดี :) อาจต้องการเปลี่ยนjavacเป็นjavaเพราะไม่ใช่ทุกคนที่ติดตั้ง JDK เฉพาะ JRE
Hanxue

1
@AlexisWilke ตอนนี้ java แทน javac
bbaassssiiee

7

การติดตั้ง Ubuntu มาตรฐานดูเหมือนว่าจะใส่ Java เวอร์ชันต่างๆเข้า/usr/lib/jvmมา javac, Java ที่คุณพบในเส้นทางของคุณจะ softlink นี้

ไม่มีปัญหาในการติดตั้งเวอร์ชัน Java ของคุณเองทุกที่ที่คุณต้องการตราบใดที่คุณตั้งค่าJAVA_HOMEตัวแปรสภาพแวดล้อมและตรวจสอบให้แน่ใจว่ามี Java ใหม่binอยู่ในเส้นทางของคุณ

วิธีง่ายๆในการทำเช่นนี้คือให้โฮมของ Java อยู่ในรูปแบบซอฟต์ลิงก์ดังนั้นหากคุณต้องการอัพเกรดหรือเปลี่ยนเวอร์ชันคุณจะต้องเปลี่ยนไดเร็กทอรีที่ชี้ไปเท่านั้น - เช่น:

/usr/bin/java --> /opt/jdk/bin/java,

/opt/jdk --> /opt/jdk1.6.011

การแนะนำโซลูชัน Ubuntu กับ Debian เป็นเรื่องอันตราย พวกเขาสามารถและแตกต่างกันไป
RichieHH

4
โปรดทราบว่าผู้ร้องขอบอกว่าเขาใช้ Kubuntu ดังนั้นโซลูชันของ Ubuntu ก็น่าจะใช้ได้
Joseph Holsten

0

ฉันมักจะไม่มีตัวแปรสภาพแวดล้อม JAVA_HOME Java สามารถตั้งค่าได้เอง ภายในคุณสมบัติระบบ java java.home ควรพร้อมใช้งาน


ปกติฉันก็ไม่มีเหมือนกัน อย่างไรก็ตามหากฉันไม่ได้ตั้งค่า grails จะบ่นว่า JAVA_HOME ไม่อยู่ที่นั่นและยกเลิกไป
Luis Soeiro

1
มดก็ต้องการมันเช่นกันในเดเบียนซึ่งเป็นบริบท
RichieHH


0

หากคุณมีปัญหาเกี่ยวกับการไม่พบไฟล์ JAR ฉันจะตรวจสอบให้แน่ใจว่า CLASSPATH ของคุณถูกตั้งค่าให้รวมตำแหน่งของไฟล์เหล่านั้น อย่างไรก็ตามฉันพบว่า CLASSPATH มักจะต้องตั้งค่าแตกต่างกันสำหรับโปรแกรมต่างๆและมักจะกลายเป็นสิ่งที่ต้องตั้งค่าโดยเฉพาะสำหรับแต่ละโปรแกรม



0

ฉันค้นพบปัญหาที่คล้ายกันกับแพ็คเกจ openjdk-6-jre และ openjdk-6-jre-headless ใน Ubuntu

ปัญหาของฉันได้รับการแก้ไขโดยการล้างแพ็คเกจ openjdk-6-jre และ openjdk-6-jre-headless และติดตั้งใหม่ ทางเลือกอื่นจะได้รับการอัปเดตเมื่อติดตั้งใหม่ของแพ็คเกจ openjdk-6-jre และ openjdk-6-jre-headless เท่านั้น

ด้านล่างนี้คือตัวอย่างการติดตั้งหลังจากล้างข้อมูล:

aptitude purge openjdk-6-jre openjdk-6-jre-headless # to ensure no configuration exists
aptitude install --without-recommends openjdk-6-jre # Installing without some extras
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62267 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
Setting up tzdata-java (2012e-0ubuntu0.10.04) ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/java to provide /usr/bin/java (java) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode.
Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode.
...

คุณสามารถดูด้านบนที่update-alternativesเรียกใช้เพื่อตั้งค่าลิงก์สำหรับไบนารี Java ต่างๆ

หลังจากการติดตั้งนี้ยังมีลิงก์/usr/binลิงก์ใน/etc/alternativesและไฟล์สำหรับแต่ละไบนารีใน/var/lib/dpkg/alternatives.

ls -l /usr/bin/java /etc/alternatives/java /var/lib/dpkg/alternatives/java
lrwxrwxrwx 1 root root  40 2013-01-16 14:44 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
lrwxrwxrwx 1 root root  22 2013-01-16 14:44 /usr/bin/java -> /etc/alternatives/java
-rw-r--r-- 1 root root 158 2013-01-16 14:44 /var/lib/dpkg/alternatives/java

มาโต้แย้งกันด้วยการติดตั้งโดยไม่ต้องล้างออก

aptitude remove openjdk-6-jre
aptitude install --without-recommends openjdk-6-jre
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62293 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...

Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
...

อย่างที่คุณเห็นupdate-alternativesจะไม่ถูกกระตุ้น

หลังจากที่ติดตั้งนี้มีไฟล์ไม่มีไบนารี Java ใน/var/lib/dpkg/alternativesการเชื่อมโยงในไม่มีและการเชื่อมโยงในไม่มี/etc/alternatives/usr/bin

การกำจัดของไฟล์ในยังแบ่ง/var/lib/dpkg/alternativesupdate-java-alternatives



0

ในการอัปเดตสำหรับผู้ใช้ fedora ทางเลือกอื่นจะตั้งค่าไดเร็กทอรี java ปัจจุบันเป็น / usr / java / default

ดังนั้นคุณต้องตั้งค่า JAVA_HOME ของคุณเป็น / usr / java / default เพื่อให้มีทางเลือกในการเลือก Curent ใน classpath ของคุณเสมอ

เฮ้!


0

ฉันมักจะตั้งค่า JAVA_HOME ตามไฟล์/usr/bin/java.

JAVA_HOME="$(dirname -- "$(dirname -- "$(readlink -f /usr/bin/java)")")"

วิธีนี้ทางเลือกทั้งสองจะชี้ไปที่ตำแหน่งเดียวกัน


-1

เท่าที่ฉันจำได้ฉันใช้สคริปต์ update-java-alternate แทนการปรับปรุงทางเลือก และมันก็ตั้งค่า JAVA_HOME ให้ฉันอย่างถูกต้อง


ไม่มีใน Ubuntu 20.4
Martin Schröder

-1

โปรดดูว่าคำสั่ง update-ทางเลือกทำอะไร (มีผู้ชายที่ดี ... )

ไม่นาน - จะเกิดอะไรขึ้นเมื่อคุณมี java-sun-1.4 และ java-opensouce-1.0 ... อันไหนใช้ "java"? debian "/ usr / bin / java" เป็นลิงก์สัญลักษณ์และ "/usr/bin/java-sun-1.4" เป็นทางเลือกแทน "/ usr / bin / java"

แก้ไข: ดังที่ Richard กล่าวว่าupdate-alternativesไม่เพียงพอ คุณจำเป็นต้องใช้update-java-alternativesจริง ข้อมูลเพิ่มเติมที่:

https://help.ubuntu.com/community/Java


การอัปเดตทางเลือกไม่เพียงพอ จะต้องมีการปรับปรุง
java-

@ ริชาร์ด: ใช่สังเกต ครั้งแรกที่ฉันพูดถึงเรื่องนี้ฉันจึงเข้าร่วมและพบเอกสารของ Ubuntu ขอบคุณ!
elcuco

-2

เป้าหมายที่ถูกต้องของฉันคือการดาวน์โหลดจาก Sun มาโดยตลอดและติดตั้งด้วยวิธีนั้น แล้วคุณจะรู้ว่าทุกอย่างอยู่ในไดเร็กทอรีใด

แต่ถ้าคุณต้องการใช้วิธีแปลก ๆ ที่ Debian ติดตั้งการเดาที่ดีที่สุดของฉันคือไดเร็กทอรีหลักที่อยู่ด้านบนซึ่งเป็นที่ตั้งของไบนารี java และ javac

(เนื่องจากเมื่อคุณระบุในเส้นทางของคุณคือ $ JAVA_HOME / bin) (ในกรณีของคุณมันจะเป็น ... $ JAVA_HOME / share และ $ JAVA_HOME จะเป็น / usr?)

เอ๊ะฟังดูไม่ถูก ...

ฉันสนใจที่จะฟังคำตอบของเรื่องนี้ด้วย!


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