linux ubuntu下如何安裝並且切換java版本(環境變量設置后不生效)


  最近在做一個dcos(數據中心操作系統)的東西,需要用marathon來做進程管理。遺憾的是0.6版本的marathon在API方面很是缺少,換成了0.15版本之后,運行時提示“Unsupported major.minor version 52.0”,這是提示java版本太低,需要使用java1.8。由於對linux不是很熟,找了一些資料,解決了這個問題。

步驟

  我用的是ubuntu系統,系統自帶1.6和1.7的java包。這個可以在/usr/lib/jvm/目錄下可以看到。接下來進入步驟:

  a.先安裝1.8版本的java,可以到官網下載:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,可以下載tar.tz格式的,也可以下載.bin格式的。找到想要下載的版本之后可以直接下載,也可以右鍵復制鏈接,然后用wget + 網址的方式下載。兩種安裝方法下面稍作介紹

  b.如果是tar.tz格式的,通過命令 “tar zxvf jdk-8u73-linux-x64.tar.gz  -C /usr/lib/jvm/” ,將其解壓到/usr/lib/jvm/下即可,如果是.bin格式的直接運行即可,並且可以跳過變量配置

  c. vi /etc/profile 在文件最末尾添加如下所示內容

    export JAVA_HOME=/usr/lib/jvm/java1.8.0_73

    export JRE_HOME=${JAVA_HOME}/jre

    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

    export PATH={JAVA_HOME}/bin:$PATH

  d.更新默認的jdk

      update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_73/bin/java 300

    update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_73/bin/javac 300

    切換版本

      update-alternatives --config java

    在命令行顯示的內容中選擇需要的jdk版本的序號,2回車

    update-alternatives --config javac javac選擇同上

  e.最后用java -version 和javac -version來檢查一下版本,是不是已經更換了呢。

補充問題:

  遇到一個問題,修改當前用戶的環境變量時可以修改文件/etc/bash_profile 的,但修改該文件有可能會遇到一個問題,那就是遠程變量不生效,這是為什么呢?

原來是登錄賬戶時使用的 su $USERNAME 指令的問題。如果使用該指令登錄自己的賬戶,打開的 shell 是non-login shell,只有 .bashrc 里面的設置被 source,所以 .bash_profile 里面的設置才沒有生效。

  那么什么是non-login shell呢

  什么是 non-login shell?要說清楚這個問題,需要先介紹 shell 的不同模式,為了簡化問題,僅僅針對 Bash shell。shell 分為 login shell 和 non-login shell;也可以分為 interactive shell 和 non-interactive shell.

  interactive shell 指的是 shell 可以輸出,也可以接受輸入;non-interactive shell則無法接受用戶輸入,當運行 script 的時候,實際上就是有一個 non-interactive shell 在執行腳本文件。login shell 一般指的是用戶通過正常的 ssh 登錄到服務器(輸入用戶名和密碼)進入的 shell;如果進入 login shell 以后,再打開 GUI terminal 或者執行 bash 命令,此時打開的是 non-login shell。

  那么為什么non-login shell會導致環境變量丟失呢

  采用 interactive login shell 登錄的時候,首先讀取並執行 /etc/profile 文件中命令,然后再依次順序尋找 ~/.bash_profile,~/.bash_login 和 ~/.profile 文件,然后從第一個存在且可讀取的文件中讀取並執行指令,bash 的 man page 說明如下:

When bash is invoked as an interactive login shell, or as a non-interactive shell with the –login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable

  如果是 interactive non-login shell, 啟動時候,首先讀取執行 /etc/bashrc,然后再讀取執行 ~/.bashrc

  以上兩種情況是最常見的。

  想要在登錄賬號的時候確保 .bash_profile 里面的配置生效,打開的 shell 必須是login shell。su 命令提供了 -l 選項(等同於 -):

-l Simulate a full login. The environment is discarded except for HOME, SHELL, PATH, TERM, and USER. HOME and SHELL are modified as above. USER is set to the target login. PATH is set to /bin:/usr/bin. TERM is imported from your current environment. The invoked shell is the target login’s, and su will change directory to the target login’s home directory.

  所以,登錄時候使用 su - USERNAME 即可保證 .bash_profile 里面的設置生效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM