从脚本中设置java版本

时间:2018-03-16 14:42:21

标签: java linux bash shell

我编写了一个脚本来更改shell的java环境变量:

#!/bin/bash                                                                                                                                                                                                   

#env variables can be changed only if we call the script with source setJavaVersion.sh                                                                                                                         
case $1 in
  6)
     export JAVA_HOME=/atgl/product/java/jdk-1.6.0_43/linux-redhat_x86_64/jdk1.6.0_43/
     export PATH=$JAVA_HOME:$PATH     ;
  ;;
  7)
     export JAVA_HOME=/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51
     export PATH=$JAVA_HOME:$PATH     ;
  ;;
  8)
     export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64/jre/
     export PATH=$JAVA_HOME:$PATH     ;
  ;;
  *)
     error java version can only be 1.6, 1.7 or 1.8
  ;;
esac

要执行它,我输入:

source setJavaVersion.sh 6

用jdk6设置环境,为jdk7设置源setJavaVersion.sh 7。

当我用以下方式查看环境变量时:

$ echo $JAVA_HOME

$ echo $PATH

我看到变量已经很好地更新了。

然而,当我执行命令

java -version

它没有更新。

如果我直接在shell中输入相同的导出命令,java -version将返回更新的结果。

为什么?

修改 我用deathangel908答案更新了我的脚本。 以下是脚本执行前后java和PATH的输出:

$ which java
/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin/java

$ echo $PATH
/CPD/SDNT/tools/bin:/CPD/SDNT/tools/x86_64-pc-unix11.0/bin:/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin:/CPD/SDNT/tools/bin:/CPD/SDNT/tools/x86_64-pc-unix11.0/bin:/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/users/t0059888/bin:/users/t0059888/bin

$ source setJavaVersion 6

$ which java
/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin/java

$ echo $PATH
/CPD/SDNT/tools/bin:/CPD/SDNT/tools/x86_64-pc-unix11.0/bin:/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin:/CPD/SDNT/tools/bin:/CPD/SDNT/tools/x86_64-pc-unix11.0/bin:/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/users/t0059888/bin:/users/t0059888/bin:/atgl/product/java/jdk-1.6.0_43/linux-redhat_x86_64/jdk1.6.0_43/

3 个答案:

答案 0 :(得分:2)

您每次都要添加路径,需要将其删除并重新添加 出口

: export a="$a:3"
$ echo $a # :3
: export a="$a:3"
: echo $a # :3:3

当你执行java时,bash在PATH变量中开始查找,找到第一个匹配项并执行它。

您可以使用which java检查已执行的java命令的实际路径。

因此,要解决您的问题,请记住没有java的路径:

if [ -z ${PATH_SAVE+x} ]; then
 export PATH_SAVE="$PATH"
fi
export PATH="$PATH_SAVE:$JAVA_HOME"

请记住引用变量,以防它们包含特殊符号或空格。

您也可以通过运行echo $PATH

来调试脚本

答案 1 :(得分:1)

根据您在编辑中添加的输出,最后添加了新的PATH。由于Java 7位于PATH的开头,因此在运行which java时会使用Java 7。

当您执行命令时,将使用PATH上找到的第一个匹配项,因此,请尝试在变量的开头添加它(正如您在原始脚本中所做的那样,没有在另一个答案。我的意思是,其他答案建议的是一个好主意,你不应该一遍又一遍地添加相同的路径,但是如果你在PATH变量的末尾添加Java路径,确保在以前的路径中找不到其他java。)

对于我在原始脚本中可以看到的内容,它应该可以正常工作。

尝试在原始脚本的开头添加set -x,然后查看输出。如果您也可以共享该输出,将会很有帮助。

最后,确保Java 6中的二进制文件具有正确的文件权限(确保java是可执行的)。

答案 2 :(得分:0)

我的错误是路径中无法访问java可执行文件。它位于bin文件夹中。我以前做的错了:

export PATH="$JAVA_HOME:$PATH"

这是解决方案:

export PATH="$JAVA_HOME/bin:$PATH"