สลับเวอร์ชัน Java JDK ขั้นเทพ ด้วย jenv (Linux / OS X)

As buggy as chakkapan (byrd) rapeepunpienpen
caucus
Published in
3 min readAug 30, 2018
“brown coffee beans” by nousnou iwasaki on Unsplash

เชื่อว่าหลายๆคนน่าจะเคยตกอยู่ในสถาณการณ์ที่ต้องลง Java JDK หลายเวอร์ชันไว้ในเครื่องตัวเอง แล้วเวลาจะสลับเวอร์ชันทีก็ต้องมานั่งตั้งค่า JAVA_HOME กันใหม่ ทุกครั้งที่จะตั้งค่า ก็ลืมทั้งคำสั่งที่ใช้ตั้ง และลืมพาร์ทของ JDK ว่าลงไว้ส่วนไหนของเครื่อง บางคนอาจใช้วิธีสร้าง bash file ไว้เพื่อการนี้

โชคดี! ถ้าหากว่า npm นั้นมี nvm ฝั่ง Java ก็มี jenv เช่นกัน! พ๊ามมผ่ามม :)

jenv in action

เปิดเว็บเพจของ jenv ขึ้นมา ก็จะพบ installation ที่สุดแสนจะง่าย ทำตามขั้นตอนที่ช่วยแปลไว้ด้านล่างนี้ก็ได้ let’s go!

jenv: http://www.jenv.be/

Installation

Linux / OS X

$ git clone https://github.com/gcuisinier/jenv.git ~/.jenv

หรือ Homebrew (Mac OS X)

$ brew install jenv

แก้ installation issue

สำหรับผมที่ลงด้วย homebrew แล้วพบว่ามีปัญหานิดหน่อย ลองสามาถตรวจสอบได้โดยการเช็คว่ามีโพลเดอร์ .jenv สร้างขึ้นมาในโปรไฟล์เราไหม

$ jenv versions# output
* system (set by /Users/chakkapanr/.jenv/version)

สังเกตเอ๊าท์พุทที่ได้ จะเป็นพาร์ทไปยังโฟลเดอร์ที่ jenv จะใช้ทำงาน /Users/chakkapanr/.jenv/version ผมพบว่า homebrew ไม่สร้างโพลเดอร์นี้ให้อัติโนมัติ ถ้าใครเป็นเหมือนกันให้ทำการสร้างโฟลเดอร์นี้ด้วยตัวเองดังนี้เลยครับ

mkdir ~/.jenv
mkdir ~/.jenv/versions

และต้องแก้ไข environment variable กับ .bask_profile ด้วยนิดหน่อย (สรุปแทบจะเหมือน manual installation เลย homebrew ไม่ได้ช่วยอะไร - -")

$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(jenv init -)"' >> ~/.bash_profile

แก้ .bash_profile แล้ว restart terminal 1 ทีนะครับ
(หรือรันคำสั่ง $ source ~/.bash_profile ก็ได้)

Configuration

อันดับถัดไป เรามาเพิ่มเวอร์ชั่น JDK ที่เครื่องเรามีให้ jenv รู้จักกันก่อนเลย ใช้ java_home เพื่อนลิสท์ JDK ทั้งหมดที่เราลงไว้ในเครื่อง

$ /usr/libexec/java_home -V# outputMatching Java Virtual Machines (2):10.0.2, x86_64:
"Java SE 10.0.2"
/Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
1.8.0_181, x86_64:
"Java SE 8"
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home

ตัวอย่างของผมมี 2 เวอร์ชัน ทำหารเพิ่มทั้ง 2 เวอร์ชันนี้ให้ jenv รู้จัก

$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home # resultoracle64-1.8.0.181 added
1.8.0.181 added
1.8 added
$ jenv add /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home# resultoracle64-10.0.2 added
10.0.2 added
10.0 added

ตรวจสอบด้วย jenv version อีกครั้ง

$ jenv versions
* system (set by /Users/chakkapanr/.jenv/version)
1.8
1.8.0.181
10.0
10.0.2
oracle64-1.8.0.181
oracle64-10.0.2

เซ็ตอัพเสร็จแล้ว ขั้นต่อก็เลือกเปลี่ยน JDK เวอร์ชันได้ตลอดเวลาด้วยความง่ายดายแล้ว

How to switch version

jenv นำเสนอวิธีมาให้ 3 วิธี

1) เปลี่ยน global setting

เป็นการเซ็ต JDK version ของทั้งเครื่อง — java จะใช้เวอร์ชันนี้ (ถ้า directory นั้น หรือ shell นั้นไม่ได้ override global setting ไว้)

$ jenv global 1.8

ตรวจสอบ

$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
$ jenv versionssystem
* 1.8 (set by /Users/chakkapanr/.jenv/version)
1.8.0.181
10.0
10.0.2
oracle64-1.8.0.181
oracle64-10.0.2

บันทัด * เป็นการบอกว่า ไฟล์ที่ระบุ global setting ว่าใช้ version อะไรอยู่ที่นั่น

2) เปลี่ยน local setting (per directory)

เป็นการเซ็ต JDK version ใน ไดเร็คโทรี่นั้นเท่านั้น

$ jenv local 10.0

ตรวจสอบ

$ java -versionjava version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)
$ jenv versionssystem 1.8
1.8.0.181
* 10.0 (set by /Users/chakkapanr/.java-version)
10.0.2
oracle64-1.8.0.181
oracle64-10.0.2

บันทัด * เป็นการบอกว่า ไฟล์ที่ระบุ local setting ว่าใช้ version อะไรอยู่ที่นั่น

ข้อควรระวัง: local setting จะทับ global setting เสมอ ที่กำลังทำงานแล้วคาดหวังว่าจะใช้ global setting แต่ปรากฏว่าไม่ได้เวอร์ชั่นที่เช็คไว้ ให้ลองรันคำสั่ง jenv versions ดู เพื่อเช็คว่าโฟลเดอร์ปัจจุบันโดนทับด้วย local setting หรือเปล่า

3) เปลี่ยน เฉพาะ shell ปัจจุบัน

เป็นการเซ็ต JDK version ใน shell ปัจจุบันเท่านั้น

$ jenv shell 1.8

ตรวจสอบ

$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
$ jenv versionssystem
* 1.8 (set by JENV_VERSION environment variable)
1.8.0.181
10.0
10.0.2
oracle64-1.8.0.181
oracle64-10.0.2

บันทัด * เป็นการบอกว่า ไฟล์ที่ระบุ shell setting ว่าใช้ version อะไรอยู่ที่ JENV_VERSION variable ซึ่งค่านี้จะหายไปเมื่อปิด shell ปัจจุบันนี้

happy coding :)

Photo by Steve Halama / Unsplash

Originally published at buggy.birdbyrd.com on August 30, 2018.

--

--