我需要在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);
}
}
答案 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");