SpringBoot中System.getProperty(“java.class.path”)返回的是SpringBoot jar, 而不是在外部化部署中返回的加载的jar集合.
如果想在运行时查询系统依赖了哪些jar包,可以通过如下方法获取jar位置URL,
但如果是jdk17则不再是URLClassLoader
, 可以判断环境和ClassLoader
类型, 如果是JDK17则通过反射jdk.internal.loader.BuiltinClassLoader.ucp
获取
/**
* 按照被加载的顺序返回所有被加载的jar的url,在SpringBoot jar中同样有效
*/
public static URL[] getAllJarUrl() {
ClassLoader classLoader = ClassUtils.getDefaultClassLoader();
while (classLoader instanceof URLClassLoader) {
URL[] urLs = ((URLClassLoader) classLoader).getURLs();
if (urLs != null && urLs.length > 0) {
return urLs;
}
classLoader = classLoader.getParent();
}
return new URL[0];
}
参考官方文档 https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html