代码示意:
/**
* 获取 Class 所在的 jar 包路径
*/
public static String getClassJarResource(Class<?> aClass) {
// 去掉 "class " 前缀,将 . 替换为 /; 添加 .class 后缀
String subUrl = aClass.toString().substring(aClass.isInterface() ? 10 : 6).replace(".", "/");
subUrl += ".class";
URL url = ClassLoader.getSystemResource(subUrl);
if (url != null) {
String urlStr = null;
try {
// 中文解码
urlStr = URLDecoder.decode(url.toString(), "utf-8");
} catch (UnsupportedEncodingException e) {
urlStr = url.toString();
}
if (urlStr.startsWith("jar")) {
// 从 jar:file:/xxx!/subUrl 中截取 xxx
return urlStr.substring(SystemUtil.getOsInfo().isWindows() ? 10 : 9, (urlStr.length() - subUrl.length() - 2));
} else {
// 从 file:/xxx/subUrl 中截取 xxx/
return urlStr.substring(SystemUtil.getOsInfo().isWindows() ? 6 : 5, (urlStr.length() - subUrl.length()));
}
}
return "";
}
关于 java.library.path、classpath、path 以及 java 程序一些依赖相关的理解,以及如何动态指定java依赖参考:https://blog.csdn.net/zhy1379/article/details/122589845
使用示例:
for (File file : new File("..\\spark\\jars").listFiles()) {
ClassUtils.loadJar(file.getAbsolutePath());
}
Class<?> aClass = Class.forName("org.apache.spark.util.collection.BitSet");
// 250628929810266153
System.out.println(ObjectStreamClass.lookup(aClass).getSerialVersionUID());
// .../spark/jars/spark-core_2.12-3.3.0.jar
System.out.println(ClassUtils.getClassJarResource(aClass));