【问题标题】:Set java version from a script从脚本设置 java 版本
【发布时间】:2018-03-16 14:42:20
【问题描述】:

我写了一个脚本来改变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 设置环境,source setJavaVersion.sh 7 for jdk7 等等。

当我查看环境变量时:

$ 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/

【问题讨论】:

  • 执行脚本后是否关闭shell?
  • 不,我在源 setJavaVersion.sh 之后测试 JAVA_HOME 和 PATH。
  • 看看update-java-alternatives
  • 不要重新发明轮子。你试过jenv.be 吗?

标签: java linux bash shell


【解决方案1】:

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

: 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来调试你的脚本

【讨论】:

  • 行为与您的解决方案相同,PATH 更新不重复,java jdk 路径位于变量末尾而不是开头。但是“which java”或 java -version 仍然没有改变。这很奇怪,因为当我直接在 shell 中输入导出命令时,即使有重复,它也可以工作。
  • which java 怎么没变?请在脚本之前和之后生成which java 的输出。还有$PATH b4 及以后。
  • 好的,我已经用变量输出编辑了我的问题
【解决方案2】:

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

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

就我在您的原始脚本中看到的而言,它应该可以正常工作。

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

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

【讨论】:

    【解决方案3】:

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

    export PATH="$JAVA_HOME:$PATH"
    

    这是解决方案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2012-07-30
      • 2020-04-12
      • 2013-05-08
      • 2021-09-13
      • 2020-11-12
      • 1970-01-01
      相关资源
      最近更新 更多