如何判断 JDK 在 运行 JVM 中是否可用?

How to tell if JDK is available from within running JVM?

注意:所有类似的问题都是从shell的角度回答这个问题(例如javac可用吗?java -versionwhich java)。我正在明确地寻找当前 运行ning JVM 的 观点。

有些程序需要 运行 来自 JDK 的 JRE,而不是 "just" JRE。我想知道是否有一种简单的方法可以找出我的 当前 运行ning 程序 正在执行什么。

我正在寻找一种通用的方法来解决这个问题,而不是分析有问题的程序并复制其对 JDK 功能的使用。这就是为什么如果可能的话,如果 javac 在路径上,我宁愿不执行外部进程测试。我宁愿寻找一些代码,这些代码将 运行 在 JDK 中,但在 JRE 中 失败

它可能是 Class.forName 和 class,只有 JDK 才有。它可能是一个系统 属性。或者其他。

如果我必须 使用 javac 执行外部进程:那就这样吧。但我更喜欢更简单和通用的东西。

来自评论深处的澄清

有时我会 运行 解决 Liferay 的这个问题,这需要 运行 来自 JDK 的 JRE。我正在考虑部署另一个插件,如果 运行 没有 JDK 可用,它会提供用户友好的错误消息。我回避分析哪些代码在纯 JRE 环境中失败,我不想修改 Liferay 的代码,而是添加我自己的插件来进行分析和警告。

Class.forName("com.sun.tools.javac.Main");

如果没有异常就是一个JDK.

它适用于当前的 JDKs,但它可能不属于任何官方规范。

如果没有可用的编译器,

javax.tools.ToolProvider.getSystemJavaCompiler() 将 return null,如果可用,则 JavaCompiler

从技术上讲,它只是告诉您 编译器 是否可用,但在大多数情况下这意味着 JDK.

存在