每个会话切换 Java 版本

每个会话切换 Java 版本

我的 14.04 机器上安装了 Java7 和 Java8 的组合。

当我想在它们之间切换时,我会执行sudo update-alternatives --config java。但是,以这种方式更改它会更改所有终端上的当前 Java 版本。我只想为当前终端更改它。例如,我想针对在 1.8 中编译的其他代码测试在 1.7 中编写的一些 Java 代码。

另一种选择是做类似的事情

function java_use() {
   export JAVA_HOME=$(/usr/libexec/java_home -v $1)
   export PATH=$JAVA_HOME/bin:$PATH
   java -version
}

但这只适用于我的 Mac,我想要更简洁的东西,而不必PATH每次都进行修改。也许使用chroot?

我如何才能“干净地”更改我的 Java 版本 - 最好仅在已安装的版本之间 - 并且仅适用于当前终端会话?

答案1

如果你看一下/usr/sbin/update-java-alternatives,你会看到它会迭代/usr/lib/jvm/.*.jinfo查找已安装的版本,因此你可以执行相同的操作来检测已安装的版本。

至于不是PATH每次都进行修改,您可以通过使用内置命令(run )PATH告诉 bash 应该为 java 使用哪个二进制文件来完全规避这个问题。hashhelp hash

以下是您可以借鉴的内容:

java_use() {
    local file version versions=()
    for file in /usr/lib/jvm/.*.jinfo; do
        [[ -e $file ]] || continue
        version=${file##*/.} version=${version%.jinfo}
        versions+=("$version")
    done
    if (( ${#versions[@]} == 0 )); then
        printf >&2 'No java installed\n'
        return 1
    fi
    select version in "${versions[@]}"; do
        if [[ -n $version ]]; then
            export JAVA_HOME="/usr/lib/jvm/$version"
            hash -p "$JAVA_HOME/bin/java" java
            break
        fi
    done
    type java
}

相关内容