如何从堆栈跟踪中获取包数据 [jar 文件名]?

How to get package data [jar file name] from stack trace?

logback library中,他们有办法得到"stack traces with packaging data"(包和包版本)。

示例:

java.lang.Exception: 99 is invalid
  at path.to.MyClass.myFunc(MyClass.java:431) [struts-1.2.9.jar:1.2.9]

如何从堆栈跟踪中的一行中获取“struts-1.2.9.jar”?

Java 或 Scala 中是否有执行此操作的方法?

String getPackageName(String lineInTrace) {
    ...
    return packageName
}

试试这个

for (StackTraceElement el : e.getStackTrace()) {
    Class<?> clazz = Class.forName(el.getClassName());
    String location = clazz.getProtectionDomain().getCodeSource().getLocation().toString();
    System.out.println(location.substring(location.lastIndexOf('/') +1));
}

方括号中的内容是模块名称和版本,在Java 9及以上。您可以使用 StackTraceElement.getModuleName().

获取模块名称

看来如果你不使用模块,使用的是jar文件名而不是模块名。