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

Java 如何判断JDK是否在运行的JVM中可用?,java,jvm,liferay,Java,Jvm,Liferay,注意:所有类似的问题都是从shell的角度回答的(例如,javac可用吗?java-version或哪个java)。我正在明确地寻找当前运行的JVM的透视图 有一些程序需要在JDK的JRE中运行,而不仅仅是在JRE中运行。我想知道是否有一个简单的方法来找出我当前运行的程序是在什么地方执行的 我正在寻找一种通用的方法来解决这个问题,而不是对有问题的程序进行分析并重复使用JDK特性。这就是为什么如果javac在路径上(如果可能的话),我宁愿不执行外部流程测试。我在寻找一些在JDK中运行,但在JRE中

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

有一些程序需要在JDK的JRE中运行,而不仅仅是在JRE中运行。我想知道是否有一个简单的方法来找出我当前运行的程序是在什么地方执行的

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

它可以是
Class.forName
,带有一个仅在JDK中可用的类。它可能是一个系统属性。或者别的什么

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

澄清从评论的深层次:

我经常遇到Liferay的这个问题,它需要在JDK的JRE中运行。我很乐意部署另一个插件,如果在没有JDK的情况下运行,它会提供一条用户友好的错误消息。我不愿分析哪些代码在只支持JRE的环境中失败,我也不想修改Liferay的代码,而是添加自己的插件来进行分析和警告。

Class.forName(“com.sun.tools.javac.Main”)

如果没有例外,那就是JDK


它适用于当前的JDK,但它可能不是任何官方规范的一部分。

javax.tools.ToolProvider.getSystemJavaCompiler()
将返回
null
,如果没有可用的编译器,则返回
JavaCompiler


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

它将始终在JRE上运行。JDK提供了构建Java应用程序的工具,并包含了运行应用程序的JRE。JRE安装有JRE和没有构建工具。考虑关键字:“工具包”是你使用的东西;“环境”是指你生活的环境。您可以在工具包中制作一些东西,然后在环境中运行。由于Java已经变得模块化,JRE和JDK之间的区别已经过时。您必须澄清您需要的功能,然后检查该功能是否存在。如果是编译器,则可以检查编译器API是否存在。但是,如果您不使用该API,但需要一个命令行
javac
工具,那么您必须准确地检查它。您是说,问题是Liferay对环境有一定的要求,但没有提供用户友好的错误消息?然后,你应该向Liferay的开发人员提交一份bug报告,就这样。啊,这可能比我的答案还要好。太棒了,谢谢。这看起来也适用于OpenJDK,因为它们可能不一定会复制com.sun。*当然,这不会告诉您是否存在命令行
javac
命令,也不会告诉您软件是否存在,天真地假设在
jdk
安装中运行
jre
目录(自Java 9以来就不是这种情况),将在当前环境下工作。@Holger:足以快速修复当前的问题。从长远来看,你的评论是正确的:在核心产品中加入更友好的信息。但这是长期的,我相当不耐烦。谢谢——正如你在Michael的回答中所写的,以及在我的评论中所看到的,我可能更愿意接受他的,假设它在任何JDK中都有效,而不仅仅是Oracle的。@OlafKock没问题。我很快就会哭。:-)