java—检测jdk是否已将模块系统给定其文件系统路径的健壮且高性能的方法?

8i9zcol2  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(686)

我有一个启动java程序的脚本,允许用户通过环境变量指定要使用的java安装路径。
我希望该脚本提供java模块系统参数(特别是 --add-opens )当目标jdk拥有模块系统(jpms,或“jigsaw”)时,如果没有,则忽略它们(如果没有忽略它们,启动将失败,因为jdk8抱怨无法识别的参数)。现在它忽略了它们,这会导致jdk9+上出现不需要的警告(是的,我也在研究修复根本原因)。
我可以实现这个。最健壮的方法可能是首先调用底层脚本中的java程序,该程序检测到模块系统并将其结果发送到标准输出(或者进程退出状态,可能);然后,调用脚本可以检查该输出,以了解底层jdk是否启用了jpms。
我还可以解析 java -version 但我不确定这个字符串的格式能保证什么。
我希望有一种方法(1)健壮,并且(2)性能好——可能检查安装中是否存在特定的文件,或者从调用脚本中扫描特定的jar文件,等等。
任何一个jpmsMaven都有一个强大的启发式算法?

vvppvyoh

vvppvyoh1#

java类文件格式对于所有java版本都是相同的,并且包含版本号。只需读取一个相关 .class 文件夹。
例如,下面powershell命令输出的最后一行是版本号。

Get-Content -Path "Key.class" -TotalCount 8 -Encoding Byte

输出为

202
254
186
190
0
0
0
52

52是版本号,表示文件 Key.class 是用jdk8编译的。

llew8vvj

llew8vvj2#

自9以来的每个java版本都包含模块系统。
Java9及更高版本的每个openjdk派生实现(包括oracle的商业jdk构建)都支持 --version 期权;早期版本只支持 -version (单破折号)选项。因此,一个快速而肮脏的方式来检查9日及以后将是 if $JAVA_HOME/bin/java --version >&/dev/null; then ... .

相关问题