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 System.getProperties()
I could find only "java.home"
.
I read some other questions about it here, tried them, but could not make them work - I got different exceptions or just null
value as a result.
I remember doing something similar many years ago using JNA, but it was in the 16-bit era of Windows. The latest JNA 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.
I will continue investigating the JNA direction and will be glad to receive any assistance and/or ideas. I think that I'm only missing the right Maven dependency.
This is source code for my class so far:
// 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<? extends Preferences> 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 (& 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 & 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 (& 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 & 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);
}
}
There is a System.getenv
method that helps to optain the value of the specified environment variable:
System.getenv("JAVA_HOME");
System.getenv("CATALINA_HOME");
if a security manager allows access to the environment variable. Otherwise, a SecurityException
will be thrown.