Как определить, доступен ли JDK изнутри запущенной JVM?

Примечание. Все похожие вопросы отвечают на это с точки зрения оболочки (например, доступен ли javac? java -version или which java). Я явно просматриваю перспективу работающей в данный момент JVM.

Существуют программы, которые необходимо запускать из JDK JRE, а не "просто" из JRE. Мне интересно, есть ли простой способ узнать, в чем выполняется моя текущая программа?

Я ищу общий способ выяснить это, а не анализ рассматриваемой программы и дублирование ее использования функций JDK. Вот почему я предпочел бы не выполнять тестирование внешнего процесса, если javac находится на пути, если это возможно. Я скорее ищу код, который будет работать в JDK, но не работать в JRE.

Это может быть Class.forName с классом, доступным только в JDK. Это может быть системное свойство. Или что-нибудь еще.

Если мне нужно выполнить внешний процесс с javac: пусть будет так. Но я бы предпочел что-то более простое и общее.

Разъяснение из глубины в комментариях:

Время от времени я сталкиваюсь с этой проблемой с Liferay, которая должна быть запущена из JDK JRE. Меня развлекала мысль просто развернуть еще один плагин, который выдает сообщение об ошибке, удобное для пользователя, если он работает без JDK. Я уклоняюсь от анализа того, какой код является ошибочным в среде только для JRE, и я не хочу изменять код Liferay, вместо этого добавлю свой собственный плагин для анализа и предупреждения.

Ответ 1

javax.tools.ToolProvider.getSystemJavaCompiler() вернет null если компилятор недоступен, и JavaCompiler если он есть.

Технически это просто говорит вам, если компилятор доступен, конечно, но это в большинстве сценариев подразумевает существование JDK.

Ответ 2

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

Если нет никаких исключений, это JDK.

Он работает с текущими JDK, но, вероятно, не является частью какой-либо официальной спецификации.