如何在Java中获取JAVA_HOME和CATALINA_HOME环境变量?

时间:2016-11-30 11:54:01

标签: java environment-variables jna java-home

我需要在Java中获取JAVA_HOME和CATALINA_HOME环境变量的值。我正在运行JAR(而不是WAR),在System.getProperties()我只能找到"java.home"

我在这里阅读了一些关于它的其他问题,尝试了它们,但是无法使它们起作用 - 我得到了不同的例外或结果只有null值。

我记得多年前使用 JNA 做了类似的事情,但它是在Windows的16位时代。我能找到的最新的 JNA jar是2011年,在intelliJ中运行它,但是当我在maven中构建一个构建时,我得到了关于找不到某些类的错误。

我将继续调查 JNA 方向,并乐意接受任何帮助和/或想法。我认为我只是错过了正确的 Maven依赖

到目前为止,这是我班级的源代码:

//  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);
    }
}

2 个答案:

答案 0 :(得分:3)

有一个System.getenv方法有助于获取指定环境变量的值:

System.getenv("JAVA_HOME");
System.getenv("CATALINA_HOME");

如果安全管理器允许访问环境变量。否则,将抛出SecurityException

答案 1 :(得分:1)

Tomcat的主目录或Catalina目录存储在Java System Property环境中。如果将Java Web应用程序部署到Tomcat Web服务器中,则可以使用以下命令获取Tomcat目录

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");