每个会话切换 Java 版本

Ale*_*tos 7 bash java

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

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

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

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

但这仅适用于我的 Mac,我想要更干净的东西,而不必PATH每次都修改。也许使用chroot

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

gei*_*rha 6

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

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

以下是您可以构建的内容:

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
}
Run Code Online (Sandbox Code Playgroud)