Java:Java系统属性,Spring读取配置文件

获取Java的系统属性

一、Spring获取classpath路径

1)Spring在解析配置文件的时候使用System.getProperty(“java.class.path”)获取所有classpath路径,获取到的是一个字符串。
2)然后使用System.getProperty(“path.separator”)获取路径分隔符,根据路径分隔符将字符串拆分成数组。
3)最后将数组中所有classpath路径下的匹配的配置文件解析到Resource数组中。(扫描配置文件的配置使用classpath*)。

以下是Spring中PathMatchingResourcePatternResolver类中的源码:

protected void addClassPathManifestEntries(Set<Resource> result) {
	try {
		//通过System.getProperty获取当前系统属性。此处获取的是项目中所有Java类的路径,包含jar
		String javaClassPathProperty = System.getProperty("java.class.path");
		//根据路径分隔符(System.getProperty("path.separator")) 将字符串拆分成数组
		for (String path : StringUtils.delimitedListToStringArray(
				javaClassPathProperty, System.getProperty("path.separator"))) {
			try {
				String filePath = new File(path).getAbsolutePath();
				int prefixIndex = filePath.indexOf(':');
				if (prefixIndex == 1) {
					// 更改首字符大小写
					filePath = StringUtils.capitalize(filePath);
				}
				// Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符,这些字符被称为未保留字符
				// 目录文件名可能出现 # ,java.net.URL 不能直接出现 #, 需要替换成 %23
				filePath = StringUtils.replace(filePath, "#", "%23");
				// Build URL that points to the root of the jar file
				UrlResource jarResource = new UrlResource(ResourceUtils.JAR_URL_PREFIX +
						ResourceUtils.FILE_URL_PREFIX + filePath + ResourceUtils.JAR_URL_SEPARATOR);
				// Potentially overlapping with URLClassLoader.getURLs() result above!
				if (!result.contains(jarResource) && !hasDuplicate(filePath, result) && jarResource.exists()) {
					result.add(jarResource);
				}
			}
			catch (MalformedURLException ex) {
				if (logger.isDebugEnabled()) {
					logger.debug("Cannot search for matching files underneath [" + path +
							"] because it cannot be converted to a valid 'jar:' URL: " + ex.getMessage());
				}
			}
		}
	}
	catch (Exception ex) {
		if (logger.isDebugEnabled()) {
			logger.debug("Failed to evaluate 'java.class.path' manifest entries: " + ex);
		}
	}
}

二、获取项目的classpath路径

使用getProperty(String key)方法获取classpath路径,以"java.class.path"为参数。
拿到的字符串是classpath路径,多个路径以分号(;)隔开,其中包括:
1)当前项目的classpath路径,编译之后class和resource的绝对路径。
2)项目所依赖jar包的绝对路径。
在main方法中直接调用即可

public static void main(String[] args) {
	String javaClassPathProperty = System.getProperty("java.class.path");
	System.out.println("javaClassPathProperty = " + javaClassPathProperty);
}

main方法的输出如下(我在spring源码中创建的main方法,对输出结果进行了换行):

E:\studyspace\spring-framework\spring-project\build\classes\java\main,
E:\studyspace\spring-framework\spring-project\build\resources\main,
E:\studyspace\spring-framework\spring-context\build\libs\spring-context-6.0.0-SNAPSHOT.jar,
E:\studyspace\spring-framework\spring-jdbc\build\libs\spring-jdbc-6.0.0-SNAPSHOT.jar,
D:\Gradle\gradle_repository\caches\modules-2\files-2.1\org.aspectj\aspectjweaver\1.9.5\1740dc9140103b796d1722668805fd4cf852780c\aspectjweaver-1.9.5.jar,
D:\Gradle\gradle_repository\caches\modules-2\files-2.1\mysql\mysql-connector-java\5.1.46\9a3e63b387e376364211e96827bc27db8d7a92e9\mysql-connector-java-5.1.46.jar,
D:\Gradle\gradle_repository\caches\modules-2\files-2.1\com.alibaba\druid\1.2.6\c06ad210f56d63ebac26f5508c2ba75e3e4f0ed4\druid-1.2.6.jar,
E:\studyspace\spring-framework\spring-aop\build\libs\spring-aop-6.0.0-SNAPSHOT.jar,
E:\studyspace\spring-framework\spring-tx\build\libs\spring-tx-6.0.0-SNAPSHOT.jar,
E:\studyspace\spring-framework\spring-beans\build\libs\spring-beans-6.0.0-SNAPSHOT.jar,
E:\studyspace\spring-framework\spring-expression\build\libs\spring-expression-6.0.0-SNAPSHOT.jar,
E:\studyspace\spring-framework\spring-core\build\libs\spring-core-6.0.0-SNAPSHOT.jar,
E:\studyspace\spring-framework\spring-core\build\libs\spring-cglib-repack-3.3.0.jar,
E:\studyspace\spring-framework\spring-core\build\libs\spring-objenesis-repack-3.2.jar,
E:\studyspace\spring-framework\spring-jcl\build\libs\spring-jcl-6.0.0-SNAPSHOT.jar

三、获取Java所有的系统属性

可以使用getProperties()方法获取全部的系统属性。
获取到的是Properties对象,该对象是Hashtable的子类。

public static void main(String[] args) {
	Properties properties = System.getProperties();
	Set<Object> objects = properties.keySet();
	for (Object key: objects) {
		System.out.println(key + " = " + properties.getProperty((String) key));
	}
}

main方法的输出如下(我在spring源码中创建的main方法):

java.specification.version = 17
sun.cpu.isalist = amd64
sun.jnu.encoding = GBK
java.class.path = E:\studyspace\spring-framework\spring-project\build\classes\java\main;E:\studyspace\spring-framework\spring-project\build\resources\main;E:\studyspace\spring-framework\spring-context\build\libs\spring-context-6.0.0-SNAPSHOT.jar;E:\studyspace\spring-framework\spring-jdbc\build\libs\spring-jdbc-6.0.0-SNAPSHOT.jar;D:\Gradle\gradle_repository\caches\modules-2\files-2.1\org.aspectj\aspectjweaver\1.9.5\1740dc9140103b796d1722668805fd4cf852780c\aspectjweaver-1.9.5.jar;D:\Gradle\gradle_repository\caches\modules-2\files-2.1\mysql\mysql-connector-java\5.1.46\9a3e63b387e376364211e96827bc27db8d7a92e9\mysql-connector-java-5.1.46.jar;D:\Gradle\gradle_repository\caches\modules-2\files-2.1\com.alibaba\druid\1.2.6\c06ad210f56d63ebac26f5508c2ba75e3e4f0ed4\druid-1.2.6.jar;E:\studyspace\spring-framework\spring-aop\build\libs\spring-aop-6.0.0-SNAPSHOT.jar;E:\studyspace\spring-framework\spring-tx\build\libs\spring-tx-6.0.0-SNAPSHOT.jar;E:\studyspace\spring-framework\spring-beans\build\libs\spring-beans-6.0.0-SNAPSHOT.jar;E:\studyspace\spring-framework\spring-expression\build\libs\spring-expression-6.0.0-SNAPSHOT.jar;E:\studyspace\spring-framework\spring-core\build\libs\spring-core-6.0.0-SNAPSHOT.jar;E:\studyspace\spring-framework\spring-core\build\libs\spring-cglib-repack-3.3.0.jar;E:\studyspace\spring-framework\spring-core\build\libs\spring-objenesis-repack-3.2.jar;E:\studyspace\spring-framework\spring-jcl\build\libs\spring-jcl-6.0.0-SNAPSHOT.jar
java.vm.vendor = Oracle Corporation
sun.arch.data.model = 64
user.variant = 
java.vendor.url = https://java.oracle.com/
java.vm.specification.version = 17
os.name = Windows 10
user.country = CN
sun.java.launcher = SUN_STANDARD
sun.boot.library.path = D:\JDK\jdk-17.0.7\bin
sun.java.command = com.alibaba.project.ProjectApplication
jdk.debug = release
sun.cpu.endian = little
user.home = C:\Users\10024
user.language = zh
java.specification.vendor = Oracle Corporation
java.version.date = 2023-04-18
java.home = D:\JDK\jdk-17.0.7
file.separator = \
java.vm.compressedOopsMode = Zero based
// 换行符表示,直接打印了一个空白行
line.separator = 

java.vm.specification.vendor = Oracle Corporation
java.specification.name = Java Platform API Specification
user.script = 
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
java.runtime.version = 17.0.7+8-LTS-224
user.name = 10024
path.separator = ;
os.version = 10.0
java.runtime.name = Java(TM) SE Runtime Environment
file.encoding = UTF-8
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
java.vendor.url.bug = https://bugreport.java.com/bugreport/
java.io.tmpdir = C:\Users\10024\AppData\Local\Temp\
java.version = 17.0.7
user.dir = E:\studyspace\spring-framework
os.arch = amd64
java.vm.specification.name = Java Virtual Machine Specification
sun.os.patch.level = 
native.encoding = GBK
java.library.path = D:\JDK\jdk-17.0.7\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;D:\Git\Git\cmd;D:\Gradle\gradle-7.2\bin;D:\JDK\jdk-17.0.7\bin;D:\MySQL\mysql-8.0.32-winx64\bin;C:\Users\10024\AppData\Local\Microsoft\WindowsApps;;.
java.vm.info = mixed mode, sharing
java.vendor = Oracle Corporation
java.vm.version = 17.0.7+8-LTS-224
sun.io.unicode.encoding = UnicodeLittle
java.class.version = 61.0

Java中getProperties()方法源码如下:

public static Properties getProperties() {
    @SuppressWarnings("removal")
    SecurityManager sm = getSecurityManager();
    if (sm != null) {
        sm.checkPropertiesAccess();
    }
    return props;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值