Browse Source

support env

Looly 6 years ago
parent
commit
a965845dcc

+ 1 - 0
CHANGELOG.md

@@ -6,6 +6,7 @@
 ## 5.0.4
 
 ### 新特性
+* 【setting】    增加System.getenv变量替换支持
 ### Bug修复
 
 -------------------------------------------------------------------------------------------------------------

+ 5 - 0
hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java

@@ -220,6 +220,11 @@ public class SettingLoader {
 				if (null == varValue) {
 					varValue = System.getProperty(key);
 				}
+				// 环境变量中查找
+				if (null == varValue) {
+					varValue = System.getenv(key);
+				}
+
 				if (null != varValue) {
 					// 替换标识
 					value = value.replace(var, varValue);

+ 149 - 87
hutool-system/src/main/java/cn/hutool/system/SystemUtil.java

@@ -21,116 +21,190 @@ import cn.hutool.core.util.StrUtil;
 
 /**
  * Java的System类封装工具类。<br>
- * http://blog.csdn.net/zhongweijian/article/details/7619383
- * 
- * @author Looly
+ * 参考:http://blog.csdn.net/zhongweijian/article/details/7619383
  *
+ * @author Looly
  */
 public class SystemUtil {
 
 	// ----- Java运行时环境信息 -----/
-	/** Java 运行时环境规范名称的KEY */
+	/**
+	 * Java 运行时环境规范名称的KEY
+	 */
 	public final static String SPECIFICATION_NAME = SystemPropsKeys.SPECIFICATION_NAME;
-	/** Java 运行时环境版本的KEY */
+	/**
+	 * Java 运行时环境版本的KEY
+	 */
 	public final static String VERSION = SystemPropsKeys.VERSION;
-	/** Java 运行时环境规范版本的KEY */
+	/**
+	 * Java 运行时环境规范版本的KEY
+	 */
 	public final static String SPECIFICATION_VERSION = SystemPropsKeys.SPECIFICATION_VERSION;
-	/** Java 运行时环境供应商的KEY */
+	/**
+	 * Java 运行时环境供应商的KEY
+	 */
 	public final static String VENDOR = SystemPropsKeys.VENDOR;
-	/** Java 运行时环境规范供应商的KEY */
+	/**
+	 * Java 运行时环境规范供应商的KEY
+	 */
 	public final static String SPECIFICATION_VENDOR = SystemPropsKeys.SPECIFICATION_VENDOR;
-	/** Java 供应商的 URL的KEY */
+	/**
+	 * Java 供应商的 URL的KEY
+	 */
 	public final static String VENDOR_URL = SystemPropsKeys.VENDOR_URL;
-	/** Java 安装目录的KEY */
+	/**
+	 * Java 安装目录的KEY
+	 */
 	public final static String HOME = SystemPropsKeys.HOME;
-	/** 加载库时搜索的路径列表的KEY */
+	/**
+	 * 加载库时搜索的路径列表的KEY
+	 */
 	public final static String LIBRARY_PATH = SystemPropsKeys.LIBRARY_PATH;
-	/** 默认的临时文件路径的KEY */
+	/**
+	 * 默认的临时文件路径的KEY
+	 */
 	public final static String TMPDIR = SystemPropsKeys.TMPDIR;
-	/** 要使用的 JIT 编译器的名称的KEY */
+	/**
+	 * 要使用的 JIT 编译器的名称的KEY
+	 */
 	public final static String COMPILER = SystemPropsKeys.COMPILER;
-	/** 一个或多个扩展目录的路径的KEY */
+	/**
+	 * 一个或多个扩展目录的路径的KEY
+	 */
 	public final static String EXT_DIRS = SystemPropsKeys.EXT_DIRS;
 
 	// ----- Java虚拟机信息 -----/
-	/** Java 虚拟机实现名称的KEY */
+	/**
+	 * Java 虚拟机实现名称的KEY
+	 */
 	public final static String VM_NAME = SystemPropsKeys.VM_NAME;
-	/** Java 虚拟机规范名称的KEY */
+	/**
+	 * Java 虚拟机规范名称的KEY
+	 */
 	public final static String VM_SPECIFICATION_NAME = SystemPropsKeys.VM_SPECIFICATION_NAME;
-	/** Java 虚拟机实现版本的KEY */
+	/**
+	 * Java 虚拟机实现版本的KEY
+	 */
 	public final static String VM_VERSION = SystemPropsKeys.VM_VERSION;
-	/** Java 虚拟机规范版本的KEY */
+	/**
+	 * Java 虚拟机规范版本的KEY
+	 */
 	public final static String VM_SPECIFICATION_VERSION = SystemPropsKeys.VM_SPECIFICATION_VERSION;
-	/** Java 虚拟机实现供应商的KEY */
+	/**
+	 * Java 虚拟机实现供应商的KEY
+	 */
 	public final static String VM_VENDOR = SystemPropsKeys.VM_VENDOR;
-	/** Java 虚拟机规范供应商的KEY */
+	/**
+	 * Java 虚拟机规范供应商的KEY
+	 */
 	public final static String VM_SPECIFICATION_VENDOR = SystemPropsKeys.VM_SPECIFICATION_VENDOR;
 
 	// ----- Java类信息 -----/
-	/** Java 类格式版本号的KEY */
+	/**
+	 * Java 类格式版本号的KEY
+	 */
 	public final static String CLASS_VERSION = SystemPropsKeys.CLASS_VERSION;
-	/** Java 类路径的KEY */
+	/**
+	 * Java 类路径的KEY
+	 */
 	public final static String CLASS_PATH = SystemPropsKeys.CLASS_PATH;
 
 	// ----- OS信息 -----/
-	/** 操作系统的名称的KEY */
+	/**
+	 * 操作系统的名称的KEY
+	 */
 	public final static String OS_NAME = SystemPropsKeys.OS_NAME;
-	/** 操作系统的架构的KEY */
+	/**
+	 * 操作系统的架构的KEY
+	 */
 	public final static String OS_ARCH = SystemPropsKeys.OS_ARCH;
-	/** 操作系统的版本的KEY */
+	/**
+	 * 操作系统的版本的KEY
+	 */
 	public final static String OS_VERSION = SystemPropsKeys.OS_VERSION;
-	/** 文件分隔符(在 UNIX 系统中是“/”)的KEY */
+	/**
+	 * 文件分隔符(在 UNIX 系统中是“/”)的KEY
+	 */
 	public final static String FILE_SEPARATOR = SystemPropsKeys.FILE_SEPARATOR;
-	/** 路径分隔符(在 UNIX 系统中是“:”)的KEY */
+	/**
+	 * 路径分隔符(在 UNIX 系统中是“:”)的KEY
+	 */
 	public final static String PATH_SEPARATOR = SystemPropsKeys.PATH_SEPARATOR;
-	/** 行分隔符(在 UNIX 系统中是“\n”)的KEY */
+	/**
+	 * 行分隔符(在 UNIX 系统中是“\n”)的KEY
+	 */
 	public final static String LINE_SEPARATOR = SystemPropsKeys.LINE_SEPARATOR;
 
 	// ----- 用户信息 -----/
-	/** 用户的账户名称的KEY */
+	/**
+	 * 用户的账户名称的KEY
+	 */
 	public final static String USER_NAME = SystemPropsKeys.USER_NAME;
-	/** 用户的主目录的KEY */
+	/**
+	 * 用户的主目录的KEY
+	 */
 	public final static String USER_HOME = SystemPropsKeys.USER_HOME;
-	/** 用户的当前工作目录的KEY */
+	/**
+	 * 用户的当前工作目录的KEY
+	 */
 	public final static String USER_DIR = SystemPropsKeys.USER_DIR;
 
 	// ----------------------------------------------------------------------- Basic start
 
 	/**
-	 * 取得系统属性,如果因为Java安全的限制而失败,则将错误打在Log中,然后返回 <code>null</code>。
-	 * 
-	 * @param name 属性名
+	 * 取得系统属性,如果因为Java安全的限制而失败,则将错误打在Log中,然后返回 defaultValue
+	 *
+	 * @param name         属性名
 	 * @param defaultValue 默认值
-	 * @return 属性值或<code>null</code>
+	 * @return 属性值或defaultValue
+	 * @see System#getProperty(String)
+	 * @see System#getenv(String)
 	 */
 	public static String get(String name, String defaultValue) {
 		return StrUtil.nullToDefault(get(name, false), defaultValue);
 	}
 
 	/**
-	 * 取得系统属性,如果因为Java安全的限制而失败,则将错误打在Log中,然后返回 <code>null</code>。
-	 * 
-	 * @param name 属性名
+	 * 取得系统属性,如果因为Java安全的限制而失败,则将错误打在Log中,然后返回 {@code null}
+	 *
+	 * @param name  属性名
 	 * @param quiet 安静模式,不将出错信息打在<code>System.err</code>中
-	 * 
-	 * @return 属性值或<code>null</code>
+	 * @return 属性值或{@code null}
+	 * @see System#getProperty(String)
+	 * @see System#getenv(String)
 	 */
 	public static String get(String name, boolean quiet) {
+		String value = null;
 		try {
-			return System.getProperty(name);
+			value = System.getProperty(name);
 		} catch (SecurityException e) {
 			if (false == quiet) {
-				Console.error("Caught a SecurityException reading the system property '{}'; the SystemUtil property value will default to null.", name);
+				Console.error("Caught a SecurityException reading the system property '{}'; " +
+						"the SystemUtil property value will default to null.", name);
 			}
-			return null;
 		}
+
+		if (null == value) {
+			try {
+				value = System.getenv(name);
+			} catch (SecurityException e) {
+				if (false == quiet) {
+					Console.error("Caught a SecurityException reading the system env '{}'; " +
+							"the SystemUtil env value will default to null.", name);
+				}
+			}
+		}
+
+		return value;
 	}
 
 	/**
-	 * 获得System属性(调用System.getProperty)
-	 * 
+	 * 获得System属性
+	 *
 	 * @param key 键
 	 * @return 属性值
+	 * @see System#getProperty(String)
+	 * @see System#getenv(String)
 	 */
 	public static String get(String key) {
 		return get(key, null);
@@ -138,8 +212,8 @@ public class SystemUtil {
 
 	/**
 	 * 获得boolean类型值
-	 * 
-	 * @param key 键
+	 *
+	 * @param key          
 	 * @param defaultValue 默认值
 	 * @return 值
 	 */
@@ -154,21 +228,13 @@ public class SystemUtil {
 			return true;
 		}
 
-		if ("true".equals(value) || "yes".equals(value) || "1".equals(value)) {
-			return true;
-		}
-
-		if ("false".equals(value) || "no".equals(value) || "0".equals(value)) {
-			return false;
-		}
-
-		return defaultValue;
+		return Convert.toBool(value, defaultValue);
 	}
 
 	/**
 	 * 获得int类型值
-	 * 
-	 * @param key 键
+	 *
+	 * @param key          键
 	 * @param defaultValue 默认值
 	 * @return 值
 	 */
@@ -178,8 +244,8 @@ public class SystemUtil {
 
 	/**
 	 * 获得long类型值
-	 * 
-	 * @param key 键
+	 *
+	 * @param key          
 	 * @param defaultValue 默认值
 	 * @return 值
 	 */
@@ -196,7 +262,7 @@ public class SystemUtil {
 
 	/**
 	 * 获取当前进程 PID
-	 * 
+	 *
 	 * @return 当前进程 ID
 	 */
 	public static long getCurrentPID() {
@@ -266,34 +332,29 @@ public class SystemUtil {
 	}
 
 	/**
-	 * Returns a list of {@link MemoryPoolMXBean} objects in the Java virtual machine. <br>
+	 * 获取Java虚拟机中的{@link MemoryPoolMXBean}列表<br>
 	 * The Java virtual machine can have one or more memory pools. It may add or remove memory pools during execution.
 	 *
 	 * @return a list of <tt>MemoryPoolMXBean</tt> objects.
-	 *
 	 */
 	public static List<MemoryPoolMXBean> getMemoryPoolMXBeans() {
 		return ManagementFactory.getMemoryPoolMXBeans();
 	}
 
 	/**
-	 * Returns a list of {@link MemoryManagerMXBean} objects in the Java virtual machine. <br>
+	 * 获取Java虚拟机中的{@link MemoryManagerMXBean}列表<br>
 	 * The Java virtual machine can have one or more memory managers. It may add or remove memory managers during execution.
 	 *
 	 * @return a list of <tt>MemoryManagerMXBean</tt> objects.
-	 *
 	 */
 	public static List<MemoryManagerMXBean> getMemoryManagerMXBeans() {
 		return ManagementFactory.getMemoryManagerMXBeans();
 	}
 
 	/**
-	 * Returns a list of {@link GarbageCollectorMXBean} objects in the Java virtual machine. <br>
-	 * The Java virtual machine may have one or more <tt>GarbageCollectorMXBean</tt> objects. <br>
-	 * It may add or remove <tt>GarbageCollectorMXBean</tt> during execution.
-	 *
-	 * @return a list of <tt>GarbageCollectorMXBean</tt> objects.
+	 * 获取Java虚拟机中的{@link GarbageCollectorMXBean}列表
 	 *
+	 * @return {@link GarbageCollectorMXBean}列表
 	 */
 	public static List<GarbageCollectorMXBean> getGarbageCollectorMXBeans() {
 		return ManagementFactory.getGarbageCollectorMXBeans();
@@ -301,7 +362,7 @@ public class SystemUtil {
 
 	/**
 	 * 取得Java Virtual Machine Specification的信息。
-	 * 
+	 *
 	 * @return <code>JvmSpecInfo</code>对象
 	 */
 	public static JvmSpecInfo getJvmSpecInfo() {
@@ -310,7 +371,7 @@ public class SystemUtil {
 
 	/**
 	 * 取得Java Virtual Machine Implementation的信息。
-	 * 
+	 *
 	 * @return <code>JvmInfo</code>对象
 	 */
 	public static JvmInfo getJvmInfo() {
@@ -319,7 +380,7 @@ public class SystemUtil {
 
 	/**
 	 * 取得Java Specification的信息。
-	 * 
+	 *
 	 * @return <code>JavaSpecInfo</code>对象
 	 */
 	public static JavaSpecInfo getJavaSpecInfo() {
@@ -328,7 +389,7 @@ public class SystemUtil {
 
 	/**
 	 * 取得Java Implementation的信息。
-	 * 
+	 *
 	 * @return <code>JavaInfo</code>对象
 	 */
 	public static JavaInfo getJavaInfo() {
@@ -337,7 +398,7 @@ public class SystemUtil {
 
 	/**
 	 * 取得当前运行的JRE的信息。
-	 * 
+	 *
 	 * @return <code>JreInfo</code>对象
 	 */
 	public static JavaRuntimeInfo getJavaRuntimeInfo() {
@@ -346,7 +407,7 @@ public class SystemUtil {
 
 	/**
 	 * 取得OS的信息。
-	 * 
+	 *
 	 * @return <code>OsInfo</code>对象
 	 */
 	public static OsInfo getOsInfo() {
@@ -355,7 +416,7 @@ public class SystemUtil {
 
 	/**
 	 * 取得User的信息。
-	 * 
+	 *
 	 * @return <code>UserInfo</code>对象
 	 */
 	public static UserInfo getUserInfo() {
@@ -364,7 +425,7 @@ public class SystemUtil {
 
 	/**
 	 * 取得Host的信息。
-	 * 
+	 *
 	 * @return <code>HostInfo</code>对象
 	 */
 	public static HostInfo getHostInfo() {
@@ -373,7 +434,7 @@ public class SystemUtil {
 
 	/**
 	 * 取得Runtime的信息。
-	 * 
+	 *
 	 * @return <code>RuntimeInfo</code>对象
 	 */
 	public static RuntimeInfo getRuntimeInfo() {
@@ -382,7 +443,7 @@ public class SystemUtil {
 
 	/**
 	 * 获取JVM中内存总大小
-	 * 
+	 *
 	 * @return 内存总大小
 	 * @since 4.5.4
 	 */
@@ -392,7 +453,7 @@ public class SystemUtil {
 
 	/**
 	 * 获取JVM中内存剩余大小
-	 * 
+	 *
 	 * @return 内存剩余大小
 	 * @since 4.5.4
 	 */
@@ -402,7 +463,7 @@ public class SystemUtil {
 
 	/**
 	 * 获取JVM可用的内存总大小
-	 * 
+	 *
 	 * @return JVM可用的内存总大小
 	 * @since 4.5.4
 	 */
@@ -412,18 +473,19 @@ public class SystemUtil {
 
 	/**
 	 * 获取总线程数
-	 * 
+	 *
 	 * @return 总线程数
 	 */
 	public static int getTotalThreadCount() {
 		ThreadGroup parentThread = Thread.currentThread().getThreadGroup();
-		while(null != parentThread.getParent()) {
+		while (null != parentThread.getParent()) {
 			parentThread = parentThread.getParent();
 		}
 		return parentThread.activeCount();
 	}
 
 	// ------------------------------------------------------------------ Dump
+
 	/**
 	 * 将系统信息输出到<code>System.out</code>中。
 	 */
@@ -433,7 +495,7 @@ public class SystemUtil {
 
 	/**
 	 * 将系统信息输出到指定<code>PrintWriter</code>中。
-	 * 
+	 *
 	 * @param out <code>PrintWriter</code>输出流
 	 */
 	public static void dumpSystemInfo(PrintWriter out) {
@@ -461,10 +523,10 @@ public class SystemUtil {
 
 	/**
 	 * 输出到<code>StringBuilder</code>。
-	 * 
+	 *
 	 * @param builder <code>StringBuilder</code>对象
 	 * @param caption 标题
-	 * @param value 值
+	 * @param value   
 	 */
 	protected static void append(StringBuilder builder, String caption, Object value) {
 		builder.append(caption).append(StrUtil.nullToDefault(Convert.toStr(value), "[n/a]")).append("\n");