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 里面的设置生效。

posted @ 2016-03-23 14:51  但行好事-莫问前程  阅读(3166)  评论(0编辑  收藏