Java升級那麼快,多個版本如何靈活切換和管理?

發表於2019-11-18

前言

近兩年,Java 版本升級頻繁,感覺剛剛掌握 Java8,寫本文時,已聽到 java14 的訊息,無論是嚐鮮新特性(Java12 中 Collectors.teeing 超強功能使用),還是由於專案升級/相容需要,我們可能都要面臨管理多個 Java 版本的情

另外 Oracle 自 Java11 開始,更改了使用者協議,任何商用都會收費。在寫本文時,得到訊息「微軟宣佈加入 OpenJDK」,打不過就選擇 OpenJDK。隨便 G 一下,當個故事瞭解就可以

配置單個 Java 環境變數本身沒什麼技術含量可言,但當需要管理多個 Java 版本,重複配置環境變數顯然是非常枯燥的,按照傳統的配置方式我們又不能靈活的切換 Java 版本

那要如何輕鬆管理與使用多個版本 Java?

多版本 Java 管理

顯然我們不是第一個有這種困境的人,我所知道的現有方案有三種:

  1. Jabba
  2. jenv
  3. sdkman

本文主要說明如何通過 sdkman 打破我們面臨的困境,幫助我們靈活配置與使用 Java

sdkman 介紹

SDKMAN 是一個用於在大多數基於 Unix 系統上管理 多個軟體開發工具包 (Java, Groovy, Scala, Kotlin and Ceylon. Ant, Gradle 等) 的並行版本的工具 。

它提供了一個方便的命令列介面 (CLI) 和 API,用於安裝切換刪除列出候選物件。本文主要通過管理 Java 來說明 sdkman 的使用

sdkman 安裝

在類 unix 平臺上安裝 sdkman 非常容易。它可以順利的安裝在Mac OSX、Linux、WLS、Cygwin、Solaris和FreeBSD 上,同時還支援Bash和 ZSH shell。

只需開啟一個新終端機並輸入:

$ curl -s "https://get.sdkman.io" | bash

按照相應的指令提示,完成相應的操作後繼續輸入:

$ source "$HOME/.sdkman/bin/sdkman-init.sh"

到這裡我們就可以驗證 sdk 的安裝版本了:

$ sdk version

sdk version

上圖紅色框標記顯示我當前 sdkman 的版本,每次執行 sdk version 命令時,都會檢查是否會有新版本,如果要更新輸入 y 就可以

有些系統發行版本不包含 zipunzip,如果安裝時遇到相關錯誤,可以輸入如下命令安裝 zipunzip

$ sudo apt-get install zip unzip

從上面的安裝命令上可以看出,sdkman 預設的安裝路徑是在$HOME/.sdkman 下,我們也可以自定義安裝路徑,只需要指定 SDKMAN_DIR 變數值就好了:

$ export SDKMAN_DIR="/usr/local/sdkman" && curl -s "https://get.sdkman.io" | bash

到這裡 sdkman 的安裝就結束了,我們來看看如何使用

sdkman 使用教程

命令列下學習一個新玩意當然是檢視它的 help 命令,輸入:

$ sdkman help

sdk help

感覺上圖按顏色區分內容後,sdkman 的使用說明也就結束了,我們按照上面的圖來詳細說明一下使用教程

sdk list

先來輸入:

$ sdk list

sdk list

綠色的標記就是 sdkman 整合的所有可用的 candidate,通過按回車「enter」按鍵,會看到更多可用 candidate

我們指定 candidate,輸入:

$ sdk list java

sdk list java

從上圖中可以看到所有 java 可用的版本 version,以及標識 indentifier,以及狀態 status,我已經安裝了 java 12 和 11

有了這些資訊做鋪墊,我們可以安裝任意 sdkman 內建的軟體開發包了,繼續以 java 為例

sdk install

回看 sdkman help 命令的輸出,使用 install 命令,我們再安裝一個 Java 最新 13.0.1.j9 版本

從上圖你可以看出,綠色標記的內容是 list 命令結果中的 version 值,但是報錯不可用,輸入indentifier 編號才能正常下載,這裡需要注意

安裝完後,status 就會程式設計 installed 狀態

sdk current

當安裝多個版本的 java 時,我們輸入下面命令獲取當前正在用 candidate 的版本

$ sdk current java

sdk current java

sdk use

瞭解了當前使用版本,如果我們想切換到其他版本, 可以輸入:

$ sdk use java 12.0.2.j9-adpt

注意⚠️: 這裡同樣是指定的 indentifier 的值

sdk default

如果我們想指定某個版本為預設版本,可以輸入:

$ sdk default java jdk1.8.0_162.jdk

注意⚠️: 這裡同樣是指定的 indentifier 的值

sdk uninstall

當我們想解除安裝某個版本可以輸入:

$ sdk uninstall java 12.0.2.j9-adpt

注意⚠️: 這裡同樣是指定的 indentifier 的值

sdk upgrade

如果我們想升級某個 candidate,可以輸入:

$ sdk upgrade java

sdk flush

使用 sdkman 時間變長也會慢慢產生很多快取內容,我們可以輸入
清理廣播訊息:

$ sdk flush broadcast

清理下載的 sdk 二進位制檔案(長時間使用後清理,可以節省出很多空間):

$ sdk flush archives

清理臨時檔案內容:

$ sdk flush temp

到這裡 sdkman 的基本使用就已經介紹完了,其實這些命令都不用急,想不起來的時候執行 sdk help 來臨時檢視一下就好

sdkman 解除安裝

如果我們不喜歡 sdkman 了,我們也可以輕鬆的解除安裝掉它:

$ tar zcvf ~/sdkman-backup_$(date +%F-%kh%M).tar.gz -C ~/ .sdkman
$ rm -rf ~/.sdkman

最後開啟你的 .bashrc、.bash_profile 和/或者 .profile,找到並刪除下面這幾行。

#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
[[ -s "/home/dudette/.sdkman/bin/sdkman-init.sh" ]] && source "/home/dudette/.sdkman/bin/sdkman-init.sh"

我用的 zshrc,找到 .zshrc 檔案刪除掉上面內容即可

到這裡基於 Unix 系統的,有關 sdkman 的安裝,使用及下載都已經介紹完了,可以上手試一試了,相信很多小夥伴用的是 Windows,除了 jenv, sdkman 和 Jabba 都有 windows 使用者的解決方案:

sdkman windows 解決方案

在 sdkman 官網首頁同樣為 windows 使用者提供瞭解決方案,小夥伴們找到如下位置檢視即可

我看了一下過程,也是很簡單,由於手頭沒有 windows 電腦,這個請小夥伴們自行嘗試吧,有問題歡迎留言

靈魂追問

  1. 你現在用的 Java 版本是多少?
  2. 有跟隨新版本嘗試更多新特性嗎?
  3. 你的燈還亮著嗎?
歡迎關注我的公眾號 「日拱一兵」,趣味原創解析Java技術棧問題,將複雜問題簡單化,將抽象問題圖形化落地
如果對我的專題內容感興趣,或搶先看更多內容,歡迎訪問我的部落格 dayarch.top

相關文章