假设我想要获取java.runtime.version
Linux shell 的内容。
我不想打电话java -version
或做任何类型的 grepping / sedding,因为我们过去已经使用过这种方法,但事实证明它很不稳定。
➜ java -version
openjdk version "21" 2023-09-19 LTS
OpenJDK Runtime Environment Temurin-21+35 (build 21+35-LTS)
OpenJDK 64-Bit Server VM Temurin-21+35 (build 21+35-LTS, mixed mode)
例如,这个示例包含太多输出,这些输出在不同版本之间、在不同供应商之间有所差异。
我已经尝试过使用 jshell:
但输出仍然包含我无法禁用的所有命令反馈(至少我不知道:
➜ printf $'System.out.println(java.lang.System.getProperty("java.runtime.version"));\n/exit\n' | jshell -s
-> System.out.println(java.lang.System.getProperty("java.runtime.version"))21+35-LTS
-> %
在此示例中,我想要的仅仅是21+35-LTS
可靠且面向未来的一部分。
我愿意使用 Ubuntu slim 基础镜像或最新的 Java jdk 中提供的工具。
编辑:只要解决方案具有部分面向未来性并且可以与不同的 Java 供应商兼容,我一般不反对 grep/sed。
您可以使用 -XshowSettings 查看所有系统属性,因此类似这样的操作应该有效:
我认为如果不对输出进行一些 grepping/sedding 就无法直接实现,但你可以通过中间文件来实现,如下所示:
jshell &>/dev/null
将确保 jshell 不会产生任何输出;Runtime.version()
可能是 的更直接的替代方案System.getProperty("java.runtime.version")
。您可以尝试使用
--list-modules
。输出模块版本的方式似乎更静态(<module-name>@<version>
)。询问实现 Java 语言 SE 规范的模块的版本,您将获得运行时的版本(例如java.base
)。输出:
添加剪辑
你会得到:
注意:此版本将不包含任何版本信息或供应商添加的内容。例如,在我的系统上
java.runtime.version
是21.0.5+11-Ubuntu-1ubuntu122.04
这需要 java 9 或更高版本,并且自 java 9 以来输出格式似乎没有改变。