Locates
JAVA_HOMEon any platform, and can differentiate between different versions.
npm install @viperproject/locate-java-home
import LocateJavaHome from '@viperproject/locate-java-home'; // or var LocateJavaHome = require('@viperproject/locate-java-home').default; LocateJavaHome(function(error, javaHomes) { javaHomes.forEach(function(homeInfo) { console.log("Found Java " + homeInfo.version + " at " + homeInfo.path); if (homeInfo.isJDK) { console.log("It's a JDK!"); } }); }); // Limit to JDKs for Java 6 and above. LocateJavaHome({ // Uses semver :) Note that Java 6 = Java 1.6, Java 8 = Java 1.8, etc. version: ">=1.6", mustBeJDK: true }, function(error, javaHomes) { // Done. });
I originally wrote this utility for DoppioJVM, which requires access to the Java 8 JDK during build time.
I required the following:
- The ability to check the version of
javainJAVA_HOME. - Verify that
JAVA_HOMEis a JDK and not a JRE. - Detect a Java 8 JDK even if it is not the default version of Java installed.
- Have the above work across Windows, Mac, and Linux.
Since this functionality is likely generally useful, I have decided to release this as a standalone library! Enjoy! :)
The locate-java-home package is a single async function that takes an optional options argument:
LocateJavaHome(options, function(error, javaHomes) {}); LocateJavaHome(function(error, javaHomes) {});
javaHomes is an array of objects that contain information about each JAVA_HOME we found:
{ // Absolute path to JAVA_HOME path: string; // Version of Java in the JAVA_HOME. version: string; // Security number of this version of Java. // Typically, you want a version with the largest security number. // Note: For Java 9 and later, this will always be '0' as this is now // encoded into the version number. See http://openjdk.java.net/jeps/223 // and https://blogs.oracle.com/java-platform-group/a-new-jdk-9-version-string-scheme security: number; // True if this JAVA_HOME is a JDK, false if it is a JRE. isJDK: boolean; // Is this version of Java 64-bit? is64Bit: boolean; // Paths to various executables. executables: { java: string; // JDK only: javac: string; javap: string; } }
locate-java-home surfaces a number of useful options:
{ // Semantic versioning string (e.g. ~1.6, >1.6....) version: string; // Are you specifically looking for a JDK over a JRE? mustBeJDK: boolean; // Are you specifically looking for a JRE over a JDK? mustBeJRE: boolean; // Are you specifically looking for a 64-bit JAVA_HOME? mustBe64Bit: boolean; // Do you want locate-java-home to exit fatally if one of the found JAVA_HOME // locations does not function appropriately? (Mainly useful for debugging.) paranoid: boolean; }
If you install locate-java-home globally, you'll have access to the locate-java-home command
line tool. Currently, it lists all of the JAVA_HOME locations on your system. If there's any
desire to expand it into a full-fledged command line tool that exposes the options of this
library, let me know!