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

5
我需要在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", "https://dev59.com/InVD5IYBdhLWcg3wKoaH#6287763");}
     */
    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个回答

4

Tomcat主目录或Catalina目录存储在Java系统属性环境中。如果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");


3

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

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

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


1
找到了适用的JNA Maven依赖项:<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform --> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>4.0.0</version> </dependency> - Binyamin Regev
1
System.getenv("CATALINA_HOME"); 对我无效。 - Shekhar Sahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接