Как определить, доступен ли 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, но, вероятно, не является частью какой-либо официальной спецификации.