Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get JAVA_HOME and CATALINA_HOME environment variables in Java?

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);
    }
}
like image 688
Binyamin Regev Avatar asked Nov 30 '16 11:11

Binyamin Regev


2 Answers

Tomcat home directory or Catalina directory is stored at the Java System Property environment. If the Java web application is deployed into Tomcat web server, we can get the Tomcat directory with the following command

System.out.println(System.getProperty("catalina.base"));
System.out.println(System.getProperty("catalina.home"));

//you can store it in string
String caltelinaHome =System.getProperty("catalina.home");
like image 152
Varun Avatar answered Oct 21 '22 23:10

Varun


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.

like image 40
Andrew Tobilko Avatar answered Oct 21 '22 23:10

Andrew Tobilko