2009-07-06 3 views
2

Je charge plusieurs classes différentes de plusieurs .jars différents à partir d'un chargeur de classe personnalisée en Java. Je crée un URLClassLoader personnalisé, y ajoute plusieurs .jars et le passe à un ServiceLoader pour trouver les classes que je veux.Comment puis-je découvrir quelle entrée classpath a fourni une classe?

Ma question est la suivante: étant donné un cours, y a-t-il un moyen de découvrir à partir de quoi il a été chargé?

Répondre

2

Vous pouvez appeler findResource sur Classloader et analyser l'URL à partir de laquelle il provient.

+0

Cela a fonctionné pour moi en utilisant 'Thread.currentThread(). GetContextClassLoader(). FindResource (" MyClass.class ")'. Merci beaucoup! –

3

Régler le paramètre

-verbose:class 

lors de l'exécution de votre pot/classe en utilisant java et il vous donnera un aperçu complet des classes qu'il charge et leur origine, par exemple:

[Opened /usr/java/j2sdk1.4.1/jre/lib/rt.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/sunrsasign.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/jsse.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/jce.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/charsets.jar] 
[Loaded java.lang.Object from /usr/java/j2sdk1.4.1/jre/lib/rt.jar] 
[Loaded java.io.Serializable from /usr/java/j2sdk1.4.1/jre/lib/rt.jar] 

Cela devrait vous donner tout ce que vous devez savoir pour trouver la classe/pot que vous voulez.

+0

Oh, non, je ne veux pas traquer les problèmes. Je veux réellement trouver où le .jar est ainsi je peux faire des choses par rapport à son chemin pendant l'exécution. –

+0

Ok, bien votre problème est l'emplacement du pot, je suppose. Quoi qu'il en soit, cela devrait vous donner le chemin exact du JAR que vous voulez ... – Jon

+0

Je suis désolé si je n'étais pas assez clair. Si j'utilise votre méthode -verbose, cela enverra cette information à la sortie standard, correct? J'en avais besoin dans le code pendant l'exécution pour effectuer des opérations sur les fichiers par rapport à son chemin. Mon code a besoin de cette information, pas moi :) –

5

L'extrait suivant devrait fonctionner:

obj.getClass().getProtectionDomain().getCodeSource().getLocation().toString() 

Notez que vous devez ajouter des contrôles NULL lorsque vous appelez getProtectionDomain ou getCodeSource et gérer de manière appropriée dans un code de production. (Cela dépend du chargeur de classe, de la sécurité, etc.)

Questions connexes