java - ¿Cómo saber si JDK está disponible desde JVM?
liferay (2)
Nota: Todas las preguntas similares responden esto desde la perspectiva del shell (por ejemplo, ¿está disponible
javac
?
java -version
o
which java
).
Estoy buscando explícitamente la
perspectiva de la
JVM
actualmente en ejecución
.
Hay programas que requieren ejecutarse desde un JRE de JDK, no "solo" un JRE. Me pregunto si hay una manera simple de averiguar en qué se ejecuta mi programa actualmente en ejecución .
Estoy buscando una forma genérica de resolver esto, en lugar de un análisis del programa en cuestión y duplicar su uso de las funciones de JDK.
Es por eso que preferiría no ejecutar un proceso externo de prueba si
javac
está en el camino, si es posible.
Estoy buscando un código que se
ejecute
dentro de un JDK, pero que
falle
dentro de un JRE.
Podría ser
Class.forName
con una clase que solo está disponible en un JDK.
Podría ser una propiedad del sistema.
O algo más.
Si tengo que ejecutar un proceso externo con javac: que así sea. Pero preferiría algo más simple y genérico.
Aclaración desde el fondo en los comentarios:
De vez en cuando me encuentro con este problema con Liferay, que requiere ejecutarse desde un JRE de JDK. Estaba entreteniendo la idea de implementar otro complemento que proporcione un mensaje de error fácil de usar si se ejecuta sin un JDK disponible. Evito analizar qué código es el que falla en un entorno solo de JRE, y no quiero modificar el código de Liferay, sino agregar mi propio complemento para hacer el análisis y advertir.
Class.forName("com.sun.tools.javac.Main");
Si no hay excepción, es un JDK.
Funciona con los JDK actuales, pero probablemente no sea parte de ninguna especificación oficial.
javax.tools.ToolProvider.getSystemJavaCompiler()
devolverá un
null
si no hay un compilador disponible, y un
JavaCompiler
si lo está.
Técnicamente solo te dice si el compilador está disponible, por supuesto, pero eso en la mayoría de los escenarios implicará la existencia del JDK.