java jvm liferay

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.