Comment connaître la provenance d'une classe programmatiquement en Java
Par batmat le mercredi 13 janvier 2010, 18:07 - Technique - Lien permanent
Il est possible par programmation de savoir d'où vient une classe : un jar ? un répertoire ? autre ?
Use case classique : vous pensez (et devez) ne plus avoir les commons-logging nulle part dans votre classpath, parce que vous êtes (intelligemment :-)) passés à SLF4J. Malgré cela, il semble que cette fichue classe soit toujours trouvée, mais vous n'arrivez pas à savoir dans quel jar (ou quel répertoire si vous travaillez directement avec les .class). Résultat, ça vous fout un bazar monstre dans la configuration de vos logs. Certains continuent à apparaitre alors que vous avez demandé à ce qu'ils ne soient pas affichés...
Le code est un peu sioux, alors je le mets ici au cas où ça vous servirait :
System.out.println(MaClasse.class.getProtectionDomain().getCodeSource().getLocation());
MAJ du 15/03/2010
Suite à l'incompréhension ci-dessous, voici quelques exemples pour illustrer ce que fait ce code :
Le code :
System.out.println(org.springframework.mail.MailSender.class.getProtectionDomain().getCodeSource().getLocation());
System.out.println(MyJunitTest.class.getProtectionDomain().getCodeSource().getLocation());
Affiche sous Windows :
file:/C:/m2repository/org/springframework/spring-context-support/2.5.6/spring-context-support-2.5.6.jar file:/C:/tests/myproject-core/target/test-classes/
J'espère que l'utilité est un peu plus claire à présent.


Commentaires
Il ya mieu :
String path = System.getProperty("java.class.path");
String repCourant = path.substring(0, path.lastIndexOf(System.getProperty("file.separator"))+1);
Merci de ta participation, Warend, mais tu es sûr que tu as bien compris ce que je cherchais à faire ? Le code que je propose permet de savoir d'où vient une classe : d'un jar, du disque dur (en mode décompressé), etc.
Ce que tu proposes ne fait pas *du tout* la même chose. Là, tu récupères tout le classpath, moins le dernier jar. Je pense que tu n'as pas prévu le cas où plusieurs jars sont dans le classpath (ce qui est somme toute plutôt courant :-).
Cordialement,
Baptiste
Sur un sujet connexe, il y a depuis peu un très bon outil de JBoss pour analyser les dépendances d'un projet, nommé TattleTale : http://jboss.org/tattletale
Il offre entre autres la fonctionnalité que tu décris dans ce post.
Enfin, il s'intègre en tant que plugin Maven afin d'automatiser l'analyse.
Oui, effectivement, je connaissais. Je l'ai utilisé il n'y a pas une semaine pour diagnostiquer un problème d'une webapp habituellement déployée sur Tomcat, qu'on teste sur JBoss.
Je trouve par contre un peu bizarre les couleurs. Je n'ai pas encore creusé la doc, mais j'avoue que je n'ai par exemple pas compris pourquoi le mot erreur apparaissait parfois en rouge, et parfois pas, etc.
Baptiste
Super, Merci pour cette article!