获取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;
}