简体   繁体   English

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

[英]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. 我需要在Java中获取JAVA_HOME和CATALINA_HOME环境变量的值。 I am running a JAR (not WAR) and in System.getProperties() I could find only "java.home" . 我正在运行JAR(不是WAR),而在System.getProperties()我只能找到"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. 我在这里阅读了一些关于它的其他问题,尝试了它们,但是无法使它们工作 - 我得到了不同的例外或者只是因为null值。

I remember doing something similar many years ago using JNA , but it was in the 16-bit era of Windows. 我记得多年前使用JNA做类似的事情,但它是在Windows的16位时代。 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. 我能找到的最新JNA jar是从2011年开始运行的,但是当我在maven中进行构建时,我得到的错误是找不到一些类。

I will continue investigating the JNA direction and will be glad to receive any assistance and/or ideas. 我将继续调查JNA方向,并乐意接受任何帮助和/或想法。 I think that I'm only missing the right Maven dependency . 我认为我只是错过了正确的Maven依赖

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方法有助于获取指定环境变量的值:

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

if a security manager allows access to the environment variable. 如果安全管理器允许访问环境变量。 Otherwise, a SecurityException will be thrown. 否则,将抛出SecurityException

Tomcat home directory or Catalina directory is stored at the Java System Property environment. Tomcat主目录或Catalina目录存储在Java System Property环境中。 If the Java web application is deployed into Tomcat web server, we can get the Tomcat directory with the following command 如果将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"); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM