有没有办法在运行时确定从哪里加载特定类?
我们正在使用一个应用程序服务器,它有几个地方放置外部库。现在有一个问题,例如,apache-commons库的几个不同版本放在不同的地方,没有人能真正告诉哪些JAR文件是特定Java类中的源。
有没有办法向类加载器询问它实际上从哪里加载类?具体的JAR文件是什么?
答案 0 :(得分:4)
此信息存储在类ProtectionDomain
中。您可以使用以下命令访问类的保护域:
Object o = new Object();
ProtectionDomain protection = o.getClass().getProtectionDomain();
在此对象中,有一个名为getCodeSource()
的方法,它返回CodeSource
,其中包含来自的位置的网址:
URL loadedFile = protection.getCodeSource().getLocation();
如果类加载器在加载时没有提供此信息,则此URL可以为null。
答案 1 :(得分:1)
我更愿意使用 Verbose类加载来诊断类加载问题。
可以使用-verbose:class
作为JVM参数启用它。这会在加载类时打印出类,包括它们的jar文件名。
与此相关的一些问题: Java verbose class loading
答案 2 :(得分:1)
另一种查找类加载位置的方法(无需操作源)是使用选项-verbose:class
启动Java VM。