Comment trouver quels pots et dans quel ordre sont chargés par un chargeur de classe?

Je n’ai pas trouvé de réponse claire à cette question ailleurs, alors je vais essayer ici:

Existe-t-il un moyen (programmatique ou autre) pour obtenir une liste des fichiers JAR / classes chargés par un chargeur de classe d’application dans l’ordre précis où ils ont été chargés? Par Application Classloader, j’entends le chargeur de classe qui charge une application EAR dans un serveur d’applications (WLS, WAS, JBoss …), mais évidemment, cela s’applique à tout chargeur de classes.

Donc, pour généraliser, ce que je voudrais savoir, c’est la liste et l’ordre des fichiers JAR chargés par un chargeur de classes spécifié. Pas des classes individuelles, c’est assez facile à trouver en appelant classloader.getPackages (), mais une liste des fichiers JAR qui ont été chargés par ce chargeur de classes.

La réponse courte est non. Les chargeurs de classe ne sont pas tenus d’exposer leur logique de recherche.

Cependant, si votre instance de classloader se trouve être URLClassLoader ou une sous-classe, vous avez access à la liste des répertoires / jars, via la méthode getURLs() . Par la doc pour cette classe, ces URL seront recherchées dans l’ordre.

En pratique, si vous essayez de savoir d’où une classe est chargée, la réponse de Steve est probablement plus utile.

Avez-vous essayé d’utiliser l’option JVM -verbose:class . Il affiche tous les fichiers et classes JAR chargés.

Exemple:

 [Opened C:\Program Files\JDK160~1\jre\lib\rt.jar] [Loaded java.lang.Object from C:\Program Files\JDK160~1\jre\lib\rt.jar] 

Parcourez le domaine de protection de la classe (combinaison emplacement / certificate). Par exemple, pour PDFParser.class, vous obtenez comme ça …

 PDFParser.class.getProtectionDomain().getCodeSource().getLocation().toSsortingng() 

S’il est chargé depuis les classes jre ou depuis les répertoires endossés, il lancera une exception car ces classes se chargent sans protection …

Vous pouvez également utiliser cet extrait de code. Le résultat est un fichier constitué de fichiers jar associés à un class-loader et de fichiers de classe chargés par les chargeurs de classes d’un object (chaîne de chargeurs de classes, y compris ses parents jusqu’à class-loader). Les chargeurs de classe sont séparés par des écanvass.

 Object obj = this; ClassLoader classLoader = obj.getClass().getClassLoader(); File file = new File("classlodersClassesJars.txt"); if(file.exists()) { file.delete(); } if(classLoader != null) { // to escape from system classes that are loaded by bootstrap class-loader such as Ssortingng. do { try { Class clClass = classLoader.getClass(); while(clClass != ClassLoader.class){ clClass = clClass.getSuperclass(); } java.lang.reflect.Field domainField = clClass.getDeclaredField("domains"); java.lang.reflect.Field classesField = clClass.getDeclaredField("classes"); domainField.setAccessible(true); classesField.setAccessible(true); HashSet domains = (HashSet) domainField.get(classLoader); Vector classes = (Vector) classesField.get(classLoader); FileOutputStream fos = new FileOutputStream("classlodersClassesJars.txt", true); fos.write(("\n******************** " + classLoader.toSsortingng() + "\n").getBytes()); fos.write(Arrays.toSsortingng(classes.toArray()).getBytes()); Object[] reverseDomains = domains.toArray(); org.apache.commons.lang.ArrayUtils.reverse(reverseDomains); fos.write(Arrays.toSsortingng(reverseDomains).getBytes()); fos.close(); classLoader = classLoader.getParent(); } catch (Exception exception) { exception.printStackTrace(); // TODO } } while (classLoader.getParent() != null); }