ฉันจะเปลี่ยน Java VM เริ่มต้นของ Mac OS ที่ส่งคืนจาก / usr / libexec / java_home ได้อย่างไร


108

(ไม่แน่ใจว่าควรใช้ SU หรือไม่ ... การโยกย้ายเป็นตัวเลือกอย่างแน่นอน แต่ผู้เขียนโปรแกรมจำนวนมากอ่านคำถามที่นี่ดังนั้นจึงไปที่นี่)

ฉันใช้ Mac OS X 10.8.4 และฉันได้ติดตั้ง JDK 1.6.0_51 ของ Apple รวมทั้ง JDK 1.7.0_25 ของ Oracle ฉันเพิ่งติดตั้ง JDK พรีวิว 1.8 ของ Oracle สำหรับซอฟต์แวร์รุ่นก่อนวางจำหน่ายที่ต้องใช้ ตอนนี้เมื่อฉันเรียกใช้ / usr / libexec / java_home ฉันจะได้รับสิ่งนี้:

$ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
    1.8.0, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home
    1.7.0_25, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
    1.6.0_51-b11-457, x86_64:   "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_51-b11-457, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

เยี่ยมมาก

อย่างไรก็ตามการรัน:

$ java -version

ผลตอบแทน:

java version "1.8.0-ea"

นั่นหมายความว่าเวอร์ชันเริ่มต้นของ Java ปัจจุบันเป็นเวอร์ชันก่อนวางจำหน่ายซึ่งทำให้แพ็กเกจ "ปกติ" บางส่วนแตก (ในกรณีของฉันคือ VisualVM)

ฉันไม่สามารถตั้งค่าได้JAVA_HOMEเนื่องจากการเรียกใช้แอปพลิเคชันจะละเว้นตัวแปรสภาพแวดล้อมแม้ว่าจะเรียกใช้จากบรรทัดคำสั่ง (เช่น$ open /Applications/VisualVM.app)

มีไฟล์ที่ฉันสามารถแก้ไขได้หรือไม่ซึ่งฉันสามารถตั้งค่ากำหนดการสั่งซื้อ JVM ได้ทั่วโลกหรือไม่

(โปรดอย่าบอกให้ฉันเปิด Java Preferences Panel เพราะมันใช้งานไม่ได้: มันไม่มีอะไรที่เป็นประโยชน์และแสดงเพียงหนึ่งใน 4 JVM ที่ฉันติดตั้งไว้)

อัปเดต :

Oracle JVM อยู่ใน/Library/Java/JavaVirtualMachines. การตั้งชื่อไดเร็กทอรี JDK 1.8 ใหม่เป็นjdk1.8.0.jvm.xyzไม่เปลี่ยนแปลงอะไรเลย: java_homeยังคงพบว่าอยู่ในตำแหน่งที่ถูกต้องและการรัน / usr / bin / java ยังคงรัน 1.8 JVM นี่ไม่ใช่ปัญหาเกี่ยวกับการเชื่อมข้อมูล ฯลฯ

คำตอบสำหรับคำถามที่คล้ายกัน

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


พิมพ์ 'which java' แล้วตามด้วย breadcrumbs /usr/bin/javaเป็นเพียง symlink
Brian Roach

11
เคยไปที่นั่นทำอย่างนั้น จุดที่จะต้อง/usr/bin/java ไดเรกทอรีไม่ได้มี symlink ไป 1.8.0 JDK แต่จะมีไดเร็กทอรีที่เรียกอย่างเป็นประโยชน์ซึ่งชี้ไปที่ ไม่ใช่ "JAVA_HOME มีไดเร็กทอรีย่อยที่เรียกว่าซึ่งมีคำสั่ง แต่เป็นไบนารีสากลทึบแสงซึ่งทำหน้าที่ใครรู้อะไรฉันสงสัยว่ามันใช้ฯลฯ เพื่อตัดสินใจว่าจะใช้ JVM ใด/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javaVersionsACurrentACommandsjavajava_home
Christopher Schultz

2
หากไม่อยู่ในหัวข้อโปรดย้ายข้อมูลแทนการปิด FWIW เป็นเรื่องเกี่ยวกับ "เครื่องมือซอฟต์แวร์ที่โปรแกรมเมอร์ใช้กันทั่วไป" ดังนั้นการปิด "นอกหัวข้อ" จึงไม่จำเป็น
Christopher Schultz

ใช่มันน่าหงุดหงิด! ฉันต้องการ JDK หนึ่งอันสำหรับทุกคนหรืออาจจะเป็น 2 ที่ฉันสามารถสลับระหว่าง 1.7 และ 1.8 ได้อย่างง่ายดาย
Brian

1
ฉันพบว่าคำตอบ SO นี้มีประโยชน์สำหรับคำถามนี้: stackoverflow.com/a/44169445/2987755
dkb

คำตอบ:


89

ฉันคิดว่าJAVA_HOMEดีที่สุดที่คุณสามารถทำได้ เครื่องมือบรรทัดคำสั่งเช่นjavaและjavacจะเคารพตัวแปรสภาพแวดล้อมนั้นคุณสามารถใช้/usr/libexec/java_home -v '1.7*'เพื่อกำหนดค่าที่เหมาะสมJAVA_HOMEเพื่อให้เครื่องมือบรรทัดคำสั่งใช้ Java 7

export JAVA_HOME="`/usr/libexec/java_home -v '1.7*'`"

แต่บันเดิลแอปพลิเคชันดับเบิลคลิกได้มาตรฐานไม่ใช้ JDK ที่ติดตั้งไว้/Library/Javaเลย บัน.appเดิลแบบเก่าที่ใช้ Apple JavaApplicationStubจะใช้ Apple Java 6 จาก/System/Library/Frameworksและชุดรูปแบบใหม่ที่สร้างด้วยAppBundler ที่ไม่มี JRE รวมอยู่จะใช้ JRE แบบ "สาธารณะ" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Homeซึ่งเป็นฮาร์ดโค้ดในโค้ด Stub และไม่สามารถเปลี่ยนแปลงได้และ คุณไม่สามารถติดตั้ง JRE สาธารณะสองรายการพร้อมกันได้


แก้ไข: ฉันได้ดู VisualVM โดยเฉพาะสมมติว่าคุณกำลังใช้เวอร์ชัน "แอปพลิเคชันบันเดิล" จากหน้าดาวน์โหลดและแอปเฉพาะนี้ไม่ใช่แอปพลิเคชัน AppBundler แต่ไฟล์ปฏิบัติการหลักจะเป็นเชลล์สคริปต์ที่เรียกหมายเลข ของเชลล์สคริปต์อื่น ๆ และอ่านไฟล์คอนฟิกูเรชันต่างๆ ค่าเริ่มต้นคือการเลือก JDK ใหม่ล่าสุด/Library/Javaตราบเท่าที่เป็น 7u10 ขึ้นไปหรือใช้ Java 6 หากการติดตั้ง Java 7 ของคุณเป็นอัพเดต 9 หรือก่อนหน้า แต่การคลี่คลายตรรกะในเชลล์สคริปต์ดูเหมือนว่าฉันสามารถระบุ JDK เฉพาะโดยใช้ไฟล์คอนฟิกูเรชัน

สร้างไฟล์ข้อความ ~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf (แทนที่ 1.3.6 ด้วย VisualVM เวอร์ชันใดก็ตามที่คุณใช้) ที่มีบรรทัด

visualvm_jdkhome="`/usr/libexec/java_home -v '1.7*'`"

และสิ่งนี้จะบังคับให้เลือก Java 7 แทน 8


สิ่งนี้ไม่ได้เกิดขึ้นกับระบบของฉัน การเรียกใช้ VisualVM ก่อนที่จะติดตั้ง JDK 1.8 จะใช้งานได้ หลังจาก JDK1.8 VisualVM จะแสดงหน้าจอเริ่มต้นจากนั้นก็ตาย การย้ายไดเร็กทอรี JDK1.8 ออกจาก / Library / Java จะคืนค่าความสามารถในการรัน
Christopher Schultz

@ChristopherSchultz ฉันได้ดูในกลุ่ม VisualVM และปรากฎว่ามันไม่ใช่แอปพลิเคชัน appbundler ปกติ ดูการแก้ไขของฉันสำหรับวิธีแก้ปัญหาที่เป็นไปได้
Ian Roberts

ขออภัยฉันเขียนความคิดเห็นก่อนหน้านี้ก่อนที่คุณจะแก้ไข ฉันจะตรวจสอบการให้ VisualVM ทำงานโดยใช้เทคนิคนั้น แต่ไม่น่าจะใช้ได้ในระดับสากล ฉันมีซอฟต์แวร์ที่ใช้ Java อื่น ๆ มากมายที่ฉันใช้งานเช่น Eclipse, JasperReports iReport และอื่น ๆ ซึ่งทั้งหมดมีแนวโน้มที่จะได้รับผลกระทบจากสิ่งนี้ ฉันคิดว่าฉันควรจะย้ายไดเร็กทอรี JDK1.8 ไปไว้ที่อื่นและใช้อย่างชัดเจนกับ JAVA_HOME เป็นเวลา (ไม่กี่ครั้ง) ที่ฉันต้องการจริงๆ
Christopher Schultz

1
ใช่คุณพูดถูกJAVA_HOMEเป็นวิธีที่จะไปและโดยทั่วไปทางออกที่ดีที่สุดของคุณคือระบุรุ่นรองที่คุณต้องการในกรณีอื่น ๆ ขึ้นอยู่กับการถอดชิ้นส่วนก็จะเปิดออกคุณสามารถexport JAVA_VERSION=1.7ที่จะทำให้การjava_homeเริ่มต้นที่จะแสดง JKD7 แทน JDK8 แต่ที่แบ่งjava_home -v 1.6เพราะjava-homeตีความว่ามันเป็นข้อ จำกัด เพิ่มเติมและให้ขึ้นเนื่องจากข้อ จำกัด unsatisfiable ร่วมกันแล้วก็จะไปด้วยเริ่มต้น 1.8 แม้จะมี--failfastตัวเลือก
andrewdotn

2
ฉันไม่เข้าใจว่าทำไม System Preferences Java Control Panel จึงไม่เพียงแค่แสดงรายการให้เลือกแทนที่จะต้องใช้เชลล์สคริปต์ / คำสั่ง ฉันสงสัยว่านี่เป็นเพียง Applets ที่ทำงานในเบราว์เซอร์ ...
JGFMK

51

ฉันเคยไปที่นั่นเหมือนกันและค้นหาทุกที่ว่า/usr/libexec/java_homeทำงานอย่างไร แต่ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับวิธีการกำหนดเครื่องเสมือน Java ที่มีอยู่ในรายการ

ฉันได้ทำการทดลองเล็กน้อยและฉันคิดว่ามันเพียงแค่ดำเนินการls /Library/Java/JavaVirtualMachinesและตรวจสอบ./<version>/Contents/Info.plistเวลาทำงานทั้งหมดที่พบในนั้น

จากนั้นเรียงลำดับจากมากไปหาน้อยตามคีย์JVMVersionมีอยู่ใน Info.plist และโดยค่าเริ่มต้นจะใช้รายการแรกเป็น JVM เริ่มต้น

ผมคิดว่าสิ่งเดียวที่เราอาจจะทำคือการเปลี่ยน plist นี้sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plistแล้วปรับเปลี่ยน JVMVersion จากอย่างอื่นที่ทำให้การจัดเรียงที่ด้านล่างแทนด้านบนเช่น1.8.0!1.8.0

สิ่งที่ต้องการ:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    ...
    <dict>
            ...
            <key>JVMVersion</key>
            <string>!1.8.0</string>   <!-- changed from '1.8.0' to '!1.8.0' -->`

จากนั้นมันก็หายไปอย่างน่าอัศจรรย์จากด้านบนของรายการ:

/usr/libexec/java_home -verbose
Matching Java Virtual Machines (3):
    1.7.0_45, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home
    1.7.0_09, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home
    !1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home

ตอนนี้คุณจะต้องออกจากระบบ / เข้าสู่ระบบจากนั้น:

java -version
java version "1.7.0_45"

:-)

แน่นอนว่าฉันไม่รู้ว่าตอนนี้มีอย่างอื่นแตกหรือไม่หรือถ้า java เวอร์ชัน 1.8.0-ea ยังทำงานได้อย่างถูกต้อง

คุณอาจไม่ควรดำเนินการใด ๆ แต่เพียงแค่ถอนการติดตั้ง 1.8.0

อย่างไรก็ตามสิ่งนี้ได้ผลสำหรับฉัน


สิ่งนี้ได้ผลสำหรับฉัน ฉันต้องใช้การปรับแต่งนี้เพื่อให้ปลั๊กอิน Idea Sbt ทำงานให้ฉันบน MacOS ฉันพูดถึงมันในบล็อกของฉันagilebuild.blogspot.com/2014/02/…
antoine

วิธีนี้ใช้งานได้ แต่ดูเหมือนจะยุ่งยากเล็กน้อยและอาจไม่เหมือนขั้นตอนการทำงานมาตรฐาน ฉันอยากรู้ว่าถ้ามีแนวทางที่ดีกว่านี้
Weibo Li

ฉันจะยังคงชอบวิธีการนี้ แต่สำหรับการตั้งค่าสำหรับ JDK Intellij ใช้ฉันเพิ่มนี้เพื่อ zshenv ฉัน: การส่งออก IDEA_JDK /usr/libexec/java_home -v 1.7= ฉันคิดว่าจะทำแบบเดียวกันกับ JAVA_HOME ...
David Resnick

ฉันจัดการใช้คำตอบนี้เพื่อหลีกเลี่ยงการใช้ Java 9 เพื่อเปิดแอปพลิเคชันดับเบิลคลิก (เนื่องจากปัญหาใน Keystore Store explorer) ขอบคุณ!
Nicolas Henneaux

2
ข้อความที่ตัดตอนมาจากการติดตั้ง JDK และ JRE บน macOS : หลังจากติดตั้ง Java สำหรับ macOS 2012-006 แล้ว/usr/bin/javaจะพบJDK ใหม่ล่าสุดที่ติดตั้งไว้และจะใช้สำหรับเครื่องมือบรรทัดคำสั่งที่เกี่ยวข้องกับ Java ทั้งหมดใน/usr/bin.
Jeremy Kao

7

มันค่อนข้างง่ายจริงๆ สมมติว่าเรามีสิ่งนี้ในโฟลเดอร์ JavaVirtualMachines ของเรา:

  • jdk1.7.0_51.jdk
  • jdk1.8.0.jdk

ลองนึกภาพว่า 1.8 เป็นค่าเริ่มต้นของเราจากนั้นเราก็เพิ่มโฟลเดอร์ใหม่ (เช่น 'เก่า') และย้ายโฟลเดอร์ jdk เริ่มต้นไปยังโฟลเดอร์ใหม่นั้น ทำjava -versionอีกครั้ง et voila, 1.7!


1
ไม่น่าเชื่อ แต่มันใช้งานได้ ... ขอบคุณ Mac OS Mojave
Michał Dobi Dobrzański

5

มันค่อนข้างง่ายถ้าคุณไม่คิดจะพับแขนเสื้อ ... / Library / Java / Homeเป็นค่าเริ่มต้นสำหรับ JAVA_HOME และเป็นเพียงลิงค์ที่ชี้ไปที่หนึ่งใน

  • /System/Library/Java/JavaVirtualMachines/1.?.?.jdk/Contents/Home
  • /Library/Java/JavaVirtualMachines/jdk1.?.?_??.jdk/Contents/Home

ดังนั้นฉันต้องการเปลี่ยนเวอร์ชัน JVM / JDK เริ่มต้นของฉันโดยไม่เปลี่ยนเนื้อหาของ JAVA_HOME ... / Library / Java / Home เป็นตำแหน่งมาตรฐานสำหรับ JVM / JDK ปัจจุบันและนั่นคือสิ่งที่ฉันต้องการรักษา ... เพื่อเป็นวิธีที่ง่ายที่สุดในการเปลี่ยนแปลงสิ่งต่างๆโดยมีผลข้างเคียงน้อยที่สุด

มันง่ายจริงๆ ในการเปลี่ยนเวอร์ชันของ java ที่คุณเห็นด้วย java -version สิ่งที่คุณต้องทำคือบางเวอร์ชันของสิ่งนี้:

cd /Library/Java
sudo rm Home
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home ./Home

ฉันไม่ได้ใช้เวลา แต่เชลล์สคริปต์ที่เรียบง่ายมากที่ใช้ / usr / libexec / java_home และ ln เพื่อสร้าง symlink ข้างต้นควรจะโง่ง่ายต่อการสร้าง ...

เมื่อคุณเปลี่ยนตำแหน่งที่ / Library / Java / Home ชี้แล้ว ... คุณจะได้ผลลัพธ์ที่ถูกต้อง:

cerebro:~ magneto$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM)
64-Bit Server VM (build 25.60-b23, mixed mode)

1
นี่ไม่ใช่วิธีการทำงานของสิ่งนี้: /Library/Java/Homeเป็น symlink จริง ๆ แต่ชี้ให้เห็น/System/Library/Frameworks/JavaVM.framework/Homeว่าตัวเองอยู่ในsymlink ที่สับสนในที่สุดทำให้คุณได้ ... คำสั่งมหัศจรรย์ที่กำหนด JRE ที่เหมาะสมในการเปิด โปรดทราบว่า/usr/libexec/java_homeยังเชื่อมโยงไปยังเวทมนตร์นี้ ดังนั้นคุณสามารถขัดจังหวะทุกอย่างได้เพียงแค่เปลี่ยน symlink และชี้ไปที่ JRE เดียว แต่คุณจะต้องอัปเดตทุกครั้ง ไม่มีคำสั่งใดเหมือนset_preferred_jvm_versionหรือคล้ายกัน
Christopher Schultz

1
ข้อดีของเทคนิคนี้คือไม่ต้องการให้คุณตั้งค่าJAVA_HOMEที่ใดก็ได้ ฉันจะเล่นกับเทคนิคนี้เพื่อดูว่าจะส่งผลให้โปรแกรมที่ใช้ Java เปิดตัวด้วย Java VM "ที่ต้องการ" หรือไม่ ฉันสงสัยว่ามันจะ แต่มันค่อนข้างบอบบาง
Christopher Schultz

วันนี้ฉันเพิ่งมีสิ่งนี้ใน.bash_profile:export JAVA_HOME=`/usr/libexec/java_home -v 12`
jrypkahauer

วิธีนี้ใช้ไม่ได้กับการดับเบิลคลิกที่ไอคอนซึ่งเป็นจุดรวม โซลูชันที่ใช้ได้เฉพาะจากบรรทัดคำสั่งคือ ... ไม่ใช่โซลูชัน
Christopher Schultz

3

คำแนะนำในการถอนการติดตั้งของ Oracle สำหรับ Java 7ใช้ได้ผลสำหรับฉัน

ข้อความที่ตัดตอนมา:

การถอนการติดตั้ง JDK ในการถอนการติดตั้ง JDK คุณต้องมีสิทธิ์ของผู้ดูแลระบบและดำเนินการคำสั่ง remove ไม่ว่าจะเป็นรูทหรือโดยใช้เครื่องมือ sudo (8)

ไปที่ / Library / Java / JavaVirtualMachines และลบไดเร็กทอรีที่มีชื่อตรงกับรูปแบบต่อไปนี้: *

/Library/Java/JavaVirtualMachines/jdk<major>.<minor>.<macro[_update]>.jdk

ตัวอย่างเช่นในการถอนการติดตั้ง 7u6:

% rm -rf jdk1.7.0_06.jdk


2
คำถามนี้ไม่เกี่ยวกับการยกเลิกการติดตั้ง ... มันเกี่ยวกับการเลือก JVM "หลัก" จากที่ติดตั้งไว้ ...
Christopher Schultz

3

สายไปหน่อย แต่เนื่องจากเป็นปัญหาต่อเนื่องกับ Mac OSX ...

วิธีแก้ปัญหาที่ง่ายที่สุดที่ฉันพบคือเพียงแค่ลบไฟล์ OpenJDK ที่ Apple ติดตั้ง ทุกครั้งที่มีการอัปเดต Mac OSX จะมีการติดตั้งและคุณจะต้องลบออกอีกครั้ง

สิ่งนี้ใช้ได้ดีมากหากคุณพัฒนาแอพสำหรับ Google App Engine บน Mac ของคุณโดยใช้ Java OpenJDK ทำงานได้ไม่ดีและเวอร์ชัน Java ที่มาพร้อมกับการอัปเกรด Mac OSX Yosemite จะทำให้ Eclipse Plug-in for App Engine ขัดข้องในทุกการปรับใช้โดยมีข้อผิดพลาดที่เป็นประโยชน์: "Read timed out"


1
ตลกดี ... ฉันคิดว่า Apple ได้ลบ Java ออกไปแล้วในตอนนี้ ฉันจำไม่ได้ว่าลบ Java 1.6 JVM ของ Apple ด้วยตนเองและมันไม่ได้อยู่ที่นี่อีกต่อไป ไม่ว่าในกรณีใดสิ่งนี้ไม่สามารถแก้ไขปัญหาเดิมได้จริงซึ่งเป็นการระบุ JVM ที่ต้องการตามการเลือกที่ติดตั้ง
Christopher Schultz

คุณถูก. มันไม่ตอบคำถาม ตอบสิ่งนี้: หากคุณลบ JVM ที่กำลังใช้อยู่จะใช้รายการ 'ถัดไป' ในรายการ บางทีนั่นอาจช่วยได้
Mo'in Creemers

สิ่งนี้อธิบายได้หรือไม่ว่าทำไมหลังจากรันการติดตั้ง jdk 8 จึงไม่ปรากฏในโฟลเดอร์ JavaVirtualMachines สิ่งที่ฉันเห็นคือ "1.6.0.jdk" ไม่ว่าฉันจะติดตั้งเวอร์ชันใดก็ตาม
whyoz

@whyoz เพิ่งติดตั้ง jdk-8u31-macosx-x64 บน osx 10.10.2 และ VM ได้รับการติดตั้งในโฟลเดอร์ JavaVirtualMachines ตามที่คาดไว้
Mo'in Creemers

คุณใช้งาน Parallels โดยบังเอิญหรือไม่? ฉันติดตั้งที่ด้าน Windows ของ Parallels และ 8u31 ติดตั้งตามที่คาดไว้.. ไม่ใช่ที่ด้าน Mac ..
whyoz

3

ฉันทดสอบ "jenv" และสิ่งอื่น ๆ เช่นการตั้งค่า "JAVA_HOME" แล้วไม่ประสบความสำเร็จ ตอนนี้ฉันและจบลงด้วยวิธีแก้ปัญหาต่อไปนี้

function setJava {
    export JAVA_HOME="$(/usr/libexec/java_home -v $1)"
    launchctl setenv JAVA_HOME $JAVA_HOME
    sudo ln -nsf "$(dirname ${JAVA_HOME})/MacOS" /Library/Java/MacOS 
    java -version
}

(เพิ่มไปยัง ~ / .bashrc หรือ ~ / .bash.profile หรือ ~ / .zshrc)

และเรียกแบบนั้น:

setJava 1.8

java_home จะจัดการกับอินพุตที่ไม่ถูกต้อง คุณจึงไม่สามารถทำอะไรผิดพลาดได้ Maven และสิ่งอื่น ๆ จะมารับรุ่นที่เหมาะสมในขณะนี้


1

ฉันดูสิ่งนี้เล็กน้อยในตัวแยกชิ้นส่วนเนื่องจากไม่มีแหล่งที่มา

/ usr / bin / java และ / usr / libexec / java_home ใช้ประโยชน์จาก JavaLaunching.framework ตัวแปรสภาพแวดล้อม JAVA_HOME ถูกตรวจสอบก่อนโดย / usr / bin / java และเพื่อน (แต่ไม่ใช่ / usr / libexec / java_home) เฟรมเวิร์กใช้ตัวแปรสภาพแวดล้อม JAVA_VERSION และ JAVA_ARCH เพื่อกรอง JVM ที่มีอยู่ ดังนั้นโดยค่าเริ่มต้น:

$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    11.0.5, x86_64: "Amazon Corretto 11"    /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
    1.8.0_232, x86_64:  "Amazon Corretto 8" /Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home

แต่การตั้งค่า JAVA_VERSION สามารถลบล้างค่าเริ่มต้นได้:

$ JAVA_VERSION=1.8 /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home

คุณยังสามารถตั้งค่า JAVA_LAUNCHER_VERBOSE = 1 เพื่อดูการบันทึกการดีบักเพิ่มเติมได้ที่เส้นทางการค้นหา JVM ที่พบ ฯลฯ โดยมีทั้ง / usr / bin / java และ / usr / libexec / java_home

ในอดีต JavaLaunching.framework ใช้ระบบการตั้งค่า (ภายใต้โดเมน com.apple.java.JavaPreferences) เพื่อตั้งค่าลำดับ JVM ที่ต้องการทำให้สามารถตั้งค่า JVM เริ่มต้นด้วย PlistBuddyแต่อย่างที่ดีที่สุดเท่าที่จะทำได้ รหัสถูกลบออกใน macOS เวอร์ชันล่าสุด ตัวแปรสภาพแวดล้อมดูเหมือนจะเป็นวิธีเดียว (นอกเหนือจากการแก้ไข Info.plist ในบันเดิล JDK เอง)

แน่นอนว่าการตั้งค่าตัวแปรสภาพแวดล้อมเริ่มต้นสามารถทำได้ผ่าน. profile หรือผ่านlaunchdหากคุณต้องการให้ตั้งค่าที่ระดับเซสชัน


นี่เป็นข้อมูลที่ดี Dan การใช้.profileไม่เป็นประโยชน์สำหรับกรณีการใช้งานของฉัน (การเปิดแอปพลิเคชันจากเช่น Launchpad) แต่เคล็ดลับบนlaunchdนั้นดี ฉันจะต้องลองดูเนื่องจากความบ้าคลั่งในการสร้างเวอร์ชันล่าสุดของ Java หมายความว่าฉันติดตั้ง Java หลายรุ่นพร้อมกันโดยมีระดับความไว้วางใจ (ส่วนบุคคล) ที่แตกต่างกัน
Christopher Schultz

-2

แก้ไข: ข้อมูลนี้มีไว้สำหรับ visualvm โดยเฉพาะไม่ใช่สำหรับแอป java อื่น ๆ

ดังที่ผู้อื่นกล่าวไว้คุณต้องแก้ไข visualvm.conf

สำหรับ JvisualVM 1.3.6 เวอร์ชันล่าสุดบน Mac ไดเร็กทอรีการติดตั้งมีการเปลี่ยนแปลง

ขณะนี้มันมีอยู่ใน /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf

อย่างไรก็ตามอาจขึ้นอยู่กับตำแหน่งที่คุณติดตั้ง VisualVM วิธีที่ง่ายที่สุดในการค้นหาตำแหน่งที่ VisualVM ของคุณเริ่มต้นจากนั้นดูกระบวนการโดยใช้:

ps -ef | grep VisualVM

คุณจะเห็นสิ่งต่างๆเช่น:

... -Dnetbeans.dirs = / Applications / VisualVM.app / สารบัญ / ทรัพยากร / visualvm / visualvm ...

คุณต้องการใช้คุณสมบัติ netbeans.dir และค้นหาไดเร็กทอรีและคุณจะพบโฟลเดอร์ etc

ยกเลิกการใส่ข้อคิดเห็นบรรทัดนี้ใน visualvm.conf และเปลี่ยนเส้นทางไปยัง jdk

visualvm_jdkhome="/path/to/jdk"

นอกจากนี้หากคุณมีความช้ากับ visualvm ของคุณและคุณมีหน่วยความจำมากฉันขอแนะนำให้เพิ่มจำนวนหน่วยความจำที่มีอยู่อย่างมากและเรียกใช้ในโหมดเซิร์ฟเวอร์:

visualvm_default_options="-J-XX:MaxPermSize=96m -J-Xmx2048m -J-Xms2048m -J-server -J-XX:+UseCompressedOops -J-XX:+UseConcMarkSweepGC -J-XX:+UseParNewGC -J-XX:NewRatio=2 -J-Dnetbeans.accept_license_class=com.sun.tools.visualvm.modules.startup.AcceptLicense -J-Dsun.jvmstat.perdata.syncWaitMs=10000 -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.d3d=false"

คำแนะนำที่ไม่ดี: การแก้ไขสคริปต์เริ่มต้นสำหรับแอปพลิเคชันเฉพาะอาจทำให้แอปพลิเคชันเสียหายและไม่สามารถแก้ปัญหาเดิมของการเปลี่ยน JVM เริ่มต้นสำหรับระบบปฏิบัติการได้
Christopher Schultz

น่าเสียดายที่ผู้อื่นกล่าวถึง jvisualvm ไม่ได้ใช้วิธีมาตรฐานในการเลือก jvm นี่เป็นทางออกเดียวสำหรับแอพนี้
Celandro

ขณะที่ผมของรัฐในคำตอบของฉันคุณไม่จำเป็นต้องปรับเปลี่ยนอะไรภายในโปรแกรมมัดตัวเอง, app ~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.confสามารถโหลดการตั้งค่าจาก
Ian Roberts

-2

ฉันมีสถานการณ์ที่คล้ายกันและกระบวนการต่อไปนี้ใช้ได้ผลสำหรับฉัน:

  1. ในเทอร์มินัลพิมพ์

    vi ~/.profile
  2. จากนั้นเพิ่มบรรทัดนี้ในไฟล์และบันทึก

    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home

    โดยที่เวอร์ชันคือเวอร์ชันบนคอมพิวเตอร์ของคุณเช่น 1.7.0_25

  3. ออกจากโปรแกรมแก้ไขจากนั้นพิมพ์คำสั่งต่อไปนี้เพื่อให้มีผลบังคับใช้

    source ~/.profile 

จากนั้นพิมพ์ java -version เพื่อตรวจสอบผลลัพธ์

    java -version 

.profile คืออะไร? จาก: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515

ไฟล์. profile เป็นไฟล์ที่ซ่อนอยู่ เป็นไฟล์ทางเลือกที่บอกระบบว่าจะเรียกใช้คำสั่งใดเมื่อผู้ใช้ที่มีไฟล์โปรไฟล์ล็อกอินตัวอย่างเช่นถ้าชื่อผู้ใช้ของฉันคือ bruno และมีไฟล์. profile อยู่ใน / Users / bruno / เนื้อหาทั้งหมด จะถูกดำเนินการในระหว่างขั้นตอนการเข้าสู่ระบบ


สิ่งนี้จะไม่ทำงานเมื่อเรียกใช้ VisualVM จาก Launchpad การเรียกใช้งานจากบรรทัดคำสั่งจะไม่มีปัญหาเนื่องจากคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อม JAVA_HOME ได้
Christopher Schultz

-2

MacOS ใช้ / usr / libexec / java_home เพื่อค้นหา Java Version ปัจจุบัน วิธีหนึ่งในการเลี่ยงคือการเปลี่ยนไฟล์ plist ตามที่อธิบายไว้ใน @ void256 วิธีอื่นคือการสำรองข้อมูลของ java_home และแทนที่ด้วยสคริปต์ของคุณเอง java_home ที่มีรหัส
echo $ JAVA_HOME

ตอนนี้ส่งออก JAVA_HOME ไปยัง SDK เวอร์ชันที่ต้องการโดยเพิ่มคำสั่งต่อไปนี้ใน ~ / .bash_profile ส่งออก JAVA_HOME = "/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home" launchctl setenv JAVA_HOME $ JAVA_HOME /// ทำให้ตัวแปรสภาพแวดล้อมทั่วโลก

เรียกใช้แหล่งคำสั่ง ~ / .bash_profile เพื่อรันคำสั่งข้างต้น

ทุกครั้งที่ต้องการเปลี่ยน JAVA_HOME เขาสามารถรีเซ็ตค่า JAVA_HOME ในไฟล์ ~ / .bash_profile


สิ่งใดก็ตามที่อาศัยตัวแปรสภาพแวดล้อมจะไม่ทำงาน ประเด็นคือแอปพลิเคชันที่เปิดตัวผ่าน LaunchPad ฯลฯ จะไม่มีการตั้งค่าด้านสิ่งแวดล้อมนั้น การแฮ็ก plist ด้านบนดูเหมือนจะเป็นวิธีที่ "ดีที่สุด" ซึ่งจะได้ผลลัพธ์ที่ต้องการจริงๆ ฉันยังไม่แน่ใจเกี่ยวกับข้อเสียใด ๆ ดูคำตอบจาก @Tony ซึ่งมีปัญหาเดียวกัน
Christopher Schultz

-3

ฉันต้องการเปลี่ยนรูปแบบเวอร์ชันจาวาเริ่มต้น 1.6 * เป็น 1.7 * ฉันลองทำตามขั้นตอนต่อไปนี้แล้วและได้ผลสำหรับฉัน:

  • ลบลิงก์ "java" จากด้านล่าง / usr / bin
  • สร้างอีกครั้งโดยชี้ไปที่ตำแหน่งใหม่:

ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java

  • ยืนยันด้วย "java -version"

เวอร์ชัน java "1.7.0_51"
Java (TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot (TM) 64-Bit Server VM (build 24.51-b03, mixed mode)


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