Bash命令检查是否安装了Oracle或OpenJDK
1. 概述
OpenJDK 和 Oracle JDK 是业界广泛使用的两个 Java 环境。它们都是高性能且稳定的。但是,它们有一些不同之处 。
因此,有时,我们可能希望快速得到以下问题的答案:“这台机器上运行的是哪个 JDK?”
在本教程中,我们将讨论如何检查当前的 Java 环境是 Oracle JDK 还是 OpenJDK。
2. 问题介绍
正如我们所知,“ java -version ”命令将打印详细的Java 版本信息。因此,例如,如果我们在安装了 Oracle JDK 的机器上运行它:
$ java -version
java version "15.0.2" 2021-01-19
Java(TM) SE Runtime Environment (build 15.0.2+7-27)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)
OpenJDK 也支持相同的命令:
$ java -version
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment (build 17.0.3+3)
OpenJDK 64-Bit Server VM (build 17.0.3+3, mixed mode)
当然,还有其他的 JDK 实现 。我们可以扩展解决方案以适应其他 JDK 供应商。但是,为简单起见,我们将在本教程中仅检查当前 JDK 是否为 OpenJDK。
接下来,我们看看如何在 Linux 命令行中快速获取 JDK 提供者信息。
3. 标准输出和标准误差
当我们看到“ java -version ”的两个输出时,可能已经有了一个想法:在java -version的输出中*grep * “OpenJDK” 。
这个想法很简单。让我们用 OpenJDK 做一个快速测试:
$ java -version | grep -c 'OpenJDK'
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment (build 17.0.3+3)
OpenJDK 64-Bit Server VM (build 17.0.3+3, mixed mode)
0
正如我们在上面的命令中看到的,我们已经将选项*-c*(仅打印匹配行数)传递给grep命令。但是,输出包含原始的“ java -version ”输出。
此外,输出末尾的“ 0 ”意味着我们没有找到任何匹配模式“OpenJDK”的行。这显然不是真的。为什么会这样?
这是因为命令java -version将版本信息写入标准错误 (stderr) 而不是标准输出 (stdout) 。但是,下面的管道 ( | ) 仅读取java命令的标准输出,然后将 grep命令作为标准输入提供。
因此,为了实现我们的想法,我们需要将java命令的 stderr 重定向到 stdout:
$ java -version 2>&1 | grep -c 'OpenJDK'
2
这一次,如上面的输出所示,我们得到了预期的结果:2。
那么,我们当然可以写if语句来检查输出是否大于 0 来判断当前的 JDK 是否是 OpenJDK。
但是,让我们看一个更简单的方法来执行此检查。
4. 使用 带有*-q选项的grep*命令
当我们将*-q选项传递给grep*命令时, ** grep将不输出任何内容。但是,如果给定的模式不匹配,则 grep命令以代码 1 退出。否则,它以退出代码 0 返回**:
$ echo "Kotlin is amazing!" | grep -q 'Java'
$ echo $?
1
$ echo "Java is amazing!" | grep -q 'Java'
$ echo $?
0
我们可以使用退出代码并使用&& 和 ||有条件地连接多个命令 。
让我们通过一个简单的示例来了解运算符:
CMD1 && CMD2 || CMD3
在上面的示例中,首先执行CMD1。只有成功(退出代码 = 0)才会启动CMD2 。否则,将执行CMD3。
因此,我们可以构建一个命令来检查 JDK 提供者是否为 OpenJDK:
java -version 2>&1 | grep -q "OpenJDK" && echo "It is OpenJDK." || echo "It is NOT OpenJDK."
现在,让我们在不同的 Java 环境中测试我们的解决方案,看看它是否按预期工作。首先,让我们针对 OpenJDK 安装运行它:
$ java -version
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment (build 17.0.3+3)
OpenJDK 64-Bit Server VM (build 17.0.3+3, mixed mode)
$ java -version 2>&1 | grep -q "OpenJDK" && echo "It is OpenJDK." || echo "It is NOT OpenJDK."
It is OpenJDK.
正如我们所见,它正确地检测到了 OpenJDK。接下来,让我们使用 Oracle JDK 对其进行测试:
$ java -version
java version "15.0.2" 2021-01-19
Java(TM) SE Runtime Environment (build 15.0.2+7-27)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)
$ java -version 2>&1 | grep -q "OpenJDK" && echo "It is OpenJDK." || echo "It is not OpenJDK."
It is not OpenJDK.
输出显示该命令也适用于这种情况。 如果我们经常使用这个命令,输入长命令就不方便了。我们可以在 .bashrc 文件中创建一个别名 :
alias chkJDK='java -version 2>&1 | grep -q "OpenJDK" && echo "It is OpenJDK." || echo "It is not OpenJDK."'
这样,当我们要查看当前 JDK 的提供者时,只需启动chkJDK别名即可。