How to find which jars and in what order are loaded by a classloader?
Solution 1:
Have you tried to use the JVM option -verbose:class
. It displays all loaded JAR files and classes.
Example:
[Opened C:\Program Files\JDK160~1\jre\lib\rt.jar]
[Loaded java.lang.Object from C:\Program Files\JDK160~1\jre\lib\rt.jar]
Solution 2:
The short answer is no. Classloaders are not required to expose their search logic.
However, if your classloader instance happens to be URLClassLoader or a subclass, then you do have access to the list of jars/directories, via the getURLs()
method. Per the doc for this class, those URLs will be searched in order.
In practice, if you're trying to find out where a class is being loaded from, Steve's answer is probably more useful.
Solution 3:
Go through the Protection Domain of the class (the location/certificate combination). e.g. for PDFParser.class you get it like this...
PDFParser.class.getProtectionDomain().getCodeSource().getLocation().toString()
If it is loaded from the jre classes or from endorsed dirs it will throw an exception cos these classes load without protection...