title: How to get JAVA_HOME and CATALINA_HOME environment variables in Java?
body: <p>I need to get the values of JAVA_HOME and CATALINA_HOME environment variable in Java. I am running a JAR (not WAR) and in <code>System.getProperties()</code> I could find only <code>"java.home"</code>. </p>
  
  <p>I read some other questions about it here, tried them, but could not make them work - I got different exceptions or just <code>null</code> value as a result. </p>
  
  <p>I remember doing something similar many years ago using <em>JNA</em>, but it was in the 16-bit era of Windows. The latest <em>JNA</em> jar I could find is from 2011, running it in intelliJ works, but when I make a build in maven I get errors about not finding some classes.</p>
  
  <p>I will continue investigating the <em>JNA</em> direction and will be glad to receive any assistance and/or ideas. I think that I'm only missing the right <strong>Maven dependency</strong>.</p>
  
  <p>This is source code for my class so far:</p>
  
  <pre><code>//  C:\devtools\java-external-jars\jna-4.2.2\jna-platform-4.2.2.jar
  
  import com.sun.jna.platform.win32.Advapi32Util;
  import com.sun.jna.platform.win32.WinReg;
  
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.StringWriter;
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  import java.util.HashMap;
  import java.util.Map;
  import java.util.ArrayList;
  import java.util.List;
  import java.util.prefs.Preferences;
  
  public class WinRegistryHelper {
  
      public static final String SYSTEM_ENVIRONMENT_KEY_PATH = "SYSTEM\\ControlSet001\\Control\\Session Manager\\Environment";
  
      public static final int HKEY_CURRENT_USER = 0x80000001;
      public static final int HKEY_LOCAL_MACHINE = 0x80000002;
      public static final int REG_SUCCESS = 0;
      public static final int REG_NOTFOUND = 2;
      public static final int REG_ACCESSDENIED = 5;
  
      private static final int KEY_ALL_ACCESS = 0xf003f;
      private static final int KEY_READ = 0x20019;
      private static final Preferences userRoot = Preferences.userRoot();
      private static final Preferences systemRoot = Preferences.systemRoot();
      private static final Class&lt;? extends Preferences&gt; userClass = userRoot.getClass();
      private static final Method regOpenKey;
      private static final Method regCloseKey;
      private static final Method regQueryValueEx;
      private static final Method regEnumValue;
      private static final Method regQueryInfoKey;
      private static final Method regEnumKeyEx;
      private static final Method regCreateKeyEx;
      private static final Method regSetValueEx;
      private static final Method regDeleteKey;
      private static final Method regDeleteValue;
  
      private WinRegistryHelper() {  }
  
  
      /**
       *
       * {@code String stringValue = Advapi32Util.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "ProductName");}
       */
      public static String registryGetStringValue(WinReg.HKEY root, String keyPath, String keyName) {
          // Read a string
          String stringValue = Advapi32Util.registryGetStringValue(root, keyPath, keyName);
          System.out.printf(keyName + " value is: %s\n", stringValue);
          return stringValue;
      }
  
      /**
       *
       * {@code int timeout = Advapi32Util.registryGetIntValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows", "ShutdownWarningDialogTimeout");}
       */
      public static int registryGetIntValue(WinReg.HKEY root, String keyPath, String keyName) {
          // Read an int (&amp; 0xFFFFFFFFL for large unsigned int)
          int intValue = Advapi32Util.registryGetIntValue(root, keyPath, keyName);
          System.out.printf(keyName + " value is: %d (%d as unsigned long)\n", intValue, intValue &amp; 0xFFFFFFFFL);
          return intValue;
      }
  
      /**
       *
       * {@code int timeout = Advapi32Util.registryGetLongValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows", "ShutdownWarningDialogTimeout");}
       */
      public static long registryGetLongValue(WinReg.HKEY root, String keyPath, String keyName) {
          // Read an int (&amp; 0xFFFFFFFFL for large unsigned int)
          long longValue = Advapi32Util.registryGetLongValue(root, keyPath, keyName);
          System.out.printf(keyName + " value is: %d (%d as unsigned long)\n", longValue, longValue &amp; 0xFFFFFFFFL);
          return longValue;
      }
  
      /**
       *
       * {@code Advapi32Util.registryCreateKeyPath(WinReg.HKEY_CURRENT_USER, "SOFTWARE\\StackOverflow");}
       */
      public static void registryCreateKeyPath(WinReg.HKEY root, String keyPath) {
          // Create a key and write a string
          Advapi32Util.registryCreateKey(root, keyPath);
      }
  
      /**
       * {@code Advapi32Util.registrySetStringValue(WinReg.HKEY_CURRENT_USER, "SOFTWARE\\StackOverflow", "url", "http://stackoverflow.com/a/6287763/277307");}
       */
      public static void registrySetStringValue(WinReg.HKEY root, String keyPath, String keyName, String keyValue) {
          Advapi32Util.registrySetStringValue(root, keyPath, keyName, keyValue);
      }
  
      public static void registrySetIntValue(WinReg.HKEY root, String keyPath, String keyName, int keyValue) {
          Advapi32Util.registrySetIntValue(root, keyPath, keyName, keyValue);
      }
  
      public static void registrySetLongValue(WinReg.HKEY root, String keyPath, String keyName, long keyValue) {
          Advapi32Util.registrySetLongValue(root, keyPath, keyName, keyValue);
      }
  
      /**
       *
       * {@code Advapi32Util.registryDeleteKey(WinReg.HKEY_CURRENT_USER, "SOFTWARE\\StackOverflow");}
       */
      public static void registryDeleteKey(WinReg.HKEY root, String keyPath) {
          // Delete a key
          Advapi32Util.registryDeleteKey(root, keyPath);
      }
  }
  </code></pre>